求N个结点能够组成的二叉树的个数

该博客介绍了如何运用卡特兰数原理计算特定数量节点能构成的不同二叉树种类。通过Java的BigInteger类处理大整数,避免整型溢出,实现了从输入节点数到二叉树种类的计算过程,并提供了完整的Java代码示例。
摘要由CSDN通过智能技术生成

用到的是卡特兰数原理

比如3个节点可以构成的不同的二叉树一共有5种

Cm n=n!/m!*(n-m)!=n*(n-1)*(n-2)*……(n-m+1)/m*(m-1)*(m-2)……1

前面这一部分就是Am n的计算公式,用Am n 再除以m的阶乘得到的就是Cm n

计算过程中,如果用的是整型,很容易超出它的最大范围

利用Java提供的BigInteger可解决这一问题

创建BigInteger变量

可以将数字转化为long,利用valueof方法将其转化为BigInteger

也可以利用构造方法,将字符串转化为long

BigInteger a=BigInteger.valueof(1);

BigInteger b=BigInteger.valueof("1");

加减乘除分别是

a.add(b)

a.subtract(b)

a.multiply(b)

a.divide(b)

package May04;

import java.math.BigInteger;
import java.util.Scanner;

public class fu201903 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		//n个二叉树结点
		int n=in.nextInt();
		//关键是求c n 2n,涉及到BigInt类的加减乘除
		//add subtract multiply divide
		//初始化是BigInteger result=new BigInteger(s)
		BigInteger numerator =BigInteger.valueOf(1);
		BigInteger denominator =BigInteger.valueOf(1);
		//求阶乘
		//求分子
		for(int i=2*n;i>=n+1;i--)
		{
			numerator=numerator.multiply(BigInteger.valueOf(i));
		}
		//求分母
		for(int i=n;i>=1;i--)
		{
			denominator=denominator.multiply(BigInteger.valueOf(i));
		}
		//相除再除以n+1
		BigInteger result =numerator;
		result=result.divide(denominator.multiply(BigInteger.valueOf(n+1)));
		System.out.println(result);	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值