这一直困扰着我。我知道,如果N键以二叉搜索树的形式排列,可以创建的树的可能数量对应于Catalan sequence中的第N个数字。
我一直试图确定这是为什么;无法找到任何甚至可能试图直观地解释它的东西我诉诸于SO的集体知识。我找到了计算可能树木数量的其他方法,但它们似乎不太直观,除了如何使用它之外没有提供任何解释。加上维基页面(上面的链接)甚至可以显示带有3个键的可能树形图的图像,这将使我认为有一个很好的和整洁的解释可以被听到(不用说,不包括在文章中) )。
提前致谢!
答案 0 :(得分:14)
由于您引用的维基百科文章中有four proofs,因此您似乎并未寻找加泰罗尼亚数字与二叉树排列之间对应关系的数学解释。
相反,这里有两种方法可以直观地观察加泰罗尼亚语序列(1,2,5,14,42 ......)在组合系统中是如何产生的。
对于边 N 的多边形,有多少种方法可以在将多边形完全切成三角形的顶点之间绘制切口?
在这种情况下,唯一路径的数量是加泰罗尼亚数字。
2x2 grid => 2条路径
_| |
_| __|
3x3 grid => 5条路径
_| | _| | |
_| _ _| | _| |
_| _| _ _| _ _| _ _ _|
4x4 grid => 14条路径
5x5网格=> 42条道路
等等。
如果您尝试为给定的N绘制可能的二叉树,您将看到树的置换方式是相同的。
您不希望盲目地接受树和序列之间的对应关系是令人钦佩的。不幸的是,在没有调用二项式数学的情况下,很难进一步讨论这个问题(并解释为什么加泰罗尼亚公式恰好是'它的')。如果您想更深入地理解binomial coefficients(其中包括combinatorics)本身,维基百科对permutation counting的讨论是一个很好的起点。
答案 1 :(得分:7)
catalan http://www.nohre.se/publicImages/catalan.png
任何二进制搜索树都可以通过预先访问所有节点进行编码,并为每个父节点编码1,为每个叶子编码0。如果树有n个父项,它将有n + 1个叶子,因此二进制代码将具有n 1:s和(n + 1)0:s。而且,代码的任何前缀至少与0:s一样多1:s。因此,可能的树数等于对角线以下的路径数。
答案 2 :(得分:2)
这里是计算树木的递归解决方案......
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);
}
答案 3 :(得分:0)
我也很想知道为什么它恰好是加泰罗尼亚数字; 暂时忘记加泰罗尼亚数是什么,找出计算 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)
这就是加泰罗尼亚数的递归形式。一旦我看到这种递归形式而不是维基百科中的公式,就很容易接受它。
(大部分文本来自https://coldfunction.com/mgen/p/3r)