PAT题目链接
Z字形遍历二叉树
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N=35;
int n;
int in[N],post[N],q[N];
unordered_map <int,int> l,r,pos;
int built(int il,int ir,int pl,int pr){
//参数为中序、后序的左右边界,边界指的是在in、post数组中的下标
int root=post[pr];
int k=pos[root];
if(il<k) l[root]=built(il,k-1,pl,pl+k-1-il);
if(ir>k) r[root]=built(k+1,ir,pl+k-1-il+1,pr-1);
return root;
}
void bfs(int root){
int hh=0,tt=0,step=0;
q[0]=root;
while(hh<=tt){
int head=hh,tail=tt;
while(hh<=tail){
int t=q[hh++];
if(l.count(t)) q[++tt]=l[t];
if(r.count(t)) q[++tt]=r[t];
}
if((++step)%2) reverse(q+head,q+tail+1);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>in[i];
pos[in[i]]=i;
}
for(int i=0;i<n;i++) cin>>post[i];
int root=built(0,n-1,0,n-1);//root存储的是根的权值
bfs(root);
cout<<q[0];
for(int i=1;i<n;i++) cout<<' '<<q[i];
cout<<endl;
return 0;
}