#include #include #include "btree.h" #include "linkqueue.h" btree_t pkt_creat_btree(void) { btree_t n; data_type data; scanf("%lc", &data); if('#' == data) { return NULL; /* 开始递归调用返回,返回到最后一层 pkt_prev_order() 调用处,子树指针被赋值为NULL */ } else { if((n = (btree_t)malloc(sizeof(struct btree))) == NULL) { printf("malloc failed!\n"); return NULL; } n->data = data; n->lchild = pkt_creat_btree(); /* 开始递归调用 */ n->rchild = pkt_creat_btree(); } return n; } /* 先序遍历 */ void pkt_prev_order(btree_t t) { if(t != NULL) { printf("%lc\n", t->data); /* 访问节点 */ pkt_prev_order(t->lchild); /* 递归遍历左子树 */ pkt_prev_order(t->rchild); /* 递归遍历右子树 */ } } /* 中序遍历 */ void pkt_mid_order(btree_t t) { if(t != NULL) { pkt_mid_order(t->lchild); /* 递归遍历左子树 */ printf("%lc\n", t->data); /* 访问节点 */ pkt_mid_order(t->rchild); /* 递归遍历右子树 */ } } /* 后序遍历 */ void pkt_after_order(btree_t t) { if(t != NULL) { pkt_after_order(t->lchild); /* 递归遍历左子树 */ pkt_after_order(t->rchild); /* 递归遍历右子树 */ printf("%lc\n", t->data); /* 访问节点 */ } } /* 按层遍历 */ void pkt_level_order(btree_t t) { linkqueue_t q; struct message m; q = pkt_creat_linkqueue(); int ret; while (t != NULL) { printf("%lc\n", t->data); /* 访问节点 */ if(t->lchild != NULL) { m.data = t->lchild; pkt_put_message_linkqueue(q, &m); /* 左子树指针入队 */ } if(t->rchild != NULL) { m.data = t->rchild; pkt_put_message_linkqueue(q, &m); /* 右子树指针入队 */ } if(!(ret = pkt_empty_linkqueue(q))) /* 队列非空出队,否则结束循环 */ { pkt_take_message_linkqueue(q, &m); t = m.data; } else { break; } } } void pkt_travel_btree(btree_t t, const char *str, void(*order)(btree_t t)) { printf("%s\n", str); order(t); } int main(int argc, char **argv) { btree_t bt; bt = pkt_creat_btree(); #if 0 printf("prev order:\n"); pkt_prev_order(bt); printf("mid order:\n"); pkt_mid_order(bt); printf("after order:\n"); pkt_after_order(bt); #else pkt_travel_btree(bt, "prev order", pkt_prev_order); pkt_travel_btree(bt, "mid order", pkt_mid_order); pkt_travel_btree(bt, "after order", pkt_after_order); pkt_travel_btree(bt, "level order", pkt_level_order); #endif return 0; }