数据结构--二叉树 (队列实现的层次遍历)

BTree.h:

  1. #include “DS.h”  
  2. typedef char ElemType;  
  3.   
  4.   
  5. typedef struct BiTNode {  
  6.     ElemType data;  
  7.     struct BiTNode *lchild,*rchild;  
  8. }BiTNode,*BiTree;  
  9. typedef struct QueueNode{  
  10.     BiTree data;  
  11.     struct QueueNode *next;  
  12. }QueueNode,*QueuePtr;  
  13. typedef struct {  
  14.     QueuePtr front;  
  15.     QueuePtr rear;  
  16. }LinkQueue;  
  17.   
  18. void menu();  
  19. void CreateBiTree(BiTree &T);  
  20. void PreOrderTraverse(BiTree T);  
  21. void InOrderTraverse(BiTree T);  
  22. void PostOrderTraverse(BiTree T);  
  23. void leverOrderTraverse(BiTree T);  
  24. Status InitQueue(LinkQueue *Q);  
  25. Status IsEmptyQueue(LinkQueue Q);  
  26. Status EnQueue(LinkQueue *Q,BiTree m);  
  27. BiTree DeQueue(LinkQueue *Q);  
BTree.cpp:
  1. #include “BTree.h”  
  2. //菜单  
  3. void menu(){  
  4.     printf(”\t\t\t 1、创建二叉树\n”);  
  5.     printf(”\t\t\t 2、前序遍历\n”);  
  6.     printf(”\t\t\t 3、中序遍历\n”);  
  7.     printf(”\t\t\t 4、后序遍历\n”);  
  8.     printf(”\t\t\t 5、层次遍历\n”);  
  9.     printf(”\t\t\t 6、退出\n”);  
  10. }  
  11. //创建二叉树  
  12. void CreateBiTree(BiTree &T){  
  13.     ElemType ch;  
  14.     scanf(”%c”,&ch);  
  15.     if(ch==’#’)  
  16.         T=NULL;  
  17.     else{  
  18.         T=(BiTree)malloc(sizeof(BiTNode));  
  19.         if(!T)  
  20.             exit(OVERFLOW);  
  21.         T->data=ch;  
  22.         CreateBiTree(T->lchild);  
  23.         CreateBiTree(T->rchild);  
  24.         T->data;  
  25.     }  
  26.   
  27. }  
  28. //前序遍历  
  29. void PreOrderTraverse(BiTree T){  
  30.     if(T == NULL)  
  31.         return ;      
  32.     printf(”%c”,T->data);  
  33.     PreOrderTraverse(T->lchild);  
  34.     PreOrderTraverse(T->rchild);  
  35.     return ;  
  36. }  
  37. //中序遍历  
  38. void InOrderTraverse(BiTree T){  
  39.     if(T == NULL)  
  40.         return ;  
  41.     InOrderTraverse(T->lchild);  
  42.     printf(”%c ”,T->data);  
  43.     InOrderTraverse(T->rchild);  
  44. }  
  45. //后序遍历  
  46. void PostOrderTraverse(BiTree T){  
  47.     if(T == NULL)  
  48.         return ;  
  49.     PostOrderTraverse(T->lchild);  
  50.     PostOrderTraverse(T->rchild);  
  51.     printf(”%c ”,T->data);  
  52.   
  53. }  
  54. //层次遍历  
  55. void leverOrderTraverse(BiTree T){  
  56.     LinkQueue Q;  
  57.       
  58.     InitQueue(&Q);  
  59.     EnQueue(&Q,T);  
  60.     while(!IsEmptyQueue(Q)){  
  61.         T=  DeQueue(&Q);  
  62.         if(T->lchild){  
  63.             EnQueue(&Q,T->lchild);  
  64.         }  
  65.         if(T->rchild){  
  66.             EnQueue(&Q,T->rchild);  
  67.         }  
  68.   
  69.     }  
  70.   
  71. }  
  72. Status InitQueue(LinkQueue *Q){  
  73.     Q->front=Q->rear=(QueuePtr)malloc(sizeof(QueueNode));  
  74.     if(!Q->front){  
  75.         return ERROR;  
  76.     }  
  77.     Q->front->next=NULL;  
  78.     return OK;  
  79. }  
  80. Status IsEmptyQueue(LinkQueue Q){  
  81.     if(Q.front==Q.rear){  
  82.         return OK;  
  83.     }else{  
  84.         return ERROR;  
  85.     }  
  86. }  
  87. Status EnQueue(LinkQueue *Q,BiTree m){  
  88.     QueuePtr p=(QueuePtr)malloc (sizeof(QueueNode));  
  89.     if(!p)  
  90.         return ERROR;  
  91.     p->data=m;  
  92.     p->next=NULL;  
  93.     Q->rear->next=p;  
  94.     Q->rear=p;  
  95.     return OK;  
  96. }  
  97. BiTree DeQueue(LinkQueue *Q){  
  98.     QueuePtr p;  
  99.     BiTree q;  
  100.     if(Q->front==Q->rear){  
  101.         return ERROR;  
  102.     }  
  103.     p=Q->front->next;  
  104.     if(!p){  
  105.         return ERROR;  
  106.     }else{  
  107.          q= p->data;  
  108.          printf(”%c ”,q->data);  
  109.         Q->front->next=p->next;  
  110.         if(Q->rear==p){  
  111.             Q->rear=Q->front;  
  112.         }  
  113.         free(p);  
  114.         return q;  
  115.     }  
  116. }  

main.cpp:

  1. #include “BTree.h”  
  2.   
  3. int main(){  
  4.     BiTree T;  
  5.     int choice ;  
  6.     while(1){  
  7.         menu();  
  8.         printf(”请输入你的操作:  ”);  
  9.         scanf(”%d”,&choice);  
  10.         if(choice==6break;  
  11.         switch(choice){  
  12.             case 1:  
  13.                 getchar();  
  14.                 CreateBiTree(T);  
  15.                 printf(”二叉树创建完成\n”);  
  16.             case 2:  
  17.                 printf(”二叉树前序遍历的结果是: ”);  
  18.                 PreOrderTraverse(T);  
  19.                 printf(”\n”);  
  20.                 break;  
  21.             case 3:  
  22.                 printf(”二叉树中序遍历的结果是: ”);  
  23.                 InOrderTraverse(T);  
  24.                 printf(”\n”);  
  25.                 break;  
  26.             case 4:  
  27.                 printf(”二叉树后序遍历的结果是: ”);  
  28.                 PostOrderTraverse(T);  
  29.                 printf(”\n”);  
  30.                 break;  
  31.             case 5:  
  32.                 printf(”二叉树层次遍历的结果是: ”);  
  33.                 leverOrderTraverse( T);  
  34.                 printf(”\n”);  
  35.                 break;  
  36.   
  37.         }  
  38.       
  39.     }  
  40.    return 0;  
  41. }  

你可能感兴趣的:(——数据结构与算法分析c++)