二进制树从顺序和后序

时间:2012-09-23 22:09:45

标签: data-structures binary-tree

我刚开始研究二叉树。有没有一个算法来找出二元树结构,给定Inorder和Postorder OR Inorder和Preorder?我一直试图手动完成它,但它永远不会出错。例如.-这两个是有效的Inorder和Postorder遍历给定的树:

按顺序:D B F E A G C L J H K. 后序:D F E B G L J K H C A

显然A是根,因为它是Postorder中的最后一个元素。现在查看Inorder,左子树变为:{D B F E},右子树变为:{G C L J H K}。右子树的根将是预先排序的第二个元素,即C.我现在可以进一步划分右子树(以C为根),将{G}作为右子树,将{L J H K}作为左。因此我有这样的结构:

                               A
                                \
                                 C
                                /  
                               G

但是,无论我应用什么算法,下一个似乎对不同的树有不同的作用。有人请解释一下。

2 个答案:

答案 0 :(得分:1)

如果我理解了你的要求,那么你试图对给定二叉树搜索算法的底层结构进行反向工程,给出其前后状态的原始数据。如果是这种情况你可能会遇到困难的道路,因为虽然基本算法是相同的,但根据构建算法的开发人员可能会有细微差别,因为在实践中通常情况下开发人员不会建立纯粹的实施这些算法。

如果您只是想更好地理解二叉树,这可能会更好地解释它:http://www.youtube.com/watch?v=ZkH3SSPwcwI

答案 1 :(得分:0)

让inorder和preorder遍历分别在数组iorder和porder中给出。

构建树的函数将由buildTree(i,j,k)表示,其中i,j表示要查看的inorder数组的范围,k是预序列数组中的位置。

初始调用将是buildTree(0,n-1,0)

该算法具有以下步骤:

  1. 从一开始就是横向的。第一个节点是根,然后我们有左子树,然后是右子树。创建一个以此为元素的节点。

  2. 搜索iorder数组中的节点。假设它在x处找到。递减k。 k指的是我们当前所在的porder数组中的位置。 k必须通过引用传递。

  3. 最后使用递归调用的返回值填充左子项和右子项 left child = buildTree(i,x-1,k) right child = buildTree(x + 1,j,k)

  4. 最后返回节点
  5. PS:

    获得了上述算法的代码

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=477