1:根据二叉树的后续序列和中序序列可以确定唯一的二叉树;
2:二叉树遍历顺序
前序遍历;根节点-->左子树-->右子树;
中序遍历:左子树-->根节点-->右子树;
后序遍历:左子树-->右子树-->根节点;
下面重建二叉树之后再层序遍历
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int post[31],in[31];
int m,ele_sum;
typedef struct trees
{
int num;
struct trees *lchild,*rchild;
}Tree;
Tree *q[31];
Tree *b[31];
Tree *creat(int lend,int rend,Tree *root)
{
int po,i;
Tree *p,*q;
if(ele_sum==0||abs(lend-rend)<=1)
return root=NULL;
for(i=1;i<=m;i++)
{
if(in[i]==post[ele_sum])
{
po=i;
break;
}
}
if(po>lend&&po<rend)
{
p=(Tree*)malloc(sizeof(Tree));
p->num=post[ele_sum];
p->lchild=p->rchild=NULL;
root=p;
ele_sum--;
root->rchild=creat(po,rend,root->rchild);
root->lchild=creat(lend,po,root->lchild);
}
else root=NULL;
return root;
}
void level(Tree *root,int m)
{
int i=0,k=0;
if(root)
{
b[i]=root;
while(b[i]->lchild && b[i]->rchild)
{
if(b[i]->lchild)
{
k++;
b[k]=b[i]->lchild;
}
if(b[i]->rchild)
{
k++;
b[k]=b[i]->rchild;
}
i++;
}
for(i=0;i<m;i++)
printf("%d ",b[i]->num);
}
}
int main()
{
int po,i;
int lend,rend;
Tree *p,*head;
while(scanf("%d",&m)!=EOF)
{
head=NULL;
lend=0;
rend=m+1;
ele_sum=m;
for(i=1;i<=m;i++)
scanf("%d",&post[i]);
for(i=1;i<=m;i++)
scanf("%d",&in[i]);
for(i=1;i<=m;i++)
{
if(in[i]==post[ele_sum])
{
po=i;
break;
}
}
p=(Tree*)malloc(sizeof(Tree));
p->num=post[ele_sum];
p->lchild=p->rchild=NULL;
head=p;
ele_sum--;
head->rchild=creat(po,rend,head->rchild);
head->lchild=creat(lend,po,head->lchild);
level(head,m);
}
return 0;
}