后序遍历序列的结构是左子树-右子树-根节点,中序遍历序列的结构是左子树-根节点-右子树
根据以上性质,可以用后序根节点推出中序根节点,再用中序左右子树回推出后序左右子树,如此即可递归求出整棵二叉树
相同原理地,也可以根据前序和中序建树,做其它输出
考察二叉树,指针,链表,递归,队列等知识点
#include<stdio.h>
#include<queue>
using namespace std;
const int MAX=35;
int post[MAX];
int in[MAX];
struct node
{
int v;
node* l;
node* r;
};
void create(int x1,int x2,int y1,int y2,node* &nd)
{
if(x2<x1||y2<y1)
return;
if(nd == NULL)
{
nd = new node();
}
nd->v=post[x2];
nd->l=NULL;
nd->r=NULL;
int i,j;
for(i=x2,j=y2;i>=x1&&j>=y1;i--,j--)
if(in[j]==post[x2])
break;
create(x1,i-1,y1,j-1,nd->l);
create(i,x2-1,j+1,y2,nd->r);
}
void display(node* &nd)
{
queue<node*> q;
q.push(nd);
printf("%d",nd->v);
int i=0;
while(!q.empty())
{
if(i++)
printf(" %d",q.front()->v);
if(q.front()->l!=NULL)
q.push(q.front()->l);
if(q.front()->r!=NULL)
q.push(q.front()->r);
q.pop();
}
printf("\n");
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&post[i]);
for(i=0;i<n;i++)
scanf("%d",&in[i]);
node *root=NULL;
create(0,n-1,0,n-1,root);
display(root);
return 0;
}