n个结点下,可构成多少种不同形态的二叉树

n个结点下,可构成多少种不同形态的二叉树

先来回顾下“树的定义”中的部分描述:

树是由唯一的根和若干棵互不相交的子树组成的。其中,每一棵子树又是一棵树,也是由唯一的根结点和若干颗互不相交的子树组成的。由此可知,树的定义是递归的,即在树的定义中又用到了树的定义。

我们知道在递归中后一种情形往往都是由前一种情形推出来的
比如求5!时,假设递归函数为fun():
函数中核心语句为 n * fun(n-1);式中n是从5开始的,5!=5 * fun(4)
即要求得5!就需求出4!
同理要求出4!,就需求出3!
同理要求出3!,就需求出2!…一直到1!(即1)
最终可求得5!

那,既然树的定义也与递归有关,同样也可利用这种思想来解此题

解题过程

首先假设结点个数为n时,对应的二叉树形态有 f(n) 种

当结点个数为n时,首先抽出一个结点作为根结点,则剩余结点个数为n-1。
我们知道,二叉树的根结点有两个分支,那么剩余的n-1个结点在这两个分支上又是怎样分配的呢?
一起来看下吧!

  • 当左分支上结点个数为0时,右分支上结点个数为n-1
  • 当左分支上结点个数为1时,右分支上结点个数为n-2
  • 当左分支上结点个数为2时,右分支上结点个数为n-3
  • 当左分支上结点个数为n-2时,右分支上结点个数为1
  • 当左分支上结点个数为n-1时,右分支上结点个数为0

上面”树的定义“中提到:每一棵子树又是一棵树也即是每一个分支又是一棵树

接着分析:
  • 所以当左分支上结点个数为0时,其对应树的形态有f(0)种;右分支上结点个数为n-1时,其对应树的形态有f(n-1)种,那么在上述分析中第一种情况下(即左分支结点为0,右分支结点为n-1),结点为n的树的形态有f(0)*f(n-1)种。
    可能会有人疑惑,为什么是乘号而非加号呢?
    其实这是“排列组合的乘法原理”:上述,当根结点、左分支、右分支在一起组合时,才能构成一颗二叉树,而不是只有根结点与左分支或者根结点与右分支就能构成一棵二叉树,所以要用乘号。加号是用在“独立事物”之间的。可参见链接:https://editor.csdn.net/md/?articleId=106034102

  • 那上述第二种情况(即左分支为1,右分支为n-2)下,你能想出来有多少种情形吗?分析思路和上面一致,可以得出此时,有f(1) * f(n-2)种情形

  • 同理,第三种情况有f(2) * f(n-3)种情形

  • 第四种情况有f(3) * f(n-4)种情形

  • 第n种情况有f(n-1) * f(0)种情形
    综上,是不是结点为n时,所有的二叉树情形都计算出来啦?
    即第一种情况+第二种情况+…+第n种情况:
    f(0) *f(n-1) + f(1) *f(n-2) +f(2) *f(n-3) +…+ f(n-2) *f(1) + f(n-1) *f(0)
    注意:这里每种情况都是独立,不相互影响的,所以为加号

到这里,我们已经知道了f(n)=f(0) *f(n-1) + f(1) *f(n-2) +f(2) *f(n-3) +…+ f(n-2) *f(1) + f(n-1) *f(0)
那么是不是就要像求阶乘那样,依次求出f(n-1)、f(n-2)、f(n-3)…f(1)、f(0)的值后,即可求出f(n)的值,得到结点个数为n时,二叉树的形态数量呢?

坚持住!胜利就在眼前了

求f(n-1)、f(n-2)…的值时,依照上面分析f(n)的思路即可,即先拿出一个根结点后,再分析左右分支
这里容易看出,当推出公式以后,从前往后进行分析计算较为合适:
0个结点和1个结点时,二叉树都只有一种情形:前者为空树,后者仅有一个根结点。即 f(0)=f(1)=1
2个结点时,f(2)=f(0)*f(1)+f(1)*f(0)=1+1=2
3个结点时,f(3)=f(0)*f(2)+f(1)*f(1)+f(2)*f(0)=2+1+2=5…
下面的就不再计算了,建议小伙伴们底下自己再手动计算下一是验证咱们的思路猜想是否正确,二是加深自己的理解记忆。

