第十周项目一 层次遍历算法

来源:互联网 发布:伏尼契手稿 知乎 编辑:程序博客网 时间:2024/06/09 13:58
  1. 烟台大学计算机学院  
  2.   
  3. 作者:王雪行
  4.   
  5. 问题描述:层次遍历算法的验证 
  6.   
  7. 输入描述:无 
  8.   
  9. 输出描述:层次遍历树的结果 
  10.   
  11. */   
  12.   
  13.   
  14. //btree2.h  
  15.   
  16. #include <stdio.h>  
  17. #define MaxSize 100  
  18. typedef char ElemType;  
  19.   
  20. typedef struct node  
  21. {  
  22.     ElemType data;  
  23.   
  24.     struct node *lchild;  
  25.   
  26.     struct node *rchild;  
  27. }BTNode;  
  28.   
  29. typedef struct  
  30. {  
  31.     BTNode *data[MaxSize];  
  32.   
  33.     int front,rear;  
  34.   
  35. }SqQueue;  
  36.   
  37. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  38. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  39. BTNode *LchildNode(BTNode *p);      //返回*p节点的左孩子节点指针  
  40. BTNode *RchildNode(BTNode *p);      //返回*p节点的右孩子节点指针  
  41. int BTNodeDepth(BTNode *b);     //求二叉树b的深度  
  42. void DispBTNode(BTNode *b);     //以括号表示法输出二叉树  
  43. void DestroyBTNode(BTNode *&b);     //销毁二叉树  
  44. void LevelOrder(BTNode *b);//层次遍历  
  45.   
  46.   
  47. //btree2.cpp  
  48.   
  49. #include <malloc.h>  
  50. #include <stdio.h>  
  51. #include "btree2.h"  
  52. void CreateBTNode(BTNode *&b,char *str)  
  53. {  
  54.     BTNode *St[MaxSize],*p;  
  55.   
  56.     int top=-1,k,j=0;  
  57.   
  58.     char ch;  
  59.   
  60.     b=NULL;  //建立的二叉树初始时为空  
  61.   
  62.   
  63.     ch=str[j];  
  64.   
  65.     while(ch!='\0'//扫描字符串  
  66.     {  
  67.         switch(ch)//遇到字母。左右括号,逗号的操作  
  68.         {  
  69.             case '(':top++;  
  70.             St[top]=p;  
  71.             k=1;  
  72.             break;  
  73.             case ')':  
  74.                 top--;  
  75.                 break;  
  76.                 case ',':  
  77.                     k=2;  
  78.                 break;  
  79.                 default:p=(BTNode*)malloc(sizeof(BTNode));  
  80.                 p->data=ch;  
  81.                 p->lchild=p->rchild=NULL;  
  82.                 if(b==NULL)  
  83.                 {  
  84.                     b=p;  
  85.                 }  
  86.                 else  
  87.                     {  
  88.                         switch(k)  
  89.                         {  
  90.                             case 1:  
  91.                             St[top]->lchild=p;  
  92.                             break;  
  93.                             case 2:  
  94.                                 St[top]->rchild=p;  
  95.                                 break;  
  96.                         }  
  97.                     }  
  98.          }  
  99.          j++;  
  100.          ch=str[j];  
  101.   
  102.     }  
  103. }  
  104.   
  105. void DestroyBTNode(BTNode *&b)  
  106. {  
  107.     if(b!=NULL)  
  108.     {  
  109.         DestroyBTNode(b->lchild);//销毁左子树  
  110.         DestroyBTNode(b->rchild);//销毁右子树  
  111.         free(b);//销毁根结点  
  112.   
  113.     }  
  114. }  
  115.   
  116. BTNode *FindNode(BTNode *b,ElemType x)  
  117. {  
  118.     BTNode *p;  
  119.     if(b==NULL)  
  120.     {  
  121.         return NULL;  
  122.     }  
  123.     else if(b->data==x)  
  124.         return b;  
  125.     else  
  126.         {  
  127.             p=FindNode(b->lchild,x);//递归查找该结点  
  128.             if(p!=NULL)  
  129.             {  
  130.                 return p;  
  131.             }  
  132.             else  
  133.                 return FindNode(b->rchild,x);  
  134.         }  
  135. }  
  136.   
  137. BTNode *LchildNode(BTNode *p)//求左子树  
  138. {  
  139.     return p->lchild;  
  140. }  
  141. BTNode *RchildNode(BTNode *p)//求右子树  
  142. {  
  143.     return p->rchild;  
  144. }  
  145.   
  146. int BTNodeDepth(BTNode *b)  
  147. {  
  148.     int lchildh;  
  149.   
  150.     int rchildh;  
  151.   
  152.     if(b==NULL)  
  153.         return 0;//空树  
  154.     else  
  155.     {  
  156.         lchildh=BTNodeDepth(b->lchild);//递归求根结点左子树  
  157.         rchildh=BTNodeDepth(b->rchild);//递归求根结点右子树  
  158.         {  
  159.             if(lchildh>rchildh)  
  160.             {  
  161.                 return lchildh+1;  
  162.             }  
  163.             else  
  164.                 {  
  165.                     return rchildh+1;  
  166.                 }  
  167.         }  
  168.   
  169.   
  170.     }  
  171. }  
  172.   
  173. void DispBTNode(BTNode *b)//以括号表示法输出二叉树  
  174. {  
  175.     if(b!=NULL)  
  176.     {  
  177.         printf("%c",b->data);  
  178.         if(b->lchild!=NULL || b->rchild!=NULL)  
  179.         {  
  180.             printf("(");  
  181.             DispBTNode(b->lchild);  
  182.             if(b->rchild!=NULL)  
  183.             {  
  184.                 printf(",");  
  185.                 DispBTNode(b->rchild);  
  186.             }  
  187.             printf(")");  
  188.   
  189.         }  
  190.     }  
  191. }  
  192.   
  193.   
  194. void LevelOrder(BTNode *b)  
  195. {  
  196.     BTNode *p;  
  197.   
  198.     BTNode *qu[MaxSize];  
  199.   
  200.     int front,rear;  
  201.   
  202.     front=rear=-1;  
  203.   
  204.     rear++;  
  205.   
  206.     qu[rear]=b;  
  207.   
  208.     while(front!=rear)//层次遍历循环队列  
  209.     {  
  210.         front=(front+1)%MaxSize;  
  211.         p=qu[front];  
  212.         printf("%c",p->data);  
  213.         if(p->lchild!=NULL)  
  214.         {  
  215.             rear=(rear+1)%MaxSize;  
  216.             qu[rear]=p->lchild;  
  217.         }  
  218.         if(p->rchild!=NULL)  
  219.         {  
  220.             rear=(rear+1)%MaxSize;  
  221.             qu[rear]=p->rchild;  
  222.         }  
  223.     }  
  224. }  
  225. //main:  
  226.   
  227. #include <stdio.h>  
  228. #include <malloc.h>  
  229. #include "btree2.h"  
  230.   
  231. int main()  
  232. {  
  233.     BTNode *p;  
  234.     CreateBTNode(p,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//创建二叉树  
  235.     printf("输出二叉树\n");  
  236.     DispBTNode(p);//输出二叉树  
  237.   
  238.     printf("层次遍历,输出结果\n");  
  239.   
  240.     LevelOrder(p);//层次遍历  
  241.   
  242.     DestroyBTNode(p);//销毁  
  243.   
  244.     return 0;  
  245.   
  246. }  


运行结果:


阅读全文
0 0