题目描述
知识点: 中序遍历,后序遍历,Z型输出
思路: 首先根据两种遍历方式建树。主要是Z型输出。可以使用队列的BFS方式稍微变形下输出。或者使用下面这种方式:
可以发现左边的同一层的节点指针idx一定小于右边的idx。所以可以根据层数的奇偶性,从前往后遍历同层的节点或者往后遍历同层的节点进行输出。
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N = 35;
int in[N],post[N],n;
int l[N],r[N],e[N],idx,h[N];
vector<int> res[N];
int build(int u,int l_,int r_,int level){
if(l_ > r_) return 0;
int in_root = 0;
for(int i = 0;i < n;i++) {
if(in[i] == post[u])
{
in_root = i;
break;
}
}
int cur = ++idx;
e[cur] = in[in_root];
h[cur] = level;
l[cur] = build(u-r_+in_root-1,l_,in_root-1,level+1);
r[cur] = build(u-1,in_root+1,r_,level+1);
return cur;
}
int main(){
cin>>n;
for(int i = 0;i < n;i++) cin>>in[i];
for(int i = 0;i < n;i++) cin>>post[i];
int root = build(n-1,0,n-1,1);
int max_h = -1;
for(int i = 1;i <= idx;i++)
max_h = max(max_h,h[i]);
for(int i = 1;i <= max_h;i++){
if(i % 2 != 0 && i != 1){
for(int j = idx;j >= 1;j--){
if(h[j] == i) res[i].push_back(e[j]);
}
}else{
for(int j = 1;j <= idx;j++){
if(h[j] == i) res[i].push_back(e[j]);
}
}
}
for(int i = 1;i <= max_h;i++){
for(int j = 0;j < res[i].size();j++){
if(i == 1 && j == 0) cout<<res[i][j];
else cout<<" "<<res[i][j];
}
}
return 0;
}