统计和生成所有不同的二叉树

import java.util.Scanner;

// OJ平台通过率低,小数据测试没有问题,如发现代码问题,欢迎下方留言
// 大体思路为 n个节点,必然有一个为根节点,剩余n-1个要分配到左子树和有子树中
// 从左子树为0个开始,一直到左右子树的个数相等,不用在增加左子树的节点,因为
// 左右为对称结构,乘以二可以了

// 输入8,结果为1430没有问题
class Main{
    
    public static int function(int n){
        if(n <= 0) return 0;
        if(n == 1) return 1;
        if(n == 2) return 2;
        
        int[] temp = new int[n+1];
        temp[0] = 1;
        temp[1] = 1;
        temp[2] = 2;
        
        // 有n个节点的树就存放在数组temp[n]的位置
        for(int i=3; i<=n; i++){
            int value = 0;
            int left = 0;
            
            // 除了根节点外,只有number个节点
            int number = i-1;
            // 从左边为0个开始分
            // 左子树可能性情况 * 右子树可能情况 

            while(left <= (number-left)){
                
                // 如果left = right 这个时候不能 * 2,因为和right = left排布没有区别
                if(left == (number-left))
                    value += temp[left] * temp[number-left];
                else
                    value += temp[left] * temp[number-left] * 2;
                left ++;
            }
            temp[i] = value;
        }
        return temp[n];
    }
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int number = scan.nextInt();
        System.out.println(function(number));
    }
}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值