Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

btree.c 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "btree.h"
  4. #include "linkqueue.h"
  5. btree_t pkt_creat_btree(void)
  6. {
  7. btree_t n;
  8. data_type data;
  9. scanf("%lc", &data);
  10. if('#' == data)
  11. {
  12. return NULL; /* 开始递归调用返回,返回到最后一层 pkt_prev_order() 调用处,子树指针被赋值为NULL */
  13. }
  14. else
  15. {
  16. if((n = (btree_t)malloc(sizeof(struct btree))) == NULL)
  17. {
  18. printf("malloc failed!\n");
  19. return NULL;
  20. }
  21. n->data = data;
  22. n->lchild = pkt_creat_btree(); /* 开始递归调用 */
  23. n->rchild = pkt_creat_btree();
  24. }
  25. return n;
  26. }
  27. /* 先序遍历 */
  28. void pkt_prev_order(btree_t t)
  29. {
  30. if(t != NULL)
  31. {
  32. printf("%lc\n", t->data); /* 访问节点 */
  33. pkt_prev_order(t->lchild); /* 递归遍历左子树 */
  34. pkt_prev_order(t->rchild); /* 递归遍历右子树 */
  35. }
  36. }
  37. /* 中序遍历 */
  38. void pkt_mid_order(btree_t t)
  39. {
  40. if(t != NULL)
  41. {
  42. pkt_mid_order(t->lchild); /* 递归遍历左子树 */
  43. printf("%lc\n", t->data); /* 访问节点 */
  44. pkt_mid_order(t->rchild); /* 递归遍历右子树 */
  45. }
  46. }
  47. /* 后序遍历 */
  48. void pkt_after_order(btree_t t)
  49. {
  50. if(t != NULL)
  51. {
  52. pkt_after_order(t->lchild); /* 递归遍历左子树 */
  53. pkt_after_order(t->rchild); /* 递归遍历右子树 */
  54. printf("%lc\n", t->data); /* 访问节点 */
  55. }
  56. }
  57. /* 按层遍历 */
  58. void pkt_level_order(btree_t t)
  59. {
  60. linkqueue_t q;
  61. struct message m;
  62. q = pkt_creat_linkqueue();
  63. int ret;
  64. while (t != NULL)
  65. {
  66. printf("%lc\n", t->data); /* 访问节点 */
  67. if(t->lchild != NULL)
  68. {
  69. m.data = t->lchild;
  70. pkt_put_message_linkqueue(q, &m); /* 左子树指针入队 */
  71. }
  72. if(t->rchild != NULL)
  73. {
  74. m.data = t->rchild;
  75. pkt_put_message_linkqueue(q, &m); /* 右子树指针入队 */
  76. }
  77. if(!(ret = pkt_empty_linkqueue(q))) /* 队列非空出队,否则结束循环 */
  78. {
  79. pkt_take_message_linkqueue(q, &m);
  80. t = m.data;
  81. }
  82. else
  83. {
  84. break;
  85. }
  86. }
  87. }
  88. void pkt_travel_btree(btree_t t, const char *str, void(*order)(btree_t t))
  89. {
  90. printf("%s\n", str);
  91. order(t);
  92. }
  93. int main(int argc, char **argv)
  94. {
  95. btree_t bt;
  96. bt = pkt_creat_btree();
  97. #if 0
  98. printf("prev order:\n");
  99. pkt_prev_order(bt);
  100. printf("mid order:\n");
  101. pkt_mid_order(bt);
  102. printf("after order:\n");
  103. pkt_after_order(bt);
  104. #else
  105. pkt_travel_btree(bt, "prev order", pkt_prev_order);
  106. pkt_travel_btree(bt, "mid order", pkt_mid_order);
  107. pkt_travel_btree(bt, "after order", pkt_after_order);
  108. pkt_travel_btree(bt, "level order", pkt_level_order);
  109. #endif
  110. return 0;
  111. }