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

古城微笑少年丶 2022-07-27 11:56 228阅读 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 mid_order_traverse(BTreeNode *proot)
  22. {
  23. if (proot == NULL)
  24. {
  25. return;
  26. }
  27. mid_order_traverse(proot->pleft);//左子树
  28. cout << "递归遍历节点" << proot->elem << endl;//访问根节点
  29. mid_order_traverse(proot->pright);//右子树
  30. return;
  31. }
  32. /*中序遍历 非递归实现*/
  33. /*
  34. 第一步:给定根节点proot,判断proot是否为空,如果不为空,然后进行第二步;
  35. 如果为空,则进行第三步;
  36. 第二步:将proot入栈,将proot的左结点赋给proot,然后进行第一步;
  37. 第三步:判断栈是否为空;如果为空,则结束,如果不为空,
  38. 则取出栈顶元素给proot,并出栈,访问proot,然后将proot的
  39. 右结点赋给proot,然后进行第一步。
  40. */
  41. /*中序遍历非递归实现*/
  42. void mid_trvaverse(BTreeNode *proot)
  43. {
  44. if (proot == NULL)
  45. {
  46. return;
  47. }
  48. stack <BTreeNode*> st;
  49. while (proot != NULL || !st.empty())
  50. {
  51. while (proot != NULL)
  52. {
  53. st.push(proot);
  54. proot = proot->pleft;
  55. }
  56. if (!st.empty())
  57. {
  58. proot = st.top();
  59. st.pop();
  60. cout << "非递归遍历节点" << proot->elem << endl;
  61. proot = proot->pright;
  62. }
  63. }
  64. return;
  65. }
  66. /*初始化二叉树根节点*/
  67. BTreeNode* btree_init(BTreeNode *&bt)
  68. {
  69. bt = NULL;
  70. return bt;
  71. }
  72. /*先序创建二叉树*/
  73. void pre_crt_tree(BTreeNode* &bt)
  74. {
  75. char ch;
  76. cin >> ch;
  77. if (ch == '#')
  78. {
  79. bt = NULL;
  80. }
  81. else
  82. {
  83. bt = new BTreeNode;
  84. bt->elem = ch;
  85. pre_crt_tree(bt->pleft);
  86. pre_crt_tree(bt->pright);
  87. }
  88. }
  89. int main()
  90. {
  91. BTreeNode *bt;
  92. btree_init(bt);//初始化根节点
  93. pre_crt_tree(bt);//创建二叉树
  94. mid_trvaverse(bt);//非递归遍历
  95. mid_order_traverse(bt);//递归遍历
  96. system("pause");
  97. return 0;
  98. }
  99. /*
  100. 运行结果:
  101. a
  102. b
  103. #
  104. #
  105. c
  106. #
  107. #
  108. ---以上为输入---
  109. ---以下为输出---
  110. 非递归遍历节点b
  111. 非递归遍历节点a
  112. 非递归遍历节点c
  113. 递归遍历节点b
  114. 递归遍历节点a
  115. 递归遍历节点c
  116. 请按任意键继续. . .
  117. 本例创建的二叉树形状:
  118. a
  119. b c
  120. 参考资料:
  121. http://blog.csdn.net/beitiandijun/article/details/41926903
  122. http://yuncode.net/code/c_505ea04f8f6186
  123. */

发表评论

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

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

相关阅读