代码及注释:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <sstream>
#include <iterator>
#include <map>
#include <set>
#include <stack>
#include <queue>
using namespace std;
stringstream ss;
typedef long long ll;
map<ll, int> mp;
const int N = 2e5+10;
// 层序遍历开大点, 因为会存在一层中只有左或右节点的情况, 最大的理想情况有2^30个节点, 不存在的节点记为-1
vector<int> post,in,level(1000000,-1);
int n;
void getlevel(int root, int st, int ed, int idx) // 递归的遍历左右子树, 寻找层序节点
{
if(st>ed) return;
// 后序遍历的末节点即为该子树的根节点
level[idx] = post[root];
int i = st;
// 在中序遍历中找到根节点即可找到左右子树
while(i<=ed && post[root] != in[i]) i++;
// 先递归的遍历左子树, 在遍历右子树
getlevel(root-1-ed+i, st, i-1, idx*2+1);
getlevel(root-1, i+1, ed, idx*2+2);
}
int main()
{
cin>>n;
for(int i = 0; i<n; i++){
int x;
cin>>x;
post.push_back(x);
}
for(int i = 0; i<n; i++)
{
int x;
cin>>x;
in.push_back(x);
}
getlevel(n-1, 0, n-1, 0);
int cnt = 0;
for(int i = 0; i<1000000; i++)
{
int e = level[i];
if(e == -1) continue;
cnt++;
if(i) cout<<" "<<e;
else cout<<e;
if(cnt == n) break;
}
}