第十周项目三 用二叉树遍历思想解决问题

来源:互联网 发布:迅捷网络官方网站 编辑:程序博客网 时间:2024/06/16 16:09
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*  
  2.  *Copyright (c) 2016,烟台大学计算机学院  
  3.  *All rights reserved.  
  4.  *文件名称:btree.cpp  
  5.  *作者:衣龙川  
  6.  *完成日期:2016年11月10日  
  7.  *版本号:vc++6.0  
  8.  *  
  9.  *问题描述:用二叉树遍历思想解决问题 
  10.  *输入描述:无  
  11.  *程序输出:二叉树个数统计  
  12. */    

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. btree.h  
  2. #ifndef BTREE_H_INCLUDED  
  3. #define BTREE_H_INCLUDED  
  4.  
  5. #define MaxSize 100  
  6. typedef char ElemType;  
  7. typedef struct node  
  8. {  
  9.     ElemType data;              //数据元素  
  10.     struct node *lchild;        //指向左孩子  
  11.     struct node *rchild;        //指向右孩子  
  12. } BTNode;  
  13. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  14. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  15. BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针  
  16. BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针  
  17. int BTNodeDepth(BTNode *b); //求二叉树b的深度  
  18. void DispBTNode(BTNode *b); //以括号表示法输出二叉树  
  19. void DestroyBTNode(BTNode *&b);  //销毁二叉树  
  20.  
  21. #endif // BTREE_H_INCLUDED  
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. btree.cpp  
  2. #include <stdio.h>  
  3. #include <malloc.h>  
  4. #include "btree.h"  
  5.   
  6. void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  
  7. {  
  8.     BTNode *St[MaxSize],*p=NULL;  
  9.     int top=-1,k,j=0;  
  10.     char ch;  
  11.     b=NULL;             //建立的二叉树初始时为空  
  12.     ch=str[j];  
  13.     while (ch!='\0')    //str未扫描完时循环  
  14.     {  
  15.         switch(ch)  
  16.         {  
  17.         case '(':  
  18.             top++;  
  19.             St[top]=p;  
  20.             k=1;  
  21.             break;      //为左节点  
  22.         case ')':  
  23.             top--;  
  24.             break;  
  25.         case ',':  
  26.             k=2;  
  27.             break;                          //为右节点  
  28.         default:  
  29.             p=(BTNode *)malloc(sizeof(BTNode));  
  30.             p->data=ch;  
  31.             p->lchild=p->rchild=NULL;  
  32.             if (b==NULL)                    //p指向二叉树的根节点  
  33.                 b=p;  
  34.             else                            //已建立二叉树根节点  
  35.             {  
  36.                 switch(k)  
  37.                 {  
  38.                 case 1:  
  39.                     St[top]->lchild=p;  
  40.                     break;  
  41.                 case 2:  
  42.                     St[top]->rchild=p;  
  43.                     break;  
  44.                 }  
  45.             }  
  46.         }  
  47.         j++;  
  48.         ch=str[j];  
  49.     }  
  50. }  
  51. BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  
  52. {  
  53.     BTNode *p;  
  54.     if (b==NULL)  
  55.         return NULL;  
  56.     else if (b->data==x)  
  57.         return b;  
  58.     else  
  59.     {  
  60.         p=FindNode(b->lchild,x);  
  61.         if (p!=NULL)  
  62.             return p;  
  63.         else  
  64.             return FindNode(b->rchild,x);  
  65.     }  
  66. }  
  67. BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  
  68. {  
  69.     return p->lchild;  
  70. }  
  71. BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  
  72. {  
  73.     return p->rchild;  
  74. }  
  75. int BTNodeDepth(BTNode *b)  //求二叉树b的深度  
  76. {  
  77.     int lchilddep,rchilddep;  
  78.     if (b==NULL)  
  79.         return(0);                          //空树的高度为0  
  80.     else  
  81.     {  
  82.         lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep  
  83.         rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep  
  84.         return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);  
  85.     }  
  86. }  
  87. void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  
  88. {  
  89.     if (b!=NULL)  
  90.     {  
  91.         printf("%c",b->data);  
  92.         if (b->lchild!=NULL || b->rchild!=NULL)  
  93.         {  
  94.             printf("(");  
  95.             DispBTNode(b->lchild);  
  96.             if (b->rchild!=NULL) printf(",");  
  97.             DispBTNode(b->rchild);  
  98.             printf(")");  
  99.         }  
  100.     }  
  101. }  
  102. void DestroyBTNode(BTNode *&b)   //销毁二叉树  
  103. {  
  104.     if (b!=NULL)  
  105.     {  
  106.         DestroyBTNode(b->lchild);  
  107.         DestroyBTNode(b->rchild);  
  108.         free(b);  
  109.     }  
  110. }  
    main.cpp#include <stdio.h>#include "btree.h"int Nodes(BTNode *b){    if (b==NULL)        return 0;    else        return Nodes(b->lchild)+Nodes(b->rchild)+1;}void DispLeaf(BTNode *b){    if (b!=NULL)    {        if (b->lchild==NULL && b->rchild==NULL)            printf("%c ",b->data);        else        {            DispLeaf(b->lchild);            DispLeaf(b->rchild);        }    }}int LeafNodes(BTNode *b)    //求二叉树b的叶子节点个数{    int num1,num2;    if (b==NULL)        return 0;    else if (b->lchild==NULL && b->rchild==NULL)        return 1;    else    {        num1=LeafNodes(b->lchild);        num2=LeafNodes(b->rchild);        return (num1+num2);    }}int Level(BTNode *b,ElemType x,int h){    int l;    if (b==NULL)        return 0;    else if (b->data==x)        return h;    else    {        l=Level(b->lchild,x,h+1);        if (l==0)            return Level(b->rchild,x,h+1);        else            return l;    }}int Like(BTNode *b1,BTNode *b2){    int like1,like2;    if (b1==NULL && b2==NULL)        return 1;    else if (b1==NULL || b2==NULL)        return 0;    else    {        like1=Like(b1->lchild,b2->lchild);        like2=Like(b1->rchild,b2->rchild);        return (like1 & like2);    }}int main(){    BTNode *b;    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");    printf("二叉树节点个数: %d\n", Nodes(b));    DestroyBTNode(b);    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");    printf("二叉树中所有的叶子节点是: ");    DispLeaf(b);    printf("\n");    DestroyBTNode(b);    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");    printf("二叉树b的叶子节点个数: %d\n",LeafNodes(b));    DestroyBTNode(b);    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");    printf("值为\'K\'的节点在二叉树中出现在第 %d 层上n",Level(b,'K',1));    DestroyBTNode(b);BTNode *b1, *b2, *b3;    CreateBTNode(b1,"B(D,E(H(J,K(L,M(,N)))))");    CreateBTNode(b2,"A(B(D(,G)),C(E,F))");    CreateBTNode(b3,"u(v(w(,x)),y(z,p))");    if(Like(b1, b2))        printf("b1和b2相似\n");    else        printf("b1和b2不相似\n");    if(Like(b2, b3))        printf("b2和b3相似\n");    else        printf("b2和b3不相似\n");    DestroyBTNode(b1);    DestroyBTNode(b2);    DestroyBTNode(b3);    return 0;}
    运行截图:


0 0
原创粉丝点击