二叉树后序遍历 -- 递归和非递归实现

刺骨的言语ヽ痛彻心扉 2022-07-28 08:59 240阅读 0赞
  1. /*实现二叉树后序遍历 -- 采用递归和非递归方法
  2. *经调试可直接运行源码如下:
  3. ***/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <iostream>
  7. #include <stack>
  8. using namespace std;
  9. /*二叉树结点定义*/
  10. typedef struct BTreeNode
  11. {
  12. char elem;
  13. struct BTreeNode *pleft;
  14. struct BTreeNode *pright;
  15. }BTreeNode;
  16. /*
  17. 如果根节点为NULL,返回
  18. 根节点不为NULL,先访问左子树,再访问右子树,最后访问根节点
  19. */
  20. /*后序遍历 递归实现*/
  21. void post_order_traverse(BTreeNode *proot)
  22. {
  23. if (proot == NULL)
  24. {
  25. return;
  26. }
  27. post_order_traverse(proot->pleft);//左子树
  28. post_order_traverse(proot->pright);//右子树
  29. cout << "递归遍历节点" << proot->elem << endl;//访问根节点
  30. return;
  31. }
  32. /*后序遍历 非递归实现*/
  33. /*
  34. 第一步:给定proot,判断proot是否为NULL;
  35. 如果不为NULL,执行第二步;如果为NULL,执行第三步;
  36. 第二步:将proot入栈,并将proot的左结点赋给proot,执行第一步;
  37. 第三步:如果栈不为空,则将栈顶元素赋给proot,判断proot是否有右子树以及右子树是否访问过;
  38. 如果没有右子树或者已经访问过右子树,则访问proot并出栈,然后执行第一步;
  39. 如果有右子树并且右子树还没有访问过,则将proot右结点赋给proot,然后执行第一步。
  40. */
  41. /*后序遍历非递归实现*/
  42. void post_trvaverse(BTreeNode *proot)
  43. {
  44. if (proot == NULL)
  45. {
  46. return;
  47. }
  48. stack <BTreeNode*> st;
  49. BTreeNode* pvisited = NULL;//已访问节点
  50. while (proot != NULL || !st.empty())
  51. {
  52. while (proot != NULL)
  53. {
  54. st.push(proot);
  55. proot = proot->pleft;
  56. }
  57. if (!st.empty())
  58. {
  59. proot = st.top();
  60. if (proot->pright == NULL || proot->pright == pvisited)
  61. {
  62. st.pop();
  63. cout << "非递归遍历节点" << proot->elem << endl;
  64. pvisited = proot;
  65. proot = NULL;//防止重复遍历
  66. }
  67. else
  68. {
  69. proot = proot->pright;
  70. }
  71. }
  72. }
  73. return;
  74. }
  75. /*初始化二叉树根节点*/
  76. BTreeNode* btree_init(BTreeNode *&bt)
  77. {
  78. bt = NULL;
  79. return bt;
  80. }
  81. /*先序创建二叉树*/
  82. void pre_crt_tree(BTreeNode* &bt)
  83. {
  84. char ch;
  85. cin >> ch;
  86. if (ch == '#')
  87. {
  88. bt = NULL;
  89. }
  90. else
  91. {
  92. bt = new BTreeNode;
  93. bt->elem = ch;
  94. pre_crt_tree(bt->pleft);
  95. pre_crt_tree(bt->pright);
  96. }
  97. }
  98. int main()
  99. {
  100. BTreeNode *bt;
  101. btree_init(bt);//初始化根节点
  102. pre_crt_tree(bt);//创建二叉树
  103. post_trvaverse(bt);//非递归遍历
  104. post_order_traverse(bt);//递归遍历
  105. system("pause");
  106. return 0;
  107. }
  108. /*
  109. 运行结果:
  110. a b # # c d # # e # #
  111. ---以上为输入---
  112. ---以下为输出---
  113. 非递归遍历节点b
  114. 非递归遍历节点d
  115. 非递归遍历节点e
  116. 非递归遍历节点c
  117. 非递归遍历节点a
  118. 递归遍历节点b
  119. 递归遍历节点d
  120. 递归遍历节点e
  121. 递归遍历节点c
  122. 递归遍历节点a
  123. 请按任意键继续. . .
  124. 本例创建的二叉树形状:
  125. a
  126. b c
  127. d e
  128. 参考资料:
  129. http://blog.csdn.net/beitiandijun/article/details/41927747
  130. http://yuncode.net/code/c_505ea04f8f6186
  131. */

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读