题目链接:传送门
先序的特点是第一个都是根,后面的是他的左右儿子
而中序是二叉树向水平的的投影,父亲节点的左边是左子树,右边是右子书。
根据这两点我们每次可以找到父亲节点和左子树又子树的长度,就能用同样的递归找左子树的根节点和右子树的根节点。
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=1e3+5;
struct node
{
int v;
node *l,*r;
node()
{
v=-1;
l=NULL;
r=NULL;
}
};
node *root;
node * build(int *a,int *b,int n)
{
int i;
node *T;
if(n<=0)return NULL;
for(i=0; i<n; i++)
if(b[i]==a[0])
{
T=new node;
T->v=b[i];
T->l=build(a+1,b,i);
T->r=build(a+i+1,b+i+1,n-i-1);
return T;
}
return NULL;
}
void houxu(node* temp)
{
if(temp)
{
houxu(temp->l);
houxu(temp->r);
if(temp!=root)printf("%d ",temp->v);
else printf("%d\n",temp->v);
}
}
int main()
{
int n,i,j;
int a[maxn],b[maxn];
while(~scanf("%d",&n))
{
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=0; i<n; i++)
scanf("%d",&b[i]);
root=build(a,b,n);
houxu(root);
}
return 0;
}