JAVA实现赫夫曼树

哈夫曼树与哈夫曼编码(java实现) 二叉树的带权路径长度: 设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。 记为: 举例: 给定4个叶子结点,其权值分别为{2,3,4,7},可以构造出形状不同的二叉树 哈夫曼树: 给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树,称为哈夫曼树,亦称最优二叉树。 哈夫曼树的特点: 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。(构造哈夫曼树的核心思想) 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点。 n个 阅读详情

在这里插入图片描述

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
 
class Node<T> implements Comparable<Node<T>> {
    private T data;         //节点数据
    private int weight;     //权值
    private Node<T> left;   //左孩子
    private Node<T> right;  //右孩子
    public Node(T data, int weight) {this.data = data;this.weight = weight;}
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "data:" + this.data + ",weight:" + this.weight + ";   ";
    }
    public int getWeight() {return weight;}
    public Node<T> getLeft() {return left;}
    public void setLeft(Node<T> left) {this.left = left;}
    public Node<T> getRight() {return right;}
    public void setRight(Node<T> right) {this.right = right;}
 
    @Override
    public int compareTo(Node<T> o) {    //重写这个对象的排序方法,这里使用权重进行排序
        // TODO Auto-generated method stub
        if (o.weight > this.weight) {
            return 1;
        } else if (o.weight < this.weight) {
            return -1;
        }
        return 0;
    }
}
 
class HuffmanTree<T> {
    public static <T> Node<T> createTree(List<Node<T>> nodes) {   
        while (nodes.size() > 1) {       //只剩一个节点是,退出循环
            Collections.sort(nodes);     
            Node<T> left = nodes.get(nodes.size() - 1);  //取两个最小的节点
            Node<T> right = nodes.get(nodes.size() - 2);
            Node<T> parent = new Node<T>(null, left.getWeight() + right.getWeight());  //生成新节点,新节点的权值 = 两个权值最小节点的和
            parent.setLeft(left);
            parent.setRight(right);
            nodes.remove(left);        
            nodes.remove(right);
            nodes.add(parent);          
        }
        return nodes.get(0);            
    }
 
    public static void levelDisplay(Node root) {  
        List<Node> list = new ArrayList<>();
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        //层次遍历
        while (!queue.isEmpty()) {
            Node pNode = queue.poll();
            System.out.println(pNode.toString());
            if (pNode.getLeft() != null) {
                queue.add(pNode.getLeft());
            }
            if (pNode.getRight() != null) {
                queue.add(pNode.getRight());
            }
        }
    }
}
 
public class HuffmanTreeTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Node<String>> nodes = new ArrayList<Node<String>>();
        nodes.add(new Node<String>("A", 5));
        nodes.add(new Node<String>("B", 2));
        nodes.add(new Node<String>("C", 7));
        nodes.add(new Node<String>("D", 9));
        Node<String> root = HuffmanTree.createTree(nodes);
        HuffmanTree.levelDisplay(root);
    }
 
}

运行结果:

data:null,weight:23;
data:D,weight:9;
data:null,weight:14;
data:null,weight:7;
data:C,weight:7;
data:B,weight:2;
data:A,weight:5;

