post是后序遍历数组,mid是中序遍历数组
l1,r1是中序遍历区间,l2,r2是后序遍历区间
#include<iostream>
#include<queue>
using namespace std;
int n,post[35],mid[35];
int ans[35],m;
struct Node{
int l,r;
}tr[35];
int build(int l1,int r1,int l2,int r2){
if(l1>r1) return 0;
int rt=post[r2];
int i=l1;
while(mid[i]!=rt) i++;
int cnt=i-l1;
tr[rt].l=build(l1,i-1,l2,l2+cnt-1);
tr[rt].r=build(i+1,r1,l2+cnt,r2-1);
return rt;
}
void bfs(int rt){
queue<int> q;
q.push(rt);
while(!q.empty()){
int t=q.front();q.pop();
ans[++m]=t;
int l=tr[t].l,r=tr[t].r;
if(l!=0) q.push(l);
if(r!=0) q.push(r);
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++) cin >> post[i];
for(int i=1;i<=n;i++) cin >> mid[i];
int rt=build(1,n,1,n);
bfs(rt);
for(int i=1;i<=m;i++){
cout << ans[i];
if(i!=m) cout << ' ';
}
return 0;
}