我们可以从中序序列构造 BST 吗?
Can we construct BST from inorder sequence?
我们可以从 preOrder 或 postOrder 序列构建二叉搜索树(BSTà)。但是我们可以仅从中序序列构建 BST 吗?我认为使用 inOrder 序列构建 BST 是不可能的,因为我们找不到根元素。
你是对的。两个不同的二叉搜索树可以有相同的顺序,所以你不知道该选择哪一个。但是,如果可以选择任何具有该有序序列的 BST,那么就有可能。
但我猜你的问题是关于重建 相同 BST 作为中序序列派生的树。 那 是不可能的:通过将 BST 转换为有序序列,您会丢失信息。即使您获得根作为 附加 信息,您通常也无法做到这一点。事实上,对于给定的节点数,BST 的形状可以是任何可能的形状。
最小的例子是顺序[1, 2]。它可以代表这两种树:
2 1
/ \
1 2
如果在这种情况下您获得了根作为额外信息,那么当然可以从中导出 BST。
下一个最小的例子:[1, 2, 3]。这些树都有这样的顺序:
3 2 1
/ / \ \
2 1 3 2
/ \
1 3
此外,如果您获得根作为额外信息,您将能够知道三个 BST 中哪一个是正确的。
但是一旦我们得到更大的树,我们就不会总是能够知道正确的 BST,即使我们得到了根。
另请注意,BST 没有 达到最佳平衡。但是即使我们只考虑最优平衡的 BST,中序序列也不能唯一地定义树。上面有 2 个节点的例子已经证明了这一点。但是让我们看一下中序序列为 [1, 2, 3, 4] 的四个节点。具有该有序序列的最平衡树是:
3 3 2 2
/ \ / \ / \ / \
2 4 1 4 1 4 1 3
/ \ / \
1 2 3 4
这里我们也看到,如果给定最优平衡BST的根,仍然有两种可能性。
我们可以从 preOrder 或 postOrder 序列构建二叉搜索树(BSTà)。但是我们可以仅从中序序列构建 BST 吗?我认为使用 inOrder 序列构建 BST 是不可能的,因为我们找不到根元素。
你是对的。两个不同的二叉搜索树可以有相同的顺序,所以你不知道该选择哪一个。但是,如果可以选择任何具有该有序序列的 BST,那么就有可能。
但我猜你的问题是关于重建 相同 BST 作为中序序列派生的树。 那 是不可能的:通过将 BST 转换为有序序列,您会丢失信息。即使您获得根作为 附加 信息,您通常也无法做到这一点。事实上,对于给定的节点数,BST 的形状可以是任何可能的形状。
最小的例子是顺序[1, 2]。它可以代表这两种树:
2 1
/ \
1 2
如果在这种情况下您获得了根作为额外信息,那么当然可以从中导出 BST。
下一个最小的例子:[1, 2, 3]。这些树都有这样的顺序:
3 2 1
/ / \ \
2 1 3 2
/ \
1 3
此外,如果您获得根作为额外信息,您将能够知道三个 BST 中哪一个是正确的。
但是一旦我们得到更大的树,我们就不会总是能够知道正确的 BST,即使我们得到了根。
另请注意,BST 没有 达到最佳平衡。但是即使我们只考虑最优平衡的 BST,中序序列也不能唯一地定义树。上面有 2 个节点的例子已经证明了这一点。但是让我们看一下中序序列为 [1, 2, 3, 4] 的四个节点。具有该有序序列的最平衡树是:
3 3 2 2
/ \ / \ / \ / \
2 4 1 4 1 4 1 3
/ \ / \
1 2 3 4
这里我们也看到,如果给定最优平衡BST的根,仍然有两种可能性。