1.根据给出的postorder和inorder构造树
2.然后求得树中每一层结点的value值
3.之后再从每一层Z字输出
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define N 40
typedef struct node{
int val;
node* lchild;
node* rchild;
int depth=0;
}node;
int postorder[N];
int inorder[N];
vector<int> v[N];//v[i]保存depth=i的s结点的val值
int n;
node* root;
node* maketree(int pl,int pr,int il,int ir){
if(pl>pr||il>ir||pl<0||il<0||pr>=n||ir>=n)
return NULL;
node*t=new node();
t->val=inorder[ir];//当前子树的根的val为inorder[ir]
int i,j,num;
for(i=pl;i<=pr;i++){
if(postorder[i]==inorder[ir])
break;
}
num=i-pl;
t->lchild=maketree(pl,i-1,il,il+num-1);
t->rchild=maketree(i+1,pr,il+num,ir-1);
return t;
}
void levelorder(){
queue<node*> q;
q.push(root);
node*now;
bool flag=false;
int i,j;
while(!q.empty()){//层序遍历将对应高度的结点的val保存在v中
now=q.front();
q.pop();
if(now->lchild!=NULL){
now->lchild->depth=now->depth+1;
v[now->lchild->depth].push_back(now->lchild->val);
q.push(now->lchild);
}
if(now->rchild!=NULL){
now->rchild->depth=now->depth+1;
v[now->rchild->depth].push_back(now->rchild->val);
q.push(now->rchild);
}
}
cout<<root->val;
for(i=1;i<n;i++){
if(flag==false){//flag=false从左往右输出
for(j=0;j<v[i].size();j++){
cout<<" "<<v[i][j];
}
flag=true;
}
else{
for(j=v[i].size()-1;j>=0;j--){
cout<<" "<<v[i][j];
}
flag=false;
}
}
}
int main(){
cin>>n;
int i;
for(i=0;i<n;i++){
cin>>postorder[i];
}
for(i=0;i<n;i++){
cin>>inorder[i];
}
root=maketree(0,n-1,0,n-1);
levelorder();
return 0;
}