根据先序和中序确定顺序。
首先根据先序第一个在中序找到对应元素。将这棵树一分为二
在子树中找先序中第二个出现的元素,再一分为二
重复这个过程就行
#include<bits/stdc++.h>
using namespace std;
int n,t;
int ans[1001]={0},cnt=0;
int pre[1001],ind[1001];
struct node
{
int x;
struct node *left;
struct node *right;
};
void creat(int t,node* &p,int x,int y)
{
int i,flag=-1;
for(i=x;i<=y;i++)
{
if(pre[t]==ind[i]){
flag=i;
break;
}
}
if(flag==-1)return ;
p=new node;
p->left=p->right=NULL;
p->x=ind[flag];
if(flag>x)
{
int i,j,k=0;
for( j=t+1;j<=n;j++)
{
for(i=x;i<flag;i++)
{
if(ind[i]==pre[j])
{k=1;break;}
}
if(k)break;
}
if(k)
creat(j,p->left,x,flag-1);
}
if(flag<y)
{
int i,j,k=0;
for(j=t+1;j<=n;j++)
{
for(i=flag+1;i<=y;i++)
{
if(pre[j]==ind[i]){k=1;break;}
}
if(k)break;
}
if(k)
creat(j,p->right,flag+1,y);
}
}
void pr(node *p)
{
if(p!=NULL)
{
pr(p->left);
pr(p->right);
ans[cnt++]=p->x;
}
}
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
while (~scanf("%d",&n))
{
for(int i=1;i<=n;i++)scanf("%d",&pre[i]);
for(int i=1;i<=n;i++)scanf("%d",&ind[i]);
node *p=NULL;
creat(1,p,1,n);
pr(p);
printf("%d",ans[0]);
for(int i=1;i<cnt;i++)printf(" %d",ans[i]);
cnt=0;
printf("\n");
}
return 0;
}