当前位置:   article > 正文

PTA 树的遍历

PTA 树的遍历

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

  1. 7
  2. 2 3 1 5 7 6 4
  3. 1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

代码:

  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5. int N;
  6. struct Tree {
  7. int data;
  8. Tree* right;
  9. Tree* left;
  10. };
  11. int hx[30] = { 0 };
  12. int zx[30] = { 0 };
  13. queue<Tree*> ans;
  14. Tree* BuildT(int hx[], int zx[], int num) //h为后序的开始节点,z为中序的开始节点,num为该子树的节点个数
  15. {
  16. if (num == 0) return NULL;
  17. Tree *T;
  18. T = (Tree*)malloc(sizeof(Tree));
  19. T->data = hx[num - 1];
  20. int i = 0;
  21. for (; i < num; i++)
  22. {
  23. if (T->data == zx[i])
  24. break;
  25. }
  26. T->left = BuildT(hx, zx, i); //左子树的节点个数为i
  27. T->right = BuildT(hx + i, zx + i + 1, num - i - 1); //注意
  28. return T;
  29. }
  30. void print(Tree* T)
  31. {
  32. if (T!= NULL) ans.push(T);
  33. bool l = false;
  34. while (ans.size())
  35. {
  36. Tree *t = ans.front();
  37. ans.pop();
  38. if (l) cout << " ";
  39. cout << t->data;
  40. l = true;
  41. if (t->left != NULL) ans.push(t->left);
  42. if (t->right != NULL) ans.push(t->right);
  43. }
  44. }
  45. int main()
  46. {
  47. cin >> N;
  48. for (int i = 0; i < N; i++)
  49. {
  50. cin >> hx[i];
  51. }
  52. for (int i = 0; i < N; i++)
  53. {
  54. cin >> zx[i];
  55. }
  56. Tree* T = BuildT(hx, zx, N);
  57. print(T);
  58. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/681706
推荐阅读
相关标签
  

闽ICP备14008679号