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

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

发表评论

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

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

相关阅读