今天复习了二叉树的相关知识,写了点简单的二叉树建立和遍历的代码,作为备忘``
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(" "); 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 ",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(" "); 165 printf("中序遍历:"); 166 mid_sequence(t); 167 printf(" "); 168 printf("后序遍历:"); 169 bak_sequence(t); 170 printf(" "); 171 printf("层序遍历:"); 172 BFSTraverse(t); 173 174 return 0; 175 }
测试用例与结果: