题目链接:
PAT1127 ZigZagging on a Tree
思路:
根据中序和后序遍历创建一棵树;
巧妙的地方在于在创建的时候同时统计每一层的孩子数目
然后层序遍历,根据奇偶性正向或者反向输出即可
#include <iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn=50;
struct node{
int left,right;
}tree[maxn];
int in[maxn],post[maxn];
vector<int> result[maxn];
int depth[maxn],dep=0;
queue<int> Q;
int dfs(int l1,int r1,int l2,int r2,int deep){//in,post
if(l1>r1||l2>r2) return -1;
int root=post[r2];
int ind;
for(int i=l1;i<=r1;i++){
if(in[i]==root){
ind=i;
break;
}
}
depth[root]=deep;
tree[root].left=dfs(l1,ind-1,l2,l2+ind-1-l1,deep+1);
tree[root].right=dfs(ind+1,r1,r2-1-(r1-(ind+1)),r2-1,deep+1);
return root;
}
void bfs(int root){
Q.push(root);
dep=depth[root];
result[dep].push_back(root);
while(!Q.empty()){
int front=Q.front();
Q.pop();
if(depth[front]!=dep){
dep++;
result[dep].push_back(front);
}else{
result[dep].push_back(front);
}
if(tree[front].left!=-1){
Q.push(tree[front].left);
}
if(tree[front].right!=-1){
Q.push(tree[front].right);
}
}
}
int main(int argc, char** argv) {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&in[i]);
for(int i=1;i<=n;i++) scanf("%d",&post[i]);
int root=dfs(1,n,1,n,0);
bfs(root);
printf("%d",result[0][0]);
for(int i=1;i<=dep;i++){
if(i&1)
for(int j=0;j<result[i].size();j++) printf(" %d",result[i][j]);
else
for(int j=result[i].size()-1;j>=0;j--) printf(" %d",result[i][j]);
}
printf("\n");
return 0;
}