Math 可以使用N个键创建的二进制搜索树的可能数量由第N个加泰罗尼亚数给出。为什么?

Math 可以使用N个键创建的二进制搜索树的可能数量由第N个加泰罗尼亚数给出。为什么?,math,binary-tree,binary-search,tree,Math,Binary Tree,Binary Search,Tree,这困扰了我一段时间。我知道,给定N个键以二叉搜索树的形式排列,可以创建的树的可能数量对应于 我一直在试图确定这是为什么;由于找不到任何可以直观地解释它的东西,我求助于SO的集体知识。我找到了其他方法来计算可能的树的数量,但它们似乎不那么直观,除了如何使用之外,没有提供任何解释。再加上维基页面(上面的链接),甚至显示了一个可能的树结构的图像,有3个键,这会让我觉得有一个好的、简洁的解释可以听到(不用说,这没有包含在文章中) 提前谢谢 因为在你引用的维基百科文章中有,你似乎不是在寻找加泰罗尼亚数字和

这困扰了我一段时间。我知道,给定N个键以二叉搜索树的形式排列,可以创建的树的可能数量对应于

我一直在试图确定这是为什么;由于找不到任何可以直观地解释它的东西,我求助于SO的集体知识。我找到了其他方法来计算可能的树的数量,但它们似乎不那么直观,除了如何使用之外,没有提供任何解释。再加上维基页面(上面的链接),甚至显示了一个可能的树结构的图像,有3个键,这会让我觉得有一个好的、简洁的解释可以听到(不用说,这没有包含在文章中)

提前谢谢

因为在你引用的维基百科文章中有,你似乎不是在寻找加泰罗尼亚数字和二叉树排列之间对应关系的数学解释

因此,这里有两种方法可以尝试并直观地展示加泰罗尼亚序列(1,2,5,14,42,…)是如何在组合系统中产生的

将多边形切割成三角形 对于N边的多边形,有多少种方法可以在将多边形完全分割为三角形的顶点之间绘制切割

  • 三角形(N=3):1(它已经是一个三角形)
  • 正方形(N=4):2(可以在任一对角线处切片)
  • 五角形(N=5):5(从一个顶点发出的两条切片线。五个顶点可供选择)
  • 六边形(N=6):14(试着画出来)
  • ……等等
绘制穿过栅格的路径而不穿过对角线 在这种情况下,唯一路径的数量是加泰罗尼亚编号

2x2网格=>2条路径

  _|       |
_|       __|
3x3网格=>5条路径

    _|       |       _|         |         |
  _|      _ _|      |          _|         |
_|      _|       _ _|      _ _|      _ _ _|
4x4网格=>14条路径
5x5网格=>42条路径

等等

如果您尝试为给定的N绘制可能的二叉树,您将看到树的排列方式完全相同

你不只是盲目地接受树和序列之间的对应关系的愿望是令人钦佩的。不幸的是,如果不调用二项式数学,就很难进一步讨论这个问题(并解释为什么加泰罗尼亚公式“碰巧”是这样)。如果你想更深入地了解(包括)维基百科本身,对的讨论是一个很好的起点。


任何二叉搜索树都可以通过访问所有节点进行编码,并对每个父节点编码1,对每个叶节点编码0。如果树有n个父树,它将有n+1个叶,因此二进制代码将有n1:s和(n+1)0:s。而且,代码的任何前缀的1:s数至少与0:s数相同。因此,可能的树数等于对角线下方的路径数。

这里是计算树数的递归解决方案

int countTrees(int numkeys){

if(numkeys > 1){
    int i =1;
    int sum=0;

    for(i = 1; i <= numkeys; i++){

        int lcount = countTrees(i-1);
        int rcount = countTrees(numkeys-i);
        sum += lcount*rcount;
    }
    return(sum);
}else
    return(1);
}
int countTrees(int numkeys){
如果(numkeys>1){
int i=1;
整数和=0;

对于(i=1;i我同样想知道为什么它恰好是加泰罗尼亚数字; 现在忘记什么是加泰罗尼亚数,找出计算n个节点的唯一二叉树数的公式

让C(n)是给定n个顶点的可能的二叉树的数目,C(0)=1,现在考虑C(n)当n>0时,因为每个二进制树必须有根节点,所以问题现在变成了在N节点1的根节点的左和右子节点上可以生成多少个二进制树。 为了找到答案,我们必须列举两边所有可能的树

C(n)=C(0)*C(n-1)+C(1)*C(n-2)+……+C(n-2)*C(1)+C(n-1)*C(0)

这就是加泰罗尼亚数字的递归形式。一旦我看到这种递归形式而不是维基百科中的公式,我很容易接受它


(大多数文本来自)

非常有趣的问题,尽管我不确定它是否真的与编程有关:-/看起来更像是一个抽象的数学(拓扑学)事情。嗯,这与拓扑无关!@Sergio:你的问题是什么?你想知道为什么带有N个键的二元搜索树的数量与该页面上显示的任何一个加泰罗尼亚数字的数量相同,或者你想知道加泰罗尼亚数字本身的表达式(在该页面上有四种证明)?我想知道如果给定N个节点,如何确定可以创建的可能BST的数量。我发现这个问题的答案与问“加泰罗尼亚序列中的第N个数字是多少?”,但即使这个公式在那篇维基文章中很容易找到,我还是想解释一下它的工作原理。我不喜欢接受没有解释其内在逻辑或除了公式之外的一些基本的、直观的描述的方法。@starblue:你来自一个“数学无神论者”是完全错误的,回答得很好。如果你不证明树和它们的二进制编码之间存在一对一的对应关系,那么你的论点是无用的。嗯,你在例子中使用的是预排序!