PAT 1020

参考了:

http://www.cnblogs.com/civi/archive/2013/03/03/2941805.html

模拟根据后序遍历和中序遍历 得到 层级遍历,详见代码中注释

#include <stdio.h>
#include <vector>
using namespace std;

vector<int> c[30];//c[i]代表第i层遍历,最多30层

int a[30],b[30];//后序遍历 和 中序遍历

//a1,a2是在a中的位置,b1,b2是在b中的位置
//找到root,使得b[root] == a[a2],即根结点在 b中的位置
//计算出root左子树的结点数len = root - b1
//则root左子树在a 中序列(后序遍历序列): 从a1到a1+len-1, 右子树是从a1+len到a2-1( a2是根)
//则root左子树的b 中序列(中序遍历序列): 从b1到root-1, 右子树是从root+1到b2
//如果len == 0,即左子树空,则a1>a2,不做处理
void traver(int d, int a1, int a2, int b1, int b2){
	int j;
	if(a1 == a2){
		c[d].push_back(a[a2]);
	}else if(a1 < a2){
		c[d].push_back(a[a2]);

		int tmp = a[a2];

		for(j=b1; j<=b2; j++){
			if(tmp == b[j]) break;
		}
		int root = j;
		int len = root - b1;
		traver(d+1, a1, a1+len-1, b1, root-1);
		traver(d+1, a1+len, a2-1, root+1, b2);
	}
}

int main(){
	//freopen("in.txt","r",stdin);
	int n;
	scanf("%d",&n);
	int i,j;

	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++){
		scanf("%d",&b[i]);
	}	

	traver(0, 0, n-1, 0, n-1);

	int num = 0;
	i=0;

	while(1){
		int l = c[i].size();

		for(j=0; j<l; j++){
			printf("%d",c[i][j]);
			num ++;
			if(num < n) printf(" ");
		}
		if(num >= n) break;
		i++;
	}

	return 0;
}


你可能感兴趣的:(PAT 1020)