第九周项目一__二叉树算法库

来源:互联网 发布:电脑软件 著作权 专利 编辑:程序博客网 时间:2024/06/01 07:36
  1. /* 
  2. 烟台大学计算机学院 
  3.  
  4. 文件名称:main.cpp body.cpp head.cpp 
  5.  
  6. 作者:刘浩 
  7.  
  8. 问题描述:第九周项目一 
  9. 二叉树的链式存储算法库采用程序的多文件组织形式 
  10. */  
  11. #include <stdio.h>  
  12. #include "head.h"  
  13. int main()  
  14. {  
  15.     BTNode *b,*p,*lp,*rp;;  
  16.     printf("  (1)创建二叉树:");  
  17.     CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");  
  18.     printf("\n");  
  19.     printf("  (2)输出二叉树:");  
  20.     DispBTNode(b);  
  21.     printf("\n");  
  22.     printf("  (3)查找H节点:");  
  23.     p=FindNode(b,'H');  
  24.     if (p!=NULL)  
  25.     {  
  26.         lp=LchildNode(p);  
  27.         if (lp!=NULL)  
  28.             printf("左孩子为%c ",lp->data);  
  29.         else  
  30.             printf("无左孩子 ");  
  31.         rp=RchildNode(p);  
  32.         if (rp!=NULL)  
  33.             printf("右孩子为%c",rp->data);  
  34.         else  
  35.             printf("无右孩子 ");  
  36.     }  
  37.     else  
  38.         printf(" 未找到!");  
  39.     printf("\n");  
  40.     printf("  (4)二叉树b的深度:%d\n",BTNodeDepth(b));  
  41.     printf("  (5)释放二叉树b\n");  
  42.     DestroyBTNode(b);  
  43.     return 0;  
  44. }  
[cpp] view plain copy
  1. //头文件  
  2.   
  3.   
  4. #ifndef HEAD_H_INCLUDED  
  5. #define HEAD_H_INCLUDED  
  6. #define MaxSize 100  
  7. typedef char ElemType;  
  8. typedef struct node  
  9. {  
  10.     ElemType data;  
  11.     struct node *lchild;  
  12.     struct node *rchild;  
  13. }BTNode;  
  14. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  15. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  16. BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针  
  17. BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针  
  18. int BTNodeDepth(BTNode *b); //求二叉树b的深度  
  19. void DispBTNode(BTNode *b); //以括号表示法输出二叉树  
  20. void DestroyBTNode(BTNode *&b);  //销毁二叉树  
  21. #endif // HEAD_H_INCLUDED  
[cpp] view plain copy
  1. //body  
  2.   
  3.   
  4. #include "stdio.h"  
  5. #include <malloc.h>  
  6. #include "head.h"  
  7.   
  8. void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  
  9. {  
  10.     BTNode *St[MaxSize],*p=NULL;  
  11.     int top=-1,k,j=0;  
  12.     char ch;  
  13.     b=NULL;             //建立的二叉树初始时为空  
  14.     ch=str[j];  
  15.     while (ch!='\0')    //str未扫描完时循环  
  16.     {  
  17.         switch(ch)  
  18.         {  
  19.         case '(':  
  20.             top++;  
  21.             St[top]=p;  
  22.             k=1;  
  23.             break;      //为左节点  
  24.         case ')':  
  25.             top--;  
  26.             break;  
  27.         case ',':  
  28.             k=2;  
  29.             break;                          //为右节点  
  30.         default:  
  31.             p=(BTNode *)malloc(sizeof(BTNode));  
  32.             p->data=ch;  
  33.             p->lchild=p->rchild=NULL;  
  34.             if (b==NULL)                    //p指向二叉树的根节点  
  35.                 b=p;  
  36.             else                            //已建立二叉树根节点  
  37.             {  
  38.                 switch(k)  
  39.                 {  
  40.                 case 1:  
  41.                     St[top]->lchild=p;  
  42.                     break;  
  43.                 case 2:  
  44.                     St[top]->rchild=p;  
  45.                     break;  
  46.                 }  
  47.             }  
  48.         }  
  49.         j++;  
  50.         ch=str[j];  
  51.     }  
  52. }  
  53.   
  54. BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  
  55. {  
  56.     BTNode *p;  
  57.     if (b==NULL)  
  58.         return NULL;  
  59.     else if (b->data==x)  
  60.         return b;           //直接返回b作为节点指针  
  61.         else  
  62.         {  
  63.             p=FindNode(b->lchild,x);  
  64.             if (p!=NULL)  
  65.                 return p;  
  66.             else  
  67.                 return FindNode(b->rchild,x);  
  68.         }  
  69.   
  70. }  
  71. BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  
  72. {  
  73.     return p->lchild;  
  74. }  
  75. BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  
  76. {  
  77.     return p->rchild;  
  78. }  
  79. int BTNodeDepth(BTNode *b)  //求二叉树b的深度  
  80. {  
  81.     int lchilddep,rchilddep;  
  82.     if (b==NULL)  
  83.         return(0);                          //空树的高度为0  
  84.     else  
  85.     {  
  86.         lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep  
  87.         rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep  
  88.         return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);  
  89.     }  
  90. }  
  91. void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  
  92. {  
  93.     if (b!=NULL)  
  94.     {  
  95.         printf("%c",b->data);  
  96.         if (b->lchild!=NULL || b->rchild!=NULL)  
  97.         {  
  98.             printf("(");  
  99.             DispBTNode(b->lchild);  
  100.             if (b->rchild!=NULL) printf(",");  
  101.             DispBTNode(b->rchild);  
  102.             printf(")");  
  103.         }  
  104.     }  
  105. }  
  106. void DestroyBTNode(BTNode *&b)   //销毁二叉树  
  107. {  
  108.     if (b!=NULL)  
  109.     {  
  110.         DestroyBTNode(b->lchild);  
  111.         DestroyBTNode(b->rchild);  
  112.         free(b);  
  113.     }  
  114. }  
原创粉丝点击