本题涉及到层序遍历和中序后序建树的问题;
关于z型输出,可以先存在vector中,利用层数的奇偶性来判断是正向输出还是逆向输出;
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxn=40;
int n,in[maxn],post[maxn],maxl=-1,num=0;
struct node
{
int data,layer;
node *lchild,*rchild;
};
vector<int> ans[maxn];
node* getroot(int inl,int inr,int posl,int posr,int l)
{
if(posl>posr)
return NULL;
node* root=new node;
root->data=post[posr];
root->layer=l;
if(l>maxl)
maxl=l;
int i;
for(i=inl;i<=inr;i++)
{
if(post[posr]==in[i])
break;
}
root->lchild=getroot(inl,i-1,posl,posl+i-1-inl,l+1);
root->rchild=getroot(i+1,inr,posl+i-inl,posr-1,l+1);
return root;
}
void BFS(node* root)
{
queue<node*> q;
q.push(root);
while(!q.empty())
{
node *temp=q.front();
ans[temp->layer].push_back(temp->data);
q.pop();
if(temp->lchild!=NULL)q.push(temp->lchild);
if(temp->rchild!=NULL)q.push(temp->rchild);
}
for(int i=1;i<=maxl;i++)
{
if(i%2==0)
{
for(int j=0;j<ans[i].size();j++)
{
printf("%d",ans[i][j]);
num++;
if(num!=n)
printf(" ");
}
}
else
{
for(int j=ans[i].size()-1;j>=0;j--)
{
printf("%d",ans[i][j]);
num++;
if(num!=n)
printf(" ");
}
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&in[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
node* Root=getroot(0,n-1,0,n-1,1);
BFS(Root);
}