我们可以构造一个只有后序遍历或前序遍历的完整二叉树吗?

时间:2014-04-16 14:36:55

标签: algorithm data-structures

例如,我们只提供了post order遍历数组或只提供了pre order traversal数组。我们可以重新构建二叉树吗?如果我们知道二叉树已满。而且,如果不是,如果同时知道预订单和后期顺序,是否可以构造完整的二进制文件?

3 个答案:

答案 0 :(得分:5)

不,你不能单独从一个列表中找到。

想到售后订单:4 5 2 3 1

    1         1   
   / \       / \
  2   3     4   3
 / \           / \
4   5         5   2

两棵树都是可能的,但我们不知道哪一棵树生成了列表

假设树中的每个元素都是唯一的,我们知道preorder的构建方式如下:

[Node][     LeftTree     ][     RightTree     ]

和这样的后序:

[     LeftTree     ][     RightTree     ][Node]

如果我们有两个列表,前序1 2 4 5 3和后序4 5 2 3 1,我们知道1是树的根,因为它是预订单列表的第一个数字(和后序列表的最后一个数字)。此外,我们知道2必须是左树的根,3是右树的根,因为它们是根节点之后的第一个数字,它们是左或右树的根。考虑到这一点,我们可以将列表拆分为:

           [Root in preorder] [ LeftTree ] [RightTree] [Root in postorder]
preorder:        [1]             [2 4 5]      [3]     
postorder:                       [4 5 2]      [3]              [1]   

从这里你可以用左右树递归地做这个算法,最后得到这个:

    1     
   / \      
  2   3    
 / \       
4   5

由于每个元素都是唯一的,因此只有一种方法可以构建树,因此您可以从后序和预订单列表中重建树。

如果您拥有相同的元素,则无法构建唯一的树,例如:

preorder:  1 X X 5 X
postorder: X 5 X X 1

从这些列表中你可以创建这两棵树:

    1         1   
   / \       / \
  X   X     X   X
 / \           / \
X   5         5   X

答案 1 :(得分:0)

假设你有一个有3个节点的树,所有节点都标记相同。至少有3个这样的(不一定是完整的)树,但无论顺序如何,所有树都将具有相同的遍历数组。这应该回答你的第一个问题。

答案 2 :(得分:0)

我正在玩这些命令以便更好地理解它们,这是我的发现:

  • 下订单 - 从序列中你可以随时知道什么是根,什么是最右边的孩子(例如1,2,3,4,5 - 5是root和4是最右边的孩子)
  • 预订 - 从序列中你可以随时知道什么是根,什么是最左边的孩子(例如1,2,3,4,5 - 1是root和2是最左边的孩子)
  • 按顺序 - 给定一个根顶点,你总是可以告诉左边是什么,右边是什么(例如1,2,3,4,5和根3 - 1,2在左边,3,4,5在右边)

现在你可以玩了。按顺序或预订顺序,您可以轻松地重建树,因为您可以找到根并递归地找到它为左/右分支。如果一起预订和下订单,你可以找到根和最左边的孩子和最右边的孩子。如果root只有左/右子项,则会出现问题,因为你无法分辨出它是哪一个,因此,你不能轻易地重建树。

然而,正如被问到的那样,"完整"二叉树,其中每个顶点都有子节点或任何子节点,您不会遇到前/后顺序组合的问题,因此每对顺序将帮助您重建树。但是只有一个订单,你不能重建树(例如,只知道左边的孩子是不够的,你不知道哪个是正确的)