所谓二叉树的重建就是已知前序或后序和中序遍历(必须确定中序遍历否则不能确定唯一二叉树)得到原二叉树。
例:
7
1 2 3 4 5 6 7(中序遍历)
4 1 3 2 6 5 7(前序遍历)
前序遍历必然是从根节点先走左子树再走右子树,这一点和递归顺序相同,所以在每一次递归的时候可以根据本子树的根节点得到本子树左右子树在中序遍历中的区间,从而递归求解
#include<bits/stdc++.h>
#define maxn 20000
using namespace std;
int n;
struct h{
int v;
int l;
int r;
};
int a[maxn];
int in[maxn];
int f[maxn];
int pos;
void dfs(int l,int r,int k){
if(l>r){
return ;
}
int p;
for(int i=1;i<=n;i++){
if(in[i]==f[pos]){
p=i;
break;
}
}
a[k]=f[pos++];
dfs(l,p-1,k<<1);
dfs(p+1,r,k<<1|1);
}
int main(){
pos=1;
cin>>n;
for(int i=1;i<=n;i++)
cin>>in[i];
for(int i=1;i<=n;i++)
cin>>f[i];
dfs(1,n,1);
queue<int >q;
q.push(1);
while(!q.empty()){
int k=q.front();
cout<<a[k];
if(a[k<<1|1])
q.push(k<<1|1);
if(a[k<<1])
q.push(k<<1);
q.pop();
if(!q.empty())
cout<<" ";
}
return 0;
}
当已知后序和中序的时候同理可得。