主要内容 #
- 问题的提出
- 递推方法求解
- 问题的延伸
1. 问题的提出 #
本次课要讨论的是当给定 n(n>=0)个结点时,可以构建多少种形态不同的树。
如果两棵树中各个结点的位置都一一对应,可以说这两棵树相似。如果两棵树不仅相似,而且对应结点上的数据也相同,就可以说这两棵树等价。本次课中,形态不同的树指的是互不相似的树。
对于任意一棵普通树,通过孩子兄弟表示法的转化,都可以找到唯一的一棵二叉树与之对应。所以本节研究的题目也可以转化成:n 个结点可以构建多少种形态不同的二叉树。
每一棵普通树对应的都是一棵没有右子树的二叉树,所以对于 n 个结点的树来说,树的形态改变是因为除了根结点之外的其它结点改变形态得到的,所以,n 个结点构建的形态不同的树与之对应的是 n-1 个结点构建的形态不同的二叉树。
如果 tn 表示 n 个结点构建的形态不同的树的数量,bn 表示 n 个结点构建的形态不同的二叉树的数量,则两者之间有这样的关系:tn=bn-1。
2. 递推方法求解 #
最直接的一种方法就是推理。当 n=0 时,只能构建一棵空树;
当 n=2 时,可以构建 2 棵形态不同的二叉树,如下图所示:
当 n=3 时,可以构建 5 棵形态互不相同的二叉树,如下图所示:
对于具有 n( n>1 )个结点的二叉树来说,都可以看成是一个根结点、由 i 个结点组成的左子树和由 n-i-1 个结点组成的右子树
当 n=1 时,也适用,只不过只有一个根结点,没有左右孩子(i=0)。
可以得出一个递推公式:
通过对公式一步步的数学推算,最后得出,含有 n 个结点的不相似的二叉树的数量为:
3. 问题的延伸 #
上面我们得到的数列为为卡特兰数(Catalan数),其他使用Catalan数解决的问题:
- 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
- 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
- 有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
- 将一个凸多边形区域分成三角形区域的方法数?
- 在圆上选择2n个点,将这些点成对连接起来,使得所得到的n条线段不相交的方法数。
- 一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?