构造一棵树

时间:2010-02-02 14:59:40

标签: algorithm data-structures tree traversal

如何根据有序和前序遍历来构造树? 我只是在寻找一种有效的算法。

2 个答案:

答案 0 :(得分:4)

来自Sun's (Oracle now, I guess...) forum的公然复制和粘贴:

  
    

问题:
任何人都可以帮助我如何从顺序和后序遍历构建二叉树,我只想知道算法,以便我可以应用它。 / em>的

  
     

<强>答案:
  让p_1p_2 ... p_n成为后序遍历,让i_1i_2 ... i_n成为顺序遍历。从后序遍历我们知道树的根是p_n。在inorder遍历中找到此元素,例如i_1i_2 ... i_k-1 p_n i_k+1 ... i_n 。从inorder遍历中我们找到左子树中的所有元素,即i_1i_2 ... i_k-1和右子树,即i_k+1 {{ 1}} ...

     

删除元素i_n(和元素p_n i_k ==)。在p_n中找到最右边的元素p_jp_1 p_2 ... p_j ...其中p_n-1是一个元素在p_ji_1 ... i_2。这是原始树的左子树的根。   拆分i_k-1p_1 p_2 ...p_j ... p_j+1p_n-1i_1 {{ 1}} i_2... i_k-1 i_k+1。现在你有两个子序列代表原始的两个子树的后序和顺序遍历   树。

作者:JosAH

我按照乔斯的指示实施了一次算法,它完美无缺!

答案 1 :(得分:1)

由于这是作业,我不会给你一个完整的答案,但希望足以让你感动。

想象一下,您有预先遍历,例如this树。

遍历为您提供2-7-2-6-5-11-5 ...等。请注意,5实际上是根的正确子项。

显然,你不能仅仅通过查看数字来判断这一点,所以要么你将被告知树的结构,要么你需要存储一些额外的数据(即,一个节点是否是左边的孩子或者是正确的孩子,例如)。

解析树只是一个递归函数,它将前序遍历作为输入(在传递输入时考虑范围)。正如我之前提到的,您的前序遍历应该附加一些额外的数据。


效率:

考虑构建此树时每个节点访问的次数,还要考虑读取输入的操作。有没有办法比构建树更快地重新组织输入?如果您需要操作数据,您必须使用什么结构。


按顺序:你需要同样的想法来帮助你完成它,所以我不会介绍它。如果你是绝望的话,我相信别人会的。