例如,我们只提供了post order遍历数组或只提供了pre order traversal数组。我们可以重新构建二叉树吗?如果我们知道二叉树已满。而且,如果不是,如果同时知道预订单和后期顺序,是否可以构造完整的二进制文件?
答案 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)
我正在玩这些命令以便更好地理解它们,这是我的发现:
现在你可以玩了。按顺序或预订顺序,您可以轻松地重建树,因为您可以找到根并递归地找到它为左/右分支。如果一起预订和下订单,你可以找到根和最左边的孩子和最右边的孩子。如果root只有左/右子项,则会出现问题,因为你无法分辨出它是哪一个,因此,你不能轻易地重建树。
然而,正如被问到的那样,"完整"二叉树,其中每个顶点都有子节点或任何子节点,您不会遇到前/后顺序组合的问题,因此每对顺序将帮助您重建树。但是只有一个订单,你不能重建树(例如,只知道左边的孩子是不够的,你不知道哪个是正确的)