![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d8e9cdc51ddca77d17c90dfd8e420232.png)
思路
根据后序遍历和中序遍历我们可以求出前序遍历,在求前序遍历的同时可以求层
序遍历
后序遍历:2 3 1 5 7 6 4
中序遍历:1 2 3 4 5 6 7
先根据后续遍历求出根节点,即4,并将根节点放入层数组,然后分左右子树递归
,可以观察到若中序遍历的根节点为第i个,那么左子树的根节点在后续遍历的数
组中的位置为r - (r - i + 1)(当前子树的结点总数-右子树的结点和根结点的数
目),右子树的根节点为r - 1
#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
#include <time.h>
#define x first
#define y second
using namespace std;
const int N = 40, M = 1e6 + 10, INF = 0x3f3f3f3f, mod = 1e9 + 7;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<double,PII> PDII;
int Pre[N], Mid[N], Post[N];
int n;
int st;
vector<int> v[N];
void build(int l, int r, int Pr, int level) {
if (l >= r) {
Pre[++ st] = Post[Pr];
v[level].push_back(Pre[st]);
return ;
}
Pre[++ st] = Post[Pr];
v[level].push_back(Pre[st]);
for (int i = l; i <= r; i ++ )
if (Mid[i] == Post[Pr]) {
if (i != l)
build(l, i - 1, Pr - (r - i + 1), level + 1);
if (i != r)
build(i + 1, r, Pr - 1, level + 1);
break;
}
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> Post[i];
for (int i = 1; i <= n; i ++ )
cin >> Mid[i];
build(1, n, n, 1);
bool f = false;
for (int i = 1; i < N; i ++ ) {
if (v[i].size()) {
for (int j = 0; j < (int)v[i].size(); j ++ )
if (!f) {
cout << v[i][j];
f = true;
} else
cout << " " << v[i][j];
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}