例如,我们只提供后序遍历数组或只提供前序遍历数组。我们可以重建二叉树吗?如果我们知道二叉树是满的。此外,如果不是,如果同时知道前序和后序,是否可以构造完整的二进制文件?

最佳答案

不,您不能仅从一个列表中得出。

想想后序列表: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

关于algorithm - 我们可以构建一个只有后序遍历或前序遍历的完整二叉树吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23112589/

10-11 20:44