定义
f(0)=1,f(1)=1
f(n)=Σf(i)∗f(n−i−1),n>=2,n∈Z
前几项:1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900…
常见形式
1.二叉树的计数
已知一颗二叉树有n个节点,问该二叉树有多少种形态?
除去根节点,左子树和右子树共有n-1个节点,左子树和右子树的方案又是相同的问题。令n个节点的二叉树形态总数为f(n),设左子树有i个节点,则右子树有n-i-1个节点,那么:
f(n)=Σf(i)∗f(n−i−1)
即卡特兰数第n项。
2.AB排列问题
有一个由n个A和n个B组成的2*n的序列,满足从第一个位置开始到任何位置,B的个数都不超过A的个数。
将A视为+1,B视为-1,那么这个序列就像一个一上一下的函数图像:
从0出发,由于有n个A和n个B,所以最后肯定会走回0,又因为B的个数都不超过A的个数,所以不可能走到0以下(ps:下文把走两次称作1步)。
令走n步的方案数为f(n),设第二次走到0的点为i(第一次走到0的点是0,但是i可以是0),那么就可以将走n步分为两部分:先走到i,然后在i选A(+1)(因为走到i时为0,那么i必须选A(+1)),走n-i-1步,最后选B(-1)到达n。那么:
f(n)=Σf(i)∗f(n−i−1)
即卡特兰数第n项(这是巧妙地转化!)。
还可以用另外一种方法看待这个问题。2*n的序列中有n个A和n个B,那么序列的总方案(即使不满足)为
Cn2n
,而不满足的方案实际上为
Cn−12n
,为什么呢?
Cn−12n
表示的是2*n的序列放n-1个A(n+1个B)的方案数,由于只放了n-1个A,那么肯定是不满足的:
由于放了n-1个A和n+1个B,最后肯定会到0以下,我们把最后一次选B的位置改为选A(因为是最后一个选B的位置,所以之前肯定已经到0以下了),所得到的路径就对应了一个不满足的序列。但是有些时候不一定必须把最后一次选B的位置改为选A,之前也可以啊?的确可以,不过如果选之前的位置,最后肯定还会有选B的位置,这就和其他方案撞上了,所以不需考虑。
那么也就是说
f(n)=Σf(i)∗f(n−i−1)=Cn2n−Cn−12n=Cn2nn+1
,这就是卡特兰数的通项公式。
通项公式
f(n)=Cn2nn+1=(2n)!n!(n+1)!
。
所以我们就可以用求组合数的方法求解f(n)了。