java实现霍夫曼树 class Node implements Comparable<Node>{ int value; //权值 Node left; //左子结点 Node right; //右子结点 public Node(int value) { this.value = value; } @Override public String toString() { return "Node{" + 阅读详情

相关推荐

哈夫曼树及哈夫曼编码的实现(java)

NULL 博文链接:https://128kj.iteye.com/blog/1637940

java之哈夫曼树及其实现

哈夫曼树

weixin_51215207的博客 1816

XC7Z010-1CLG400C开发板ADC引脚配置全攻略(附完整引脚列表)

本文详细解析了XC7Z010-1CLG400C开发板的ADC引脚配置方法,涵盖XADC模块基础、CLG400封装的引脚布局、硬件设计规范及Vivado工程配置实战。特别提供了完整的引脚列表和性能优化技巧,帮助开发者高效实现模拟信号采集,适用于Zynq-7000系列开发。

weixin_29188043的博客 467

哈夫曼树 之 Java详解

哈夫曼树的介绍Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。(01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。

Code-lover's Learning Notes 1694

Ghidra逆向分析实战:从安装JDK到解析STM32的bin文件(附SVD插件配置)

本文详细介绍了使用Ghidra进行STM32固件逆向分析的完整流程,从JDK安装配置到SVD插件的应用。通过实战案例展示如何解析bin文件、恢复符号信息以及利用SVD插件识别外设寄存器,帮助开发者高效完成嵌入式设备的逆向工程任务。

weixin_29309475的博客 646

【漏洞修复】Diffie-Hellman Key Agreement Protocol 资源管理错误漏洞(CVE-2002-20001)

Diffie-Hellman Key Agreement Protocol 存在安全漏洞,远程攻击者可以发送实际上不是公钥的任意数字,并触发服务器端DHE模幂计算。

我的博客 1万+

哈夫曼树原理及Java编码实现

**哈夫曼编码有两个特点**: 1. 带权路径长度WPL最短且唯一;【核心减少编码的操作】 2. 编码互不为前缀(一个编码不是另一个编码的开头)【可进行还原用途】。 **应用场景**:压缩文件。 **公式**:路径长度:WPL = l1× w1+l2× w2 +…+ ln × wn,w表示权值,n表示叶子节点个数。 > 哈夫曼编码是如何进行应用的呢,有什么具体的示例呢? 哈夫曼树是一颗二叉树,其是根据元素的权重来进行构成的一棵树,在树上的每个节点val都使用0或1来进行表示。 + 这个权重指的

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 2738

Windows事件ID 10010报错:DCOM注册超时与Game Bar修复指南

DCOM(分布式组件对象模型)是Windows中用于跨进程组件通信的核心机制,其注册超时问题常表现为事件ID 10010报错。当Game Bar的PresenceWriter组件因权限配置不当、组件损坏或开机资源竞争而无法在限定时间内向DCOM注册时,系统会记录该错误,并可能伴随DCOM服务主机CPU占用升高或游戏栏功能异常。理解DCOM激活原理与Network Service账户权限,有助于从权限修复、组件重注册及开机时序优化等层面系统排查。本文针对不同Windows版本,提供从静默处理到根治的完整方案,

weixin_33563728的博客 951

赫夫曼树、赫夫曼编码

文章目录一、基本概念:二、创建赫夫曼树:1.思路:2.代码实现:三、赫夫曼编码:1.基本原理:2.案例:数据压缩(1)创建赫夫曼树:(2)生成赫夫曼编码和赫夫曼编码后的数据: 一、基本概念: 赫夫曼树几个重要概念和举例说明: 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1。 结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。

deku1018的博客 302

格(Lattice)基础(一)

有关格的基础概念,和相关的格难题

Amire0x的小乐园 5700

番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注

本文介绍了包含12,250张图像的番茄叶片病害检测数据集,涵盖10种常见病害类型及健康叶片,采用YOLO格式标注。数据集具有三大核心价值:科研层面填补病害样本空白,推动算法创新;产业应用支持精准诊断、早期预警,降低损失20-40%;社会生态方面减少农药使用15-30%,助力绿色农业。该数据集作为AI与农业结合的数字基础设施,适用于计算机视觉项目、科研实验等场景。

m0_73878864的博客 1136

Java实现赫夫曼树的构建和遍历

11.2 赫夫曼树 11.2.1 基本介绍 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 11.2.2 赫夫曼树几个重要概念和举例说明 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层

当一个合格的软件工程师 3145

攀藤PMS系列传感器STM32驱动开发与数据解析实战

本文详细介绍了攀藤PMS系列传感器与STM32微控制器的驱动开发与数据解析实战,涵盖硬件连接、数据协议解析、驱动源码编写及数据处理优化。重点解析了传感器数据帧结构,提供了完整的STM32驱动实现代码,并分享了实际应用中的问题排查与性能优化经验,帮助开发者快速实现高精度颗粒物浓度检测。

milk8的博客 348

赫夫曼树原理以及java实现

赫夫曼树原理以及java实现 ##1.最优二叉树(赫夫曼树) ###在学习赫夫曼树之前,我们了解一下路径与路径长度的概念 ###1.1:路径:从树的一个结点到另一个结点之间的分支构成这两个节点之间的路径 ###1.2:路径长度:路径上的分支数目称作路径长度 ###1.3:树的路径长度:是从树根到每一结点的路径长度之和 ###1.4:结点的权:赋予结点上的一个有意义的实数 ###1.5:结点的带权路...

m0_45097637的博客 294

YOLO11-Seg优化:卷积变体系列篇 | 动态蛇形卷积(Dynamic Snake Convolution) | ICCV2023

动态蛇形卷积(Dynamic Snake Convolution),增强微小特征提取能力,引入到YOLO11-Seg,与C3k2结合实现二次创新

会AI的学姐 371

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

定义:赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树。 叶子结点的带权路径:叶子结点权值*到根节点的路径长度(叶结点的层数) 树的带权路径长度WPL(weighted path length):树中所有叶子结点的带权路径长度之和。

东白的博客 428

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

赫夫曼树

赫夫曼树介绍重要概念构成赫夫曼树的步骤:代码 介绍 1、给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树(哈夫曼树); 2、赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近; 重要概念 1、路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根节点到第L层结点的路径长度为L-1 2、结点的权以及带权路径长度:若将树中结点赋给一个有

weixin_43239564的博客 214

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java实现赫夫曼树

一、基本介绍 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 二、赫夫曼树几个重要概念和举例说明 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的...

闵浮龙的博客 355

java 实现最优二叉树_哈夫曼树(最优二叉树)及其Java实现

一、定义一些定义:节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度树的路径长度:从树的根节点到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。树的带权路径长度(Weighte...

weixin_42178688的博客 544

霍夫曼树(赫夫曼树、哈夫曼树)

给定n个权值做为n个叶子节点,若该树的带权路径长度达到最小,这棵树为最优二叉树,也称赫夫曼树。

qq_56460466的博客 991

Java实现赫夫曼树

一、概念 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,这样的二叉树称为最优二叉树,也称为哈夫曼树(HuffmanTree)。 赫夫曼树是带权路径最小的树,权值较大的离根节点越近,赫夫曼树图片如下: 二、构建赫夫曼树思路分析 1)从小到大进行排序,将每一个数据,每一个数据都是一个结点,每个结点可以看成是一颗最简单的二叉树。 2)取出根节点权值最小的两颗二叉树 3)组成一颗新的二叉树,该树的二叉树的根节点的权值是前面两颗二叉树的根节点的权值。 4)再将这颗新的二叉

