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

机器学习发展历史及现状(重要的期刊,会议,大牛总结)

1 引言 机器学习是指通过计算机学习数据中的内在规律性信息,获得新的经验和知识,以提高计算机的智能性,使计算机能够像人那样去决策。随着各行业对数据的需求量增多,对处理和分析数据的效率要求变高,一系列机器学习算法应运而生。机器学习算法主要是指通过数学及统计方法求解最优化问题的步骤和过程。针对不同的数据和不同模型需求,选择和使用适当的的机器学习算法可以更高效地解决一些实际问题。本文将从机器学习的起源...

Oscar2018的博客 5万+

哈夫曼树 之 Java详解

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

Code-lover's Learning Notes 1694

Win10如何使用BC3.1精简版

Win10如何使用BC3.1精简版 使用Borland C++3.1 学习μC/OS—Ⅱ几乎是现在的普遍做法,但是由于Win10系统不能直接使用BC3.1,所以需要用到DOSBox。 1、解压bc3.1精简版压缩包,本文将BC3.1文件夹复制在D盘下,DOSBOX按照默认路径安装。下图为两者安装目录图示: 2、修改DOSBOX的配置文件,找到DOSBox文件安装路径,记事本方式打开DOSBox 0.74-3 Options.bat文件,在此文件末尾添加: MOUNT C D:\BC//意为把D:\BC目录

qq_45547236的博客 2378

腾讯、飞书等在线表格自动化编辑--python

在线文档自动化处理数据

qq_32828053的博客 2万+

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

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

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

全面解读 SAP Business Data Cloud

SAP 在 2025 年初正式推出(简称BDC),它把、以及全新的统一封装为一项完全托管的 SaaS 服务,配套交付“语义层 + 数据产品 + 智能应用”三层能力,为企业构建真正贴近业务语境的 “Business Data Fabric”。这一方案不仅解决了跨系统数据碎片化、治理难及 AI 训练数据可信度低的问题,还为现有 BW 客户、S/4HANA以及第三方工作负载提供云上现代化路径和零拷贝数据共享机制。本文将围绕技术架构、核心组件、业务场景、迁移路线及未来展望展开,以 Henkel 等真实案例佐证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 909

赫夫曼树、赫夫曼编码

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

deku1018的博客 302

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

【面试系列】数据工程师高频面试题及详细解答

本文针对数据工程师岗位,提供了详尽的面试题库和解答,分为初级、中级和高级三个层次。初级面试题主要涉及基本的数据处理和ETL工具的使用,如SQL查询、数据清洗和基本的数据建模。中级面试题重点考察数据管道设计、数据库优化和大数据平台的应用。高级面试题则深入探讨高级数据处理技术、分布式系统架构和数据湖的实现。通过这些问题和解答,候选人可以全面了解数据工程师岗位所需的技能,帮助其更好地准备面试。常考知识点总结部分则系统归纳了数据工程师岗位的关键技能领域。

在路上的专栏 2376

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

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

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

DDR5 JEDEC标准简析:一次读懂DDR5的核心规范!

JEDEC,全称是,中文名称是「电子元件工程联合委员会」,它是全球权威的存储接口标准制定机构。我们常见的 DDR2、DDR3、DDR4、DDR5 都是它搞出来的。📌 JEDEC 就像存储接口界的“裁判+编剧”——规定谁该怎么跑,怎么演,怎么配合。

weixin_43199439的博客 2572

赫夫曼树原理以及java实现

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

m0_45097637的博客 294

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7762

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

东白的博客 428

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

赫夫曼树

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

weixin_43239564的博客 214

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值