#include<bits/stdc++.h>
using namespace std;
vector<int> pre,in;
int p;
typedef struct {
int id,left,right;
}Node;
vector<Node> post;
int rec(int l,int r)
{
if(l>=r)return -1;
Node nn;
nn.id=pre[p++];
int m=distance(in.begin(),find(in.begin(),in.end(),nn.id));//找到root在先序数组中的下标
nn.left=rec(l,m);
nn.right=rec(m+1,r);
post.push_back(nn);
return nn.id;
}
//通过前序和后序得到树
int main()
{
int n,tem;
cin>>n;
for(int i=0;i<n;i++){
cin>>tem;
pre.push_back(tem);
}
for(int i=0;i<n;i++){
cin>>tem;
in.push_back(tem);
}
tem=rec(0,n);
Node a;
for(vector<Node>::iterator it=post.begin();it<post.end();it++){
a=*it;
cout<<a.id<<" ";
}
return 0;
}
很容易想到,通过中序和后序也可以类似重建二叉树。这里就不再赘述
关于先序后序建立二叉树:先序后序无法确定某个节点的左右孩子,所以这个方法是行不通的