重构二叉树(XTU 1046)

Description

根据输入的二叉树前序和中序遍历序列重构二叉树,输出对应节点的左右子节点。

Input

第一行是一个整数N(1<=N<=20),表示有多少个测试例子。以下每个测试例子的第一行是本测试例子的二叉树的前序遍历,第二行是中序遍历,第三行首先是一个整数M,表示要求输出结果的数目,以后有M个节点,每个中间由一个空格隔开。

Output

每行输出一个例子的所有结果,如果其子节点为空则输出字符#,同一例子的不同节点的输出结果之间用一个空格隔开

Sample Input

1
ABCDEF
CBEDFA
3 A B C

Sample Output

B# CD ##

Source

XTU

重构二叉树,根据前序和中序构树即可

这里用的是递归和分治法

注:此代码仅供参考和提供思路,不能直接复制粘贴

#include
#include
#include

struct Node {
	char left, right; //建树 
};

char pre[27], in[27];
Node node[27];

char build(int b1, int e1, int b2, int e2) {  //返回根节点 
	if(b1 > e1) return '#';
	char x = pre[b1];
	int t = b2;
	while(x != in[t]) t++;
	node[x-'A'].left = build(b1+1, b1+t-b2, b2, t-1); // 构树,找出子节点 
	node[x-'A'].right = build(b1+t-b2+1, e1, t+1, e2);
	return x;
}

void read_and_solve() {
	int t;
	scanf("%d", &t);
	while(t--) {
		char c;
		getchar();
		scanf("%c", &c);
		printf("%c%c", node[c-'A'].left, node[c-'A'].right);
		if(t) printf(" ");
	}
}

int main() {
	int n;
	scanf("%d", &n);
	while(n--) {
		scanf("%s %s", pre, in);
		int len = strlen(pre);
		build(0, len-1, 0, len-1);
		read_and_solve();
		printf("\n");
	}
	return 0;
}



你可能感兴趣的:(重构二叉树(XTU 1046))