PAT1127 ZigZagging on a Tree

题目链接:
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;
}
posted @ 2018-12-04 16:42  xzhws  阅读(44)  评论(0编辑  收藏  举报