1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 100 5 6 typedef char datatype; 7 void visit(datatype data); 8 9 typedef struct bnode 10 { 11 datatype data; 12 struct bnode *lchild, *rchild; 13 } BTNode, *BTree, **B_BTree; 14 15 typedef struct stack 16 { 17 BTree node[N]; 18 //int tag[N]; 19 int top; 20 } Stack; 21 22 void push(Stack *s, BTree T) 23 { 24 s->node[++s->top] = T; 25 } 26 27 BTree get_top(Stack *s) 28 { 29 return s->node[s->top]; 30 } 31 32 BTree pop(Stack *s) 33 { 34 if(s->top != -1) 35 { 36 s->top--; 37 return s->node[s->top + 1]; 38 } 39 else 40 { 41 return NULL; 42 } 43 } 44 45 void visit(datatype data) 46 { 47 printf("%c", data); 48 } 49 50 void preorder(BTree T) 51 { 52 if(T) 53 { 54 visit(T->data); 55 preorder(T->lchild); 56 preorder(T->rchild); 57 } 58 } 59 60 void inorder(BTree T) 61 { 62 if(T) 63 { 64 inorder(T->lchild); 65 visit(T->data); 66 inorder(T->rchild); 67 } 68 } 69 70 void postorder(BTree T) 71 { 72 if(T) 73 { 74 postorder(T->lchild); 75 postorder(T->rchild); 76 visit(T->data); 77 } 78 } 79 80 void cur_preorder(BTree t) 81 { 82 Stack s; 83 BTree temp = t; 84 s.top = -1; 85 while(temp || s.top != -1) 86 { 87 while(temp) 88 { 89 visit(temp->data); 90 push(&s, temp); 91 temp = temp->lchild; 92 } 93 if(s.top > -1) 94 { 95 temp = pop(&s); 96 temp = temp->rchild; 97 } 98 } 99 } 100 101 void cur_inorder(BTree t) 102 { 103 Stack s; 104 BTree temp = t; 105 s.top = -1; 106 while(temp || s.top != -1) 107 { 108 while(temp) 109 { 110 push(&s, temp); 111 temp = temp->lchild; 112 } 113 if(s.top > -1) 114 { 115 temp = pop(&s); 116 visit(temp->data); 117 temp = temp->rchild; 118 } 119 } 120 } 121 122 void cur_postorder(BTree t) 123 { 124 Stack s; 125 BTree temp, pre = NULL; 126 temp = t; 127 s.top = -1; 128 while(temp || s.top != -1) 129 { 130 while(temp) 131 { 132 push(&s, temp); 133 temp = temp->lchild; 134 } 135 temp = get_top(&s); 136 if(temp->rchild == NULL 137 || temp->rchild == pre) 138 { 139 visit(temp->data); 140 pre = temp; 141 temp = NULL; 142 pop(&s); 143 } 144 else 145 { 146 temp = temp->rchild; 147 } 148 } 149 } 150 151 /*层次遍历*/ 152 typedef struct 153 { 154 BTree node[N]; 155 int front; 156 int rear; 157 } queue; 158 159 void init_queue(queue *Q) 160 { 161 Q->front = Q->rear = 0; 162 } 163 164 void en_queue(queue *Q, BTree e) 165 { 166 Q->node[Q->rear] = e; 167 Q->rear = (Q->rear + 1) % N; 168 } 169 170 void de_queue(queue *Q, B_BTree e) 171 { 172 *e = Q->node[Q->front]; 173 Q->front = (Q->front + 1) % N; 174 } 175 176 int is_empty(queue *Q) 177 { 178 return Q->rear == Q->front; 179 } 180 181 void level_order(BTree t) 182 { 183 queue Q; 184 init_queue(&Q); 185 BTree p = t; 186 if(p) 187 { 188 en_queue(&Q, p); 189 while(!is_empty(&Q)) 190 { 191 de_queue(&Q, &p); 192 visit(p->data); 193 if(p->lchild) 194 { 195 en_queue(&Q, p->lchild); 196 } 197 if(p->rchild) 198 { 199 en_queue(&Q, p->rchild); 200 } 201 } 202 } 203 } 204 205 void create_tree(B_BTree T) 206 { 207 char temp; 208 temp = getchar(); 209 if(temp == ' ') 210 { 211 *T = NULL; 212 } 213 else 214 { 215 (*T) = (BTNode *)malloc(sizeof(BTNode)); 216 (*T)->data = temp; 217 create_tree(&(*T)->lchild); 218 create_tree(&(*T)->rchild); 219 } 220 } 221 222 int main() 223 { 224 BTree T; 225 printf("请按次数顺序输入字符:\n"); 226 create_tree(&T); 227 preorder(T); 228 printf("\n"); 229 cur_preorder(T); 230 printf("\n"); 231 inorder(T); 232 printf("\n"); 233 cur_inorder(T); 234 printf("\n"); 235 postorder(T); 236 printf("\n"); 237 cur_postorder(T); 238 printf("\n"); 239 level_order(T); 240 printf("\n"); 241 return 0; 242 }