【问题标题】:Number of binary search trees over n distinct elementsn 个不同元素上的二叉搜索树数
【发布时间】:2013-04-14 21:45:57
【问题描述】:

可以从 n 个不同的元素构造多少个二叉搜索树?我们怎样才能找到一个经过数学证明的公式呢?

示例: 如果我们有 3 个不同的元素,比如 1、2、3,那么 是 5 棵二叉搜索树。

【问题讨论】:

标签: algorithm math binary-tree binary-search-tree proof


【解决方案1】:

给定 n 个元素,可以从这些元素生成的二叉搜索树的数量由第 n 个Catalan number 给出(表示为 Cn)。这等于

直观地说,加泰罗尼亚数字表示您可以通过以下方式创建由 n 个元素组成的结构的方法数量:

  • 将元素排序为 1、2、3、...、n。
  • 选择其中一个元素作为枢轴元素。这会将其余元素分为两组 - 元素之前的元素和元素之后的元素。
  • 递归地从这两个组中构建结构。
  • 将这两个结构与您删除的一个元素组合在一起以获得最终结构。

此模式与您从一组 n 个元素构建 BST 的方式完美匹配。选择一个元素作为树的根。所有较小的元素必须向左,所有较大的元素必须向右。从那里,您可以从左侧和右侧的元素构建更小的 BST,然后将它们与根节点融合在一起以形成整体 BST。 Cn 给出了对 n 个元素执行此操作的方法数,因此可能的 BST 数由第 n 个加泰罗尼亚数给出。

希望这会有所帮助!

【讨论】:

  • 例如对于节点 10、10、10,二叉搜索树的数量是 1。但加泰罗尼亚数是 5。但如果所有元素都不同,我认为没关系。
  • @SukhanovNiсkolay 对于 10、10、10,BST 的数量仍然是 5。树的形状会有所不同。
【解决方案2】:

我确信这个问题不仅仅是使用数学公式来计算。我花了一些时间编写了程序以及计算背后的解释或想法。

我尝试使用递归和动态编程来解决它。希望这会有所帮助。

公式已经存在于上一个答案中:

因此,如果您有兴趣学习解决方案并了解方法,您可以随时查看我的文章Count Binary Search Trees created from N unique elements

【讨论】:

    【解决方案3】:

    令 T(n) 为 n 个元素的 bst 数。

    给定 n 个不同的有序元素,编号为 1 到 n,我们选择 i 作为根。

    对于 T(i-1) 个组合,左子树中的 (1..i-1) 和 T(n-i) 组合的右子树中的 (i+1..n)。

    因此:

    T(n) = sum_i=1^n(T(i-1) * T(n-i))
    

    当然还有 T(1) = 1

    【讨论】:

    • 值得一提的是,这种递归求解到第 n 个加泰罗尼亚数。
    • @templatetypedef:你知道如何从我展示的和开始推导出加泰罗尼亚数公式吗?
    • @user1131467 这个总和应该正好是多边形在 n+2 个节点上的三角剖分数,这是我被介绍给加泰罗尼亚数字的方式。你固定一条边,让枢轴在其他 n 个顶点上移动,这会留下两个大小为 i-1 和 n-i 的多边形。
    • 原来我的总和有个名字。它被称为“Segner 的递归关系”。谷歌加加泰罗尼亚数字将揭示推导。
    • @user1131467- 我知道的证明(使用生成函数)在 Wikipedia 网站上。实际上有几个不同的证明,所有这些都很好。
    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2014-03-22
    • 2023-03-08
    相关资源
    最近更新 更多