递归是将大问题分解成小问题求解,递归函数中输入是层序遍历和中序遍历,层序遍历的第一个值一定是根通过根和中序遍历将树分成左根右的情况,左子树在层序遍历中找到自己对应的层序遍历进行下一次递归,右子树同理
#include "stdio.h"
using namespace std;
struct Node
{
int data;
Node *leftN;
Node *rightN;
} node[32];
int cnt = 0;
Node *create()
{
node[cnt].leftN = NULL;
node[cnt].rightN = NULL;
int data = 0;
return &node[cnt++];
}
void preOrder(Node *n,int num)
{
if(num==0)
{
printf("%d",n->data);
}
else
{
printf(" %d",n->data);
}
if(n->leftN!=NULL)
{
preOrder(n->leftN,++num);
}
if(n->rightN!=NULL)
{
preOrder(n->rightN,++num);
}
}
void lasOrder(Node *n,int num)
{
if(n->leftN!=NULL)
{
lasOrder(n->leftN,++num);
}
if(n->rightN!=NULL)
{
lasOrder(n->rightN,++num);
}
if(num>=cnt-1)
{
printf("%d",n->data);
}
else
{
printf("%d ",n->data);
}
}
Node *insert(int l[],int n,int m[],int p,int lum)
{
Node *t = create();
//取出层序遍历的第一个,并在中序遍历中查找它的位置
int midI = 0;
for(int i = p;i<=lum;i++)
{
if(m[i]==l[0])
{
midI = i;
break;
}
}
t->data = m[midI];
if(p==lum)
{
return t;
}
//先得出左子树和右子树的范围
int lp=-1,ll=-1,rp=-1,rl=-1;
if(p<midI)
{
lp = p;
ll = midI -1;
//根据这个在层序遍历中找到层序遍历
int index = 0;
int at[32] = {0};
for(int j = 0;j<n;j++) //这里是层序遍历
{
for(int i = lp;i<=ll;i++)
{
if(m[i]==l[j])
{
at[index++] = m[i];
}
}
}
//现在at中存在的就是左子树的层次遍历
t->leftN = insert(at,index,m,lp,ll);
}
if(midI<lum)
{
rp = midI+1;
rl = lum;
//根据这个在层序遍历中找到层序遍历
int index = 0;
int at[32] = {0};
for(int j = 0;j<n;j++)
{
for(int i = rp;i<=rl;i++ )
{
if(m[i]==l[j])
{
at[index++] = l[j];
}
}
}
//现在at中存在的就是左子树的层次遍历
t->rightN = insert(at,index,m,rp,rl);
}
return t;
}
int main()
{
int n = 0;
scanf("%d",&n);
int l[32] = {0};
int m[32] = {0};
for(int i = 0;i<n;i++)
{
scanf("%d",&l[i]);
}
for(int i = 0;i<n;i++)
{
scanf("%d",&m[i]);
}
Node * t = insert(l,n,m,0,n-1);
preOrder(t,0);
printf("\n");
lasOrder(t,0);
return 0;
}