给定一个序列求二叉树的个数,就相当于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