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

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));
    }
}

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼树是一种二叉树,它的叶子节点对应于符号集中的每个符号,并且每个符号的出现频率成为该叶子节点的权值。哈夫曼树的构造过程是通过反复选择两个权值最小的节点来构建的,直到所有节点都被合并成为根节点。构建好的哈夫曼树可以用来生成哈夫曼编码,即对于每个符号,将其在哈夫曼树上的路径转换为二进制编码,从而使得权值较小的符号具有较短的编码,权值较大的符号具有较长的编码,从而达到压缩数据的目的。 具体的哈夫曼树和哈夫曼编码的构造流程如下: 1. 统计每个符号在数据中出现的频率,将其作为叶子节点的权值,构建出一个只包含叶子节点的森林。 2. 从森林中选择权值最小的两个节点,将它们合并成一个新的节点,并将其权值设为两个节点权值之和。 3. 将新的节点插入到森林中,从森林中删除原来的两个节点。 4. 重复步骤2和步骤3,直到森林中只剩下一个节点为止,这个节点就是哈夫曼树的根节点。 5. 对于哈夫曼树中的每个叶子节点,从根节点开始沿着路径向下走,每当走到一个左子节点时,将当前的编码位设为0,每当走到一个右子节点时,将当前的编码位设为1,直到到达叶子节点为止,此时叶子节点的编码就是从根节点到达该节点所经过的所有编码位组成的二进制编码。 6. 将每个符号的编码记录下来,即可得到哈夫曼编码。 需要注意的是,哈夫曼树和哈夫曼编码的构造过程是基于数据中每个符号的频率来进行的,因此在不同的数据集中,哈夫曼树和哈夫曼编码可能会有所不同

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值