我们可以从中序序列构造 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的根,仍然有两种可能性。