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