我刚开始研究二叉树。有没有一个算法来找出二元树结构,给定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
但是,无论我应用什么算法,下一个似乎对不同的树有不同的作用。有人请解释一下。
答案 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)
该算法具有以下步骤:
从一开始就是横向的。第一个节点是根,然后我们有左子树,然后是右子树。创建一个以此为元素的节点。
搜索iorder数组中的节点。假设它在x处找到。递减k。 k指的是我们当前所在的porder数组中的位置。 k必须通过引用传递。
最后使用递归调用的返回值填充左子项和右子项 left child = buildTree(i,x-1,k) right child = buildTree(x + 1,j,k)
PS:
获得了上述算法的代码