文艺的码农青年的博客 265

赫夫曼树原理以及java实现(新手向)

赫夫曼树原理以及java实现 看了很多大佬写的关于赫夫曼树的讲解,今天我也抽些时间写一下自己的理解吧。 开讲之前,先提提 “权值” 这个概念:权值就是数据出现的频率,比如在字符串“AAAABBBCCD”中,A的权值是4,B是3,C是2,D是1。 关于赫夫曼树,我是这样理解的:用集合装结点,将集合中的结点根据权值从小到大排序,每次取权值最小的两个结点(也就是排序后的前两个结点)作为叶结点,生成一个根结点,把这两个叶结点从集合中移除,将根结点放进集合之中,再次对集合中的结点排序,重复上述操作直至集合中只有一个根

qq_45461593的博客 284

赫夫曼树(java)

赫夫曼树:当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。

一起coding,一起嗨。 971

赫夫曼树(JAVA实现)

基本介绍: (1)给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称赫夫曼树(哈夫曼树) (2)赫夫曼树是带权路径长度最短的树,权值较大的节点离根比较近 重要概念: (1)路径和路径长度:在一颗树中,从一个结点往下可以达到孩子或者孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从第L层节点的路径长度为L-1 (2)结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该节点的权,结点的带权

weixin_43589025的博客 265

【数据结构-Java】Java实现赫夫曼树

文章目录1、赫夫曼树基本介绍2、赫夫曼树几个重要概念和举例说明3、赫夫曼树创建思路图解4、赫夫曼树的代码实现 1、赫夫曼树基本介绍 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度**(wpl)**,达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 2、赫夫曼树几个重要概念和举例说明 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路

小游子YKY的博客 869
上一篇: Java寻找迷宫路径
下一篇: Java并发-volatile,synchronized关键字,happends-before原则,Lock锁和CAS操作
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值