| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #include <stdio.h>
- #include <stdlib.h>
- #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;
- }
-
-
|