例如,我们只提供后序遍历数组或者先序遍历数组。我们能否重构二叉树?如果我们知道该二叉树是满二叉树,那么是否能够构建出来?此外,如果不是满二叉树,同时知道先序遍历和后序遍历,是否有可能构建出完整的二叉树?
4 5 2 3 1
。 1 1
/ \ / \
2 3 4 3
/ \ / \
4 5 5 2
两棵树都有可能,但我们不知道哪一个生成了这个列表。
假设树中的每个元素都是唯一的,我们知道前序遍历是按照以下方式构建的:
[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
我稍微调整了一下顺序以更好地理解它们,以下是我的发现: