习题6_3 二叉树重建(Tree Recovery, ULM 1997, UVa536)

Posted As_zyh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题6_3 二叉树重建(Tree Recovery, ULM 1997, UVa536)相关的知识,希望对你有一定的参考价值。

题目描述:

输入一棵树的先序遍历和中序遍历序列,输出后序遍历序列

AC代码:

#include<cstdio>
#include<cstring>

const int MAX_N = 30;
char pre_order[MAX_N], in_order[MAX_N];
int lch[MAX_N], rch[MAX_N];
char root;

//根据前序 L1~R1, 中序 L2~R2构造二叉树 
int build(int L1, int R1, int L2, int R2) {
	if(L2 > R2) return -1;
	int root = pre_order[L1] - 'A';
	int p = L2; 
	while(in_order[p] != root + 'A') 
		p++;
	int cnt = p - L2;  //左子结点的个数 
	lch[root] = build(L1+1, L1+cnt, L2, L2+cnt-1);
	rch[root] = build(L1+cnt+1, R1, L2+cnt+1, R2);
	return root;
}

void PostOrder(int x) {
	if(x == -1) return;
	PostOrder(lch[x]);
	PostOrder(rch[x]);
	printf("%c", x+'A');
}

int main() {
	#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif
	while(scanf("%s%s", pre_order, in_order) == 2) {
		root = build(0, strlen(pre_order)-1, 0, strlen(in_order)-1);
		PostOrder(root);
		printf("\\n");
	}
	return 0;
}

以上是关于习题6_3 二叉树重建(Tree Recovery, ULM 1997, UVa536)的主要内容,如果未能解决你的问题,请参考以下文章

牛客 重建二叉树

重建二叉树—递归

重建二叉树

重建二叉树(important!)

剑指offer——重建二叉树

剑指Offer_编程题之重建二叉树