title: acwing1497-树的遍历
tags:

  • ACM
  • acwing
    abbrlink: a9cc3b0f
    date: 2021-03-27 12:24:52

题目

一个二叉树,树中每个节点的权值互不相同。

现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。

输入格式

第一行包含整数 NN,表示二叉树的节点数。

第二行包含 NN 个整数,表示二叉树的后序遍历。

第三行包含 NN 个整数,表示二叉树的中序遍历。

输出格式

输出一行 NN 个整数,表示二叉树的层序遍历。

数据范围

1≤N≤301≤N≤30

输入样例:

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

输出样例:

  1. 4 1 6 3 5 7 2

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <unordered_map>
  5. #include <queue>
  6. using namespace std;
  7. const int N = 40;
  8. int n;
  9. int postorder[N], inorder[N];
  10. unordered_map<int, int> l, r, pos;
  11. int build(int il, int ir, int pl, int pr)
  12. {
  13. int root = postorder[pr];
  14. int k = pos[root];
  15. if (il < k) l[root] = build(il, k - 1, pl, pl + k - 1 - il);
  16. if (ir > k) r[root] = build(k + 1, ir, pl + k - 1 - il + 1, pr - 1);
  17. return root;
  18. }
  19. void bfs(int root)
  20. {
  21. queue<int> q;
  22. q.push(root);
  23. while (q.size())
  24. {
  25. auto t = q.front();
  26. q.pop();
  27. cout << t << ' ';
  28. if (l.count(t)) q.push(l[t]);
  29. if (r.count(t)) q.push(r[t]);
  30. }
  31. }
  32. int main()
  33. {
  34. cin >> n;
  35. for (int i = 0; i < n; i ++ ) cin >> postorder[i];
  36. for (int i = 0; i < n; i ++ )
  37. {
  38. cin >> inorder[i];
  39. pos[inorder[i]] = i;
  40. }
  41. int root = build(0, n - 1, 0, n - 1);
  42. bfs(root);
  43. return 0;
  44. }