在前序中找到根,然后把中序分成左 根 右,在按左右根的顺序构成后序数组;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,ans;
vector<int>pre,in,post;//前序,中序,后序数组
void sear(int l,int r){
if(l >= r) return;
int root = pre[ans++];//前序是从根开始的
int mid = distance(in.begin(),find(in.begin(),in.end(),root));//找到根在中序数组中的位置
sear(l,mid);//后序数组的顺序是先左
sear(mid+1,r);//后右
post.push_back(root);//在根
}
int main()
{
while(cin>>n){
pre.clear(),in.clear(),post.clear();//初始化
int a;
for(int i = 0;i < n;i++)
cin>>a, pre.push_back(a);
for(int i = 0;i < n;i++)
cin>>a, in.push_back(a);
ans = 0;
sear(0,n);
for(int i = 0;i < n;i++){
if(i) cout<<' ';
cout<<post[i];
}
cout<<endl;
}
return 0;
}