二叉树的建立和遍历

今天复习了二叉树的相关知识,写了点简单的二叉树建立和遍历的代码,作为备忘``

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define MAX_TREENODE_NUM 100
  5 
  6 // 二叉树节点结构
  7 typedef struct bitnode
  8 {
  9     char data;                  // 节点存储的数据
 10     struct bitnode *lchild;     // 左孩子
 11     struct bitnode *rchild;     // 右孩子
 12 }bitnode,*bitree;
 13 
 14 // 前序建树:方式1
 15 bitree create_tree(bitree t)
 16 {
 17     t = (bitree)malloc(sizeof(bitnode));
 18     if(t == NULL){
 19         return t;
 20     }
 21     char c;
 22     scanf("%c",&c);
 23     if(c == ' '){               // 空格表示叶子
 24         t = NULL;
 25     }
 26     else{
 27         t->data = c;
 28         t->lchild = create_tree(t->lchild);
 29         t->rchild = create_tree(t->rchild);
 30     }
 31     return t;
 32 }
 33 // 前序建树:方式2
 34 /*
 35 void create_tree(bitree *t)
 36 {
 37     *t = (bitree)malloc(sizeof(bitnode));
 38     if(*t == NULL){
 39         return;
 40     }
 41     char c;
 42     scanf("%c",&c);
 43     if(c == ' '){               // 空格表示叶子
 44         *t = NULL;
 45         return;
 46     }
 47     else{
 48         (*t)->data = c;
 49         create_tree(&(*t)->lchild);
 50         create_tree(&(*t)->rchild);
 51     }
 52 }*/
 53 
 54 // 前序遍历
 55 void pre_sequence(bitree t)
 56 {
 57     if(t == NULL){
 58         return;
 59     }
 60     printf("%c",t->data);
 61     pre_sequence(t->lchild);
 62     pre_sequence(t->rchild);
 63 }
 64 // 中序遍历
 65 void mid_sequence(bitree t)
 66 {
 67     if(t == NULL){
 68         return;
 69     }
 70     mid_sequence(t->lchild);
 71     printf("%c",t->data);
 72     mid_sequence(t->rchild);
 73 }
 74 // 后序遍历
 75 void bak_sequence(bitree t)
 76 {
 77     if(t == NULL){
 78         return;
 79     }
 80     bak_sequence(t->lchild);
 81     bak_sequence(t->rchild);
 82     printf("%c",t->data);
 83 }
 84 // 层序遍历
 85 typedef struct{
 86     int first;
 87     int last;
 88     bitree que[MAX_TREENODE_NUM];                
 89 }Queue;
 90 
 91 void initQueue(Queue *q)                            // 初始化队列
 92 {
 93     q->first = q->last = 0;
 94 }
 95 int QueueEmpty(Queue *q)                            // 判断队列为空
 96 {
 97     return q->last==q->first;
 98 }
 99 int QueueFull(Queue *q)                             // 判断队列为满
100 {
101     return (q->last-q->first) == MAX_TREENODE_NUM;
102 }
103 void DeQueue(Queue *q,bitree *t)                       // 出队
104 {
105     *t = q->que[q->first];
106     q->first = (q->first+1)%MAX_TREENODE_NUM;
107 }
108 void EnQueue(Queue *q,bitree t)                        // 入队
109 {
110     q->que[q->last] = t;
111     q->last = (q->last+1)%MAX_TREENODE_NUM;
112 }
113 
114 void BFSTraverse(bitree t)
115 {
116     Queue q;
117     bitree k;
118     
119     initQueue(&q);
120 
121     EnQueue(&q,t);    
122     while(!QueueEmpty(&q)){
123         DeQueue(&q,&k);
124         printf("%c",k->data);
125 
126         if (k->lchild){
127             EnQueue(&q,k->lchild);
128         }
129         if (k->rchild){
130             EnQueue(&q,k->rchild);
131         }
132     }
133     printf("\n");   
134 }
135 
136 // 打印二叉树
137 void print(bitree t,int n)
138 {
139     if(t == NULL){
140         return;
141     }
142     int i;
143     for (i=0;i<n;i++){
144         printf(" ");
145     }
146     printf("%c\n",t->data);
147     print(t->lchild,n+4);
148     print(t->rchild,n+4);
149 }
150 
151 int main()
152 {
153     bitree t;
154 
155     // 方式1建树
156     t = create_tree(t);
157     // 方式2建树
158     // create_tree(&t);
159 
160     print(t,0);
161 
162     printf("前序遍历:");
163     pre_sequence(t);
164     printf("\n");
165     printf("中序遍历:");
166     mid_sequence(t);
167     printf("\n");
168     printf("后序遍历:");
169     bak_sequence(t);
170     printf("\n");
171     printf("层序遍历:");
172     BFSTraverse(t);
173 
174     return 0;
175 }

测试用例与结果:

 

posted on 2013-08-11 15:21  RAUL_AC  阅读(760)  评论(0编辑  收藏  举报

导航