------------------*******我是一条可爱的分割线 *--------------

下面就来讲解一个结论的证明:
结论:给定n个结点,能构成h(n)种不同的二叉树,h(n)=C(2n,n)/(n+1)
注:上面那个符号C是排列组合里的,这里不会知道怎么打出那种形式,就这样写了

搬起小板凳,开始证明

证明过程中需要用到我们上面得出的递推公式,即:
h(n)=h(0) *h(n-1) + h(1) *h(n-2) +…+ h(n-2) *h(1) + h(n-1) *h(0)
注:为了符号保持一致,我将f换成了h,就是符号不同,本质一样滴

这里我们利用“母函数”来推导(对“母函数”感兴趣的可以问下度娘,我木有百度,就不详细介绍了,不过大致体会出了它的含义,你看在递推公式中一直出现的函数是谁?没错!是h(x))
这里设一个函数G(x)=h(0)+h(1)x+h(2)x^ 2+h(3)x^ 3+…h(n)x^ n+…

可以得出G(x)^2=h(0) ^2 +(h(0)*h(1)+h(1)*h(0)) x + (h(0)*h(2) + h(1)*h(1) +h(2)*h(0)) x ^2+…(h(0) *h(n-1) + h(1) *h(n-2) +…+ h(n-2) *h(1) + h(n-1) *h(0)) x ^n-1+…

(可能乍一看,上面式子很难,但当你在本子上将式子展开后写写画画,发现很简单滴!)
所以在回过头来看咱们推出的那个递推公式:
h(n)=h(0) *h(n-1) + h(1) *h(n-2) +…+ h(n-2) *h(1) + h(n-1) *h(0)
等号左边相当于G(x)的x^n项的系数
等号右边相当于G(x)^ 2的x^ n-1项的系数

那么G(x)与G(x)^ 2又有什么关系呢?
在这里插入图片描述
通过图片提示我们可以将G(x)^ 2进行转化(已知h(0)=h(1)=1):
G(x)^ 2=h(1)+h(2)x +h(3)x^ 2+…+h(n)x ^(n-1)+… ①
注:这里将最开始的h(0)^ 2转化为了h(1)
我们又知道G(x)=h(0)+h(1)x+h(2)x^ 2+h(3)x^ 3+…h(n)x^ n+… ②
①②两式联立可得:G(x)=x* G(x)^ 2+1
并解得:G(x)1=(1-sqrt(1-4x))/2x
G(x)2=(1+sqrt(1-4x))/2x
利用h(0)=1验证可得仅有G(x)2成立,所以取G(x)1

前面提到,h(n)是G(x)的n次幂项的系数,那么我们要求h(n)的表达式,是不是就转化为求这个n次幂项的系数了呢?是的!没错

接着分析

已经得到:G(x)=(1-sqrt(1-4x))/2x
首先分析sqrt(1-4x),看到这个不知,再联系上述结论中出现的排列组合,不知你有没有象想起广义牛顿二项式定理(其实就是二项式定理的扩展,可以百度百科)
在这里插入图片描述
先来分析个简单的:
在这里插入图片描述
再来分析sqrt(1-4x):用-4x取代上述公式中的x
在这里插入图片描述
写的很多,主要是想让大家弄清楚怎么转化来的,因为我自己当时看时看的一塌糊涂

快要结束啦!不容易地擦擦眼泪

上面得到了sqrt(1-4x)的值:
在这里插入图片描述
然后将其代入G(x)=(1-sqrt(1-4x))/2x中
得到:在这里插入图片描述
而前面说过,h(n)是G(x)的x的n次幂项的系数
这里当n=n+1时,x的次幂为n,此时,系数为1/(n+1) * C(2n,n)
即结论得正!

结束!撒花!

  • 67
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值