第十周项目2——二叉树的便利的递归算法

来源:互联网 发布:ovid数据库检索途径 编辑:程序博客网 时间:2024/05/29 07:24
  1. /*   
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院   
  3. * All rights reserved.   
  4. * 文件名称:WU.cpp   
  5. * 作    者:陈朋
  6. * 完成日期:2016年11月3日   
  7. * 版 本 号:v1.0    
  8. *问题描述:实现二叉树的先序、中序、后序遍历的递归算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。 
  9. *输入描述:无   
  10. *程序输出:测试数据   
  11. */
btree.h:
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #define MaxSize 100  
  4. typedef char ElemType;  
  5. typedef struct node  
  6. {  
  7.     ElemType data;              //数据元素  
  8.     struct node *lchild;        //指向左孩子  
  9.     struct node *rchild;        //指向右孩子  
  10. } BTNode;  
  11. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  12. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  13. BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针  
  14. BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针  
  15. int BTNodeDepth(BTNode *b); //求二叉树b的深度  
  16. void DispBTNode(BTNode *b); //以括号表示法输出二叉树  
  17. void DestroyBTNode(BTNode *&b);  //销毁二叉树 
btree.cpp:
  1. #include "btree.h"  
  2.   
  3. void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  
  4. {  
  5.     BTNode *St[MaxSize],*p=NULL;  
  6.     int top=-1,k,j=0;  
  7.     char ch;  
  8.     b=NULL;             //建立的二叉树初始时为空  
  9.     ch=str[j];  
  10.     while (ch!='\0')    //str未扫描完时循环  
  11.     {  
  12.         switch(ch)  
  13.         {  
  14.         case '(':  
  15.             top++;  
  16.             St[top]=p;  
  17.             k=1;  
  18.             break;      //为左节点  
  19.         case ')':  
  20.             top--;  
  21.             break;  
  22.         case ',':  
  23.             k=2;  
  24.             break;                          //为右节点  
  25.         default:  
  26.             p=(BTNode *)malloc(sizeof(BTNode));  
  27.             p->data=ch;  
  28.             p->lchild=p->rchild=NULL;  
  29.             if (b==NULL)                    //p指向二叉树的根节点  
  30.                 b=p;  
  31.             else                            //已建立二叉树根节点  
  32.             {  
  33.                 switch(k)  
  34.                 {  
  35.                 case 1:  
  36.                     St[top]->lchild=p;  
  37.                     break;  
  38.                 case 2:  
  39.                     St[top]->rchild=p;  
  40.                     break;  
  41.                 }  
  42.             }  
  43.         }  
  44.         j++;  
  45.         ch=str[j];  
  46.     }  
  47. }  
  48. BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  
  49. {  
  50.     BTNode *p;  
  51.     if (b==NULL)  
  52.         return NULL;  
  53.     else if (b->data==x)  
  54.         return b;  
  55.     else  
  56.     {  
  57.         p=FindNode(b->lchild,x);  
  58.         if (p!=NULL)  
  59.             return p;  
  60.         else  
  61.             return FindNode(b->rchild,x);  
  62.     }  
  63. }  
  64. BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  
  65. {  
  66.     return p->lchild;  
  67. }  
  68. BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  
  69. {  
  70.     return p->rchild;  
  71. }  
  72. int BTNodeDepth(BTNode *b)  //求二叉树b的深度  
  73. {  
  74.     int lchilddep,rchilddep;  
  75.     if (b==NULL)  
  76.         return(0);                          //空树的高度为0  
  77.     else  
  78.     {  
  79.         lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep  
  80.         rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep  
  81.         return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);  
  82.     }  
  83. }  
  84. void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  
  85. {  
  86.     if (b!=NULL)  
  87.     {  
  88.         printf("%c",b->data);  
  89.         if (b->lchild!=NULL || b->rchild!=NULL)  
  90.         {  
  91.             printf("(");  
  92.             DispBTNode(b->lchild);  
  93.             if (b->rchild!=NULL) printf(",");  
  94.             DispBTNode(b->rchild);  
  95.             printf(")");  
  96.         }  
  97.     }  
  98. }  
  99. void DestroyBTNode(BTNode *&b)   //销毁二叉树  
  100. {  
  101.     if (b!=NULL)  
  102.     {  
  103.         DestroyBTNode(b->lchild);  
  104.         DestroyBTNode(b->rchild);  
  105.         free(b);  
  106.     }  
  107. }  

main.cpp:
  1. #include "btree.h"  
  2. void PreOrder(BTNode *b)        //先序遍历的递归算法  
  3. {  
  4.     if (b!=NULL)  
  5.     {  
  6.         printf("%c ",b->data);  //访问根节点  
  7.         PreOrder(b->lchild);    //递归访问左子树  
  8.         PreOrder(b->rchild);    //递归访问右子树  
  9.     }  
  10. }  
  11.   
  12. void InOrder(BTNode *b)         //中序遍历的递归算法  
  13. {  
  14.     if (b!=NULL)  
  15.     {  
  16.         InOrder(b->lchild);     //递归访问左子树  
  17.         printf("%c ",b->data);  //访问根节点  
  18.         InOrder(b->rchild);     //递归访问右子树  
  19.     }  
  20. }  
  21.   
  22. void PostOrder(BTNode *b)       //后序遍历的递归算法  
  23. {  
  24.     if (b!=NULL)  
  25.     {  
  26.         PostOrder(b->lchild);   //递归访问左子树  
  27.         PostOrder(b->rchild);   //递归访问右子树  
  28.         printf("%c ",b->data);  //访问根节点  
  29.     }  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     BTNode *b;  
  35.     CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");  
  36.     printf("二叉树b:");  
  37.     DispBTNode(b);  
  38.     printf("\n");  
  39.     printf("先序遍历序列:\n");  
  40.     PreOrder(b);  
  41.     printf("\n");  
  42.     printf("中序遍历序列:\n");  
  43.     InOrder(b);  
  44.     printf("\n");  
  45.     printf("后序遍历序列:\n");  
  46.     PostOrder(b);  
  47.     printf("\n");  
  48.     DestroyBTNode(b);  
  49.     return 0;  
  50. }  
运行结果:

0 0
原创粉丝点击