给定一个序列快速计算不同二叉树的个数

给定一个序列求二叉树的个数,就相当于n个数进栈然后得到一个出栈序列种树

假设用f(n)表示n个数的出栈序列数的种树,假设第一个出栈序数是k,则k将1~n的序列分为两个序列,其中一个是1 ~ k-1,序列个数是k-1;另一个是 k+1 ~ n,序列个数是n-k。此时,若k视为确定的一个序数,根据乘法原理,则f(n)等于序列个数 k-1的出栈种类数乘以序列个数为 n-k 的出栈序列数,即             f(n)  = f(n-1) * f(n-k)

由于k可以从1取到n,所以再根据加法原理,将k取不同值的序列的种数相加,得到的总序列的种数为:          f(n)  = f(0)f(n-1) + f(1)f(n-2) + ... +f(n-1)f(0)

而此式就是一个著名数列 ----- 卡特兰数的递推公式  

设卡特兰数的第n项为h(n),令h(0) = 1, h(1) = 1, 则卡特兰数满足递推公式:

h(n) = h(0)*h(n-1) + h(1)*h(n-2)+...+h(n-1)*h(0)(n>=2)

递推关系的解为:  h(n) = C(2n, n)/(n+1)    (n = 0, 1, 2, ...)

C(2n, n)表示在2n个元素中一次任意取n个个,有多少种取法

C(2n, n) = (2n)!/[n! * (2n-n)!]

例题:

先序序列为a, b, c, d的不同二叉树的个数是(B)

A.  13                B.  14                  C.  15                 D.  16

有先序遍历和中序遍历才可以唯一确定一个二叉树,所以该题可以看作“以先序序列a, b, c, d为入栈次序,则出栈个数是多少?”

利用该公式可以求出:

二叉树的个数:(2*4)!/[4! * 4!]/(4+1) = 7 *2 * 5/5 = 14

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值