思路:用所给的后序和中序建树,然后层次遍历此树。
#include<stdio.h>
#include<queue>
using namespace std;
int N,i,post[10005],in[10005];
struct node{
int data;
node* lchild,*rchild;
};
node* newNode(int x){
node* Node=new node;
Node->data=x;
Node->rchild=Node->lchild=NULL;
return Node;
}
void insert(node*&root,int x){
if(root==NULL){
root=newNode(x);
return;
}
if(root->data<x)
insert(root->rchild,x);
else
insert(root->lchild,x);
}
node* Create(int num[],int n){
node* root=NULL;
for(int i=0;i<n;i++)
insert(root,num[i]);
return root;
}
node* CreateTree(int preL,int preR,int inL,int inR){
if(preL>preR)
return NULL;
node* root=new node;
root->data=pre[preL];
int k;
for(k=inL;k<=inR;k++)
if(in[k]==pre[preL])
break;
int numLeft=k-inL;
root->lchild=CreateTree(preL+1,preL+numLeft,inL,k-1);
root->rchild=CreateTree(preL+numLeft+1,preR,k+1,inR);
return root;
}
node* CreateTreeByPostAndIn(int postL,int postR,int inL,int inR){
if(postL>postR)
return NULL;
node*root=new node;
root->data=post[postR];
int k;
for(k=inL;k<=inR;k++)
if(in[k]==post[postR])
break;
int numLeft=k-inL;
root->lchild=CreateTreeByPostAndIn(postL,postL+numLeft-1,inL,k-1);
root->rchild=CreateTreeByPostAndIn(postL+numLeft,postR-1,k+1,inR);
return root;
}
void LayerOrder(node*root){
queue<node*>q;
q.push(root);
int cnt=0;
while(!q.empty()){
node*now=q.front();
q.pop();
if(cnt<N-1)
printf("%d ",now->data);
else
printf("%d",now->data);
cnt++;
if(now->lchild)
q.push(now->lchild);
if(now->rchild)
q.push(now->rchild);
}
}
int main(){
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=CreateTreeByPostAndIn(0,N-1,0,N-1);
LayerOrder(root);
return 0;
}