关于二叉树形态的推导

2,171 阅读4分钟

对于二叉树形态,可以从二叉树本身的规律去找,离不开递推

先考虑只有一个节点的情况,设此时的形态为f(1)种,很明显f(1)=1; 那么有两个节点的时候呢?我们很容易的想到,应该在一个节点的基础上考虑递推关系。所以,当固定一个节点后,有两种情况,一种是左子树一个节点,一种是右子树一个节点,共有两种情况,所以f(2) = f(1)+f(1);当三个节点的时候呢?我们要考虑固定两个节点吗?看样子好像不行,因为固定两个节点的形态不是唯一的。
那么当节点数量大于2的时候,我们是在固定不同的形态的基础下,在安排剩下的节点吗? 我们应该这样想,固定一个节点就是根节点,二叉树本来就是由左子树,右子树,根节点组成的,所以固定根节点,遍历左右子树。 下图是3个节点的形态图

二叉树形态
当固定根节点时,剩下2个节点,分成如下几种情况,左2右0,左1右1,左0右2 这三种情况。 所以f(3)=f(2)+f(1)f(1)+f(2),当有n个节点呢?此时我们固定根节点左右子树的分布情况为(n-1,0),(n-2,1),(n-3,2)...(2,n-3),(1,n-2),所以我们不难推出f(n)=f(n-1)+f(n-2)f(1)+....+f(1)f(n-2)+f(n-1),通过表达式可以看出,这和普通的递归表达式有点区别,不是单纯的看前一步或前两步,而是考虑到从1到n-1的情况,这里我们可以定义f(0)=1,原递推公式可变为f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) +... f(n-1)f(0),这个表达式叫做Catalan数。那么我们会想这个表达式有没有通项公式呢,答案是肯定的。

Catalan数通项公式推导

在推导通项公式之前,首先说一下生成函数
Catanlan数通向公式推导过程,这里用到了生成函数:我们可以写出f(n)的生成函数:f(x) = f(0)x^0+f(1)x+f(2)x^2+...+...
[f(x)]²= f(0)^2x^0+(f(0)f(1)+f(1)f(0))x+(f(0)f(2)+f(1)f(1)+f(2)f(0))x^2+...+(f(0)f(n-1)+f(1)f(n-2)+...+f(n-1)f(0))x^(n-1)+...
因为f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) +...
所以[f(x)]^2 = f(0)+f(2)x+f(3)x^2+...+f(n)x^(n-1)+...,因为f(0)=f(1)=1,  所以[f(x)]^2 = f(x)-f(1)x = f(x)-x,解得

, 根据广义牛顿二项式,将f(x)进行泰勒级数展开得

二项式展开
所以

Catalan数的应用

使用Catalan数解决的问题

  • 进出栈问题:栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,1,2,3,4顺序进栈,那么一种可能的进出栈顺序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出栈序列为1,3,4,2。那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?

  • 凸多边形的三角形划分。一个凸的n边形,用直线连接他的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案。
    这也是非常经典的一道题。我们可以这样来看,选择一个基边,显然这是多边形划分完之后某个三角形的一条边。图中我们假设基边是p1pn,我们就可以用p1、pn和另外一个点假设为pi做一个三角形,并将多边形分成三部分,除了中间的三角形之外,一边是i边形,另一边是n-i+1边形。i的取值范围是2到n-1。所以本题的解c(n)=c(2)*c(n-1)+c(3)*c(n-2)+...c(n-1)*c(2)。令t(i)=c(i+2)。则t(i)=t(0)*t(i-1)+t(1)*t(i-2)...+t(i-1)*t(0)。很明显,这就是一个卡特兰数了。

  • 在圆上选择2n个点,将这些点成对连接起来,使得所得到的n条线段不相交的方法数。

  • 矩阵链乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?