通过后序遍历、中序遍历的得到树,再将层次遍历呈现出来.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=35;
int postorder[maxn],inorder[maxn],n;
struct node{
int data;
node* lchild;
node* rchild;
};
node* binary(int pl,int pr,int il,int ir){
if(pl>pr){
return NULL;
}
node* root=new node; //新建空结点写法
root->data=postorder[pr];
int k=il;
while(inorder[k]!=postorder[pr]){
k++;
}
int left=k-il;
int right=ir-k;
root->lchild=binary(pl,pl+left-1,il,k-1);
root->rchild=binary(pl+left,pr-1,k+1,ir);
return root;
}
void level(node* root){
queue<node*> q; //注意队列里是存地址
q.push(root);
while(!q.empty()){
node* now=q.front();
q.pop();
printf("%d",now->data);
if(now->lchild!=NULL){
q.push(now->lchild);
}
if(now->rchild!=NULL){
q.push(now->rchild);
}
if(!q.empty()){
printf(" ");
}
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&postorder[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&inorder[i]);
}
node* root=binary(1,n,1,n);
level(root);
return 0;
}