已知前序和中序,重建这颗二叉树
前序:1 2 4 8 9 5 10 3 6 7
中序: 8 4 9 2 10 5 1 6 3 7
后序:8 9 4 10 5 2 6 7 3 1
# include<iostream>
using namespace std;
int pre[100]={1 ,2, 4, 8, 9, 5, 10, 3, 6, 7};
int in[100]={8 ,4 ,9 ,2 ,10, 5, 1, 6, 3, 7};
struct node{
int date;
node *lchild;
node *rchild;
node()
{
lchild=rchild=NULL;
}
};
void creat(node* &root,int prel,int prer,int inl,int inr)
{
if(prel>prer)
return ;
root=new node;
root->date =pre[prel];
int k;
for(int i=inl;i<=inr;i++)
{
if(in[i]==pre[prel])
{
k=i;
break;
}
}
int num;
num=k-inl;
creat(root->lchild,prel+1,prel+num,inl,k-1);
creat(root->rchild,prel+num+1,prer,k+1,inr);
}
void post(node *root)
{
if(root)
{
post(root->lchild );
post(root->rchild );
cout<<root->date <<" ";
}
}
int main()
{
node *root;
creat(root,0,9,0,9);
post(root);
}
把还原后的二叉树储存在数组中
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int in[maxn],pre[maxn],a[maxn];
int n;
void find(int root,int inl,int inr,int prel,int prer)
{
if(prer<prel) return ;
int k=0;
for(int i=inl;i<=inr;i++)
{
if(in[i]==pre[prel])
{
k=i;
break;
}
}
a[root]=in[k];
int len=k-inl;
find(root*2,inl,k-1,prel+1,prel+len);
find(root*2+1,k+1,inr,prel+len+1,prer);
}
void print()//层序输出
{
queue<int>q;
q.push(1);
while(!q.empty())
{
int t=q.front();
q.pop();
cout<<a[t]<<" ";
if(a[t*2]!=0) q.push(2*t);
if(a[2*t+1]!=0) q.push(2*t+1);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>in[i];
}
for(int i=1;i<=n;i++)
{
cin>>pre[i];
}
find(1,1,n,1,n);
// for(int i=1;i<=20;i++)
// cout<<a[i]<<" ";
// cout<<endl;
print();
}