与层序遍历题异曲同工
使用vector数组 v[]记录每一层的树结点
pre递归遍历的时候标记此节点层数,在对应的vector中写入结点
(叫pre是因为改进中后转前,所以懒得改名字)
规避了建树再BFS
(思路启发自liuchuo学姐 但学姐的题解不是这个思路写的 我觉得这个思路简单很多 还是膜大佬)
#include<iostream>
#include<vector>
using namespace std;
vector<int> in,post;
vector<int> v[35];
void pre(int root,int level,int start,int end){
if(start>end) return;
int i=start;
while(i<end&&post[root]!=in[i]) i++;
v[level].push_back(post[root]);
pre(root-end+i-1,level+1,start,i-1);
pre(root-1,level+1,i+1,end);
}
int main(){
int N;
cin>>N;
in.resize(N+1);
post.resize(N+1);
for(int i=1;i<=N;i++){
scanf("%d",&in[i]);
}
for(int i=1;i<=N;i++){
scanf("%d",&post[i]);
}
pre(N,0,1,N);
printf("%d",v[0][0]);
for(int i=1;i<35;i++){
if(i%2==0){
for(int j=v[i].size();j>0;j--){
printf(" %d",v[i][j-1]);
}
}else{
for(int j=0;j<v[i].size();j++){
printf(" %d",v[i][j]);
}
}
}
return 0;
}