您的位置:首页 > 其它

二叉树重建

2010-09-08 17:21 281 查看
对于二叉树T,可以递归定义
它的先序遍历、中序遍历和后序遍历如下:

PreOrder(T
)=T的根节点
+PreOrder(T的左子树)+PreOrder(T的右子树)

InOrder(T)
=InOrder(T的左子树)+T的根节点
+InOrder(T的右子树)

PostOrder(T)
=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点

其中,加号表示字符串连接运算。

[问题]

输入一棵二叉树的先序遍历
中序遍历
序列,输出它的后序遍历
序列。

样例输入:

DBACEGF ABCDEFG

BCAD CBAD

样例输出:

ACBFGED

CDAB

[分析]

先序遍历的第一个字符就是根,因此只需在中序遍历中找到它,就知道左右子树的先序和中序遍历了。例如:

先序:D
BACEGF 中序:ABCD
EFG

由先序遍历的第一个字符D
可知,此二叉树的根节点为D
,并且:

左子树的先序遍历为:BAC 中序遍历为:ABC

右子树的先序遍历为:EGF 中序遍历为:EFG

这样,可以编写一个递归程序


#include <cstdio>
#include <cstring>
void build(int n, char* s1, char* s2, char* s)
{
	if (n<=0)
	{
		return;
	}
	int p=strchr(s2, s1[0])-s2;					// 找到根结点在中序遍历中的位置
	build(p, s1+1, s2, s);						// 左子树的后序遍历
	build(n-p-1, s1+p+1, s2+p+1, s+p);		// 右子树的后序遍历
	s[n-1]=s1[0];									// 把根节点添加到最后
	printf("%c", s1[0]);							//	直接打印出结果
}
int main()
{
	char s1[128]={0};
	char s2[128]={0};
	char res[128]={0};
	while (scanf("%s%s", s1, s2)==2)
	{
		int n=strlen(s1);
		build(n, s1, s2, res);
		res
='/0';
		printf("/n%s/n",res);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: