二叉树递归和非递归遍历

拼搏现实的明天。 2021-12-17 04:07 513阅读 0赞

二叉树递归和非递归遍历

在这里插入图片描述
源码:

  1. #include<queue>
  2. #include<stack>
  3. #include<vector>
  4. #include<iostream>
  5. using namespace std;
  6. //假设空节点的值为-1
  7. //const int arrrlens = 18;
  8. //char arr[arrrlens] = { 'A', 'B', 'D' , '#', 'H', '#', '#', 'E', '#', '#',\
  9. 'C', 'F' , '#', '#', 'G', '#', '#'};
  10. //A B D # H # # E # # C F # # G # #
  11. class Node {
  12. public:
  13. Node(int el = 0, Node * l = NULL, Node * r = NULL) {
  14. data = el;
  15. mark = 0;
  16. left = l;
  17. right = r;
  18. }
  19. char data;
  20. int mark;
  21. Node* left, * right;
  22. };
  23. class Tree {
  24. public:
  25. Tree() { root = NULL; }
  26. ~Tree() { delete root; }
  27. int create(Node* &);
  28. int preOrder();
  29. int infxOrder();
  30. int postOrder();
  31. int print_preOrder(Node*);
  32. int print_infixOrder(Node*);
  33. int print_postOrder(Node*);
  34. public:
  35. Node* root;
  36. };
  37. int Tree::print_preOrder(Node* root)
  38. {
  39. //递归先序遍历
  40. if (root != NULL)
  41. {
  42. cout << root->data << " ";
  43. print_preOrder(root->left);
  44. print_preOrder(root->right);
  45. }
  46. return 0;
  47. }
  48. int Tree::print_infixOrder(Node* root)
  49. {
  50. //递归中序遍历
  51. if (root != NULL)
  52. {
  53. print_infixOrder(root->left);
  54. cout << root->data << " ";
  55. print_infixOrder(root->right);
  56. }
  57. return 0;
  58. }
  59. int Tree::print_postOrder(Node* root)
  60. {
  61. //递归后序遍历
  62. if (root != NULL)
  63. {
  64. print_postOrder(root->left);
  65. print_postOrder(root->right);
  66. cout << root->data << " ";
  67. }
  68. return 0;
  69. }
  70. int Tree::preOrder()
  71. {
  72. /*先序遍历,采用非递归的方法*/
  73. cout << endl << "先序遍历,采用非递归的方法" << endl;
  74. Node* p = root;
  75. stack<Node*> S;
  76. while (p != NULL || !S.empty())
  77. {
  78. if (p != NULL)
  79. {
  80. cout << p->data << " ";
  81. S.push(p);
  82. p = p->left;
  83. }
  84. else
  85. {
  86. p = S.top();
  87. S.pop();
  88. p = p->right;
  89. }
  90. }
  91. return 0;
  92. }
  93. int Tree::infxOrder()
  94. {
  95. /*中序遍历,采用非递归的方法*/
  96. cout << endl << "中序遍历,采用非递归的方法" << endl;
  97. Node* p = root;
  98. stack<Node*> S;
  99. while (p != NULL || !S.empty())
  100. {
  101. if (p != NULL)
  102. {
  103. S.push(p);
  104. p = p->left;
  105. }
  106. else {
  107. p = S.top();
  108. S.pop();
  109. cout << p->data << " ";
  110. p = p->right;
  111. }
  112. }
  113. return 0;
  114. }
  115. int Tree::postOrder()
  116. {
  117. /*后序遍历,采用非递归的方法*/
  118. cout << endl << "后序遍历,采用非递归的方法" << endl;
  119. Node* p = root;
  120. vector<Node*> S;
  121. vector<char> res;
  122. while (p != NULL || !S.empty())
  123. {
  124. if (p != NULL)
  125. {
  126. S.push_back(p);
  127. res.push_back(p->data);
  128. p = p->right;
  129. }
  130. else
  131. {
  132. p = S.back();
  133. S.pop_back();
  134. p = p->left;
  135. }
  136. }
  137. reverse(res.begin(), res.end());
  138. vector<char>::iterator ite = res.begin();
  139. for (; ite != res.end(); ite++) {
  140. cout << *ite <<" ";
  141. }
  142. cout << endl;
  143. return 0;
  144. }
  145. int Tree::create(Node*& root)
  146. {
  147. // input: A B D # H # # E # # C F # # G # #
  148. char val;
  149. cin >> val;
  150. if (val != '#')
  151. {
  152. root = new Node(val);
  153. create(root->left);
  154. create(root->right);
  155. }
  156. else
  157. root = NULL;
  158. return 0;
  159. }
  160. int main()
  161. {
  162. Tree tree;
  163. //intpu: A B D # H # # E # # C F # # G # #
  164. tree.create(tree.root);
  165. cout << " 递归先序遍历" << endl;
  166. tree.print_preOrder(tree.root);
  167. cout << endl << " 递归中序遍历" << endl;
  168. tree.print_infixOrder(tree.root);
  169. cout << endl << " 递归后序遍历" << endl;
  170. tree.print_postOrder(tree.root);
  171. tree.preOrder();
  172. tree.infxOrder();
  173. tree.postOrder();
  174. return 0;
  175. }

结果:
在这里插入图片描述

发表评论

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

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

相关阅读