如何根据有序和前序遍历来构造树? 我只是在寻找一种有效的算法。
答案 0 :(得分:4)
来自Sun's (Oracle now, I guess...) forum的公然复制和粘贴:
问题:
任何人都可以帮助我如何从顺序和后序遍历构建二叉树,我只想知道算法,以便我可以应用它。 / em>的<强>答案:强>
让p_1
,p_2
...
p_n
成为后序遍历,让i_1
,i_2
...
i_n
成为顺序遍历。从后序遍历我们知道树的根是p_n
。在inorder遍历中找到此元素,例如i_1
,i_2
...
i_k-1
p_n
i_k+1
...
i_n
。从inorder遍历中我们找到左子树中的所有元素,即i_1
,i_2
...
i_k-1
和右子树,即i_k+1
{{ 1}}...
。删除元素
i_n
(和元素p_n
i_k
==
)。在p_n
中找到最右边的元素p_j
,p_1
p_2
...
p_j
...
其中p_n-1
是一个元素在p_j
,i_1
...i_2
。这是原始树的左子树的根。 拆分i_k-1
,p_1
p_2
...
和p_j
...p_j+1
和p_n-1
,i_1
{{ 1}}i_2
和...
i_k-1
i_k+1
。现在你有两个子序列代表原始的两个子树的后序和顺序遍历 树。
作者:JosAH。
我按照乔斯的指示实施了一次算法,它完美无缺!
答案 1 :(得分:1)
由于这是作业,我不会给你一个完整的答案,但希望足以让你感动。
想象一下,您有预先遍历,例如this树。
遍历为您提供2-7-2-6-5-11-5 ...等。请注意,5实际上是根的正确子项。
显然,你不能仅仅通过查看数字来判断这一点,所以要么你将被告知树的结构,要么你需要存储一些额外的数据(即,一个节点是否是左边的孩子或者是正确的孩子,例如)。
解析树只是一个递归函数,它将前序遍历作为输入(在传递输入时考虑范围)。正如我之前提到的,您的前序遍历应该附加一些额外的数据。
效率:
考虑构建此树时每个节点访问的次数,还要考虑读取输入的操作。有没有办法比构建树更快地重新组织输入?如果您需要操作数据,您必须使用什么结构。
按顺序:你需要同样的想法来帮助你完成它,所以我不会介绍它。如果你是绝望的话,我相信别人会的。