试求N个节点所能组成的二叉树的个数以及求解方法

来源:互联网 发布:js 验证码倒计时 编辑:程序博客网 时间:2024/05/22 10:31

定义f(0)= 1

当只有一个节点时,只会生成一种类型的二叉树,记做f(1)= 1

当有两个节点时,首先固定一个节点(即固定根节点),剩下一个节点可以排放的位置为1= 1+0 = 0+1[即左边一个节点右边0个节点或者左边0个节点右边1个节点]记做f(2)= f(1)*f(0) + f{0}*f(1) = 2

当有三个节点,首先固定根基点,剩下3-1=2个节点的安放位置:2= 2*0 + 1*1 + 0*2 记做f(3)= f(2)*f(0) + f(1)*f(1) + f(0)*f(2) = 2 + 1 + 2 = 5

当有n个节点时,也是首先固定下根节点,剩下n-1个节点,可以如下排放:n-1= (n-1)*0 + (n-2)*1 + (n-3)*2 + … + 0*(n-1)记做f(n)= f(n-1)*f(0) + f(n-2)*f(1) + f(n-3)*f(2) + f(n-4)*f(3) + …f(0)*f(n-1)


f(1),f(2), f(3), …, f(n)正好符合卡特兰数


递推公式为:

f(n)= f(n-1)*(4*n-2)/(n+1)

通向公式:

f(n)= C(n, 2n)/(n+1) = (2n)!/((n!)*(n+1)!)


JAVA算法实现

public Class Catalan {    public static void main(String[] args) {        System.out.println(“请输入需要计算的卡特兰数:”);        Scannerreader = new Scanner(System.in);        int num = reader.nextInt();        int result = getCatalina(num);        System.out.println(num+ “ 卡特兰数为: ” +result);    }    public static int getCatalan(int num) {        if(num == 1) {            return1;        }        return getCatalan(num-1) * (4*n-2) / (n+1);    }}


注:

  1. 满二叉树:除了叶子节点外,每个节点都有左右子树,所有的叶子节点都在最后一层

  2. 完全二叉树:深度为k层,除了第k层,其它每一层的节点数都达到该层所能容纳的最大节点数

  3. 平衡二叉树:左右子树高度差的绝对值不超过1


原创粉丝点击