哈夫曼树

哈夫曼树及哈夫曼树编码译码详解 使用链表形式,实现哈夫曼树的构建及编码译码 阅读详情

哈夫曼树基本介绍

  • 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二又树为最优二又树,也称为哈夫曼树(Huffman Tree),还有的书翻译为赫夫曼树。
  • 哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

哈夫曼树的重要概念

  1. 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
  2. 结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。
  3. 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length),权值越大的结点离根结点越近的二又树才是最优二叉树。
  4. WPL最小的就是哈夫曼树。

创建哈夫曼树

  1. 从小到大进行排序,将每一个数据,每个数据都是一个节点,每个节点可以看成是一颗最简单的二叉树
  2. 取出根节点权值最小的两颗二叉树
  3. 组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
  4. 再将这颗新的二又树,以根节点的权值大小再次排序,不断重复1-2-3-4的步骤,直到数列中,所有的数据都被处理,就得到一颗哈夫曼树

哈夫曼树代码实现

package com.huffmantree;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class HuffmanTree {

	public static void main(String[] args) {
		int arr[] = { 13, 7, 8, 3, 29, 6, 1 };
		Node root = createHuffmanTree(arr);
		// 测试
		preOrder(root);
	}
	// 编写一个前序遍历的方法
	public static void preOrder(Node root) {
		if (root != null) {
			root.preOrder();
		} else {
			System.out.println("空树");
		}
	}

	/**
	 * @Method_Name:createHuffmanTree
	 * @Description: 创建哈夫曼树
	 * @param arr
	 * @date:2020年1月7日
	 * @author:20152 LuLong
	 */
	public static Node createHuffmanTree(int[] arr) {
		// 第一步为了操作方便
		// 1.遍历arr数组
		// 2.将arr的每个元素构成成一个Node
		// 3.将Node 放入到ArrayList中
		List<Node> nodes = new ArrayList<Node>();
		for (int value : arr) {
			nodes.add(new Node(value));
		}
		// 处理的过程用一个循环解决
		while (nodes.size() > 1) {
			// 排序 从小到大
			Collections.sort(nodes);
			System.out.println("nodes" + nodes);
			// 取出根节点权值最小的两颗二叉树
			Node leftNode = nodes.get(0);// 取出最小的节点
			Node rightNode = nodes.get(1);// 取出第二小的结点
			Node parent = new Node(leftNode.value + rightNode.value);// 构建一棵新的二叉树
			parent.left = leftNode;
			parent.right = rightNode;
			// 从ArrayList中删除处理过的二叉树
			nodes.remove(leftNode);
			nodes.remove(rightNode);
			// 将parent加入到nodes
			nodes.add(parent);
		}
		// 返回哈夫曼树的root结点
		return nodes.get(0);
	}
}

/**
 * @ClassName:Node
 * @Description:TODO 创建节点类 为了让Node对象排序Collections集合排序;让Node实现Comparable接口
 */
class Node implements Comparable<Node> {
	int value;// 节点权值
	Node left;// 指向左节点
	Node right;// 指向右节点
	// 前序遍历
	public void preOrder() {
		System.out.println(this);
		if (this.left != null) {
			this.left.preOrder();
		}
		if (this.right != null) {
			this.right.preOrder();
		}
	}
	public Node(int value) {
		this.value = value;
	}
	@Override
	public String toString() {
		return "Node [value=" + value + "]";
	}
	@Override
	public int compareTo(Node o) {
		// this.value-o.value 表示从小到大排
		// -(this.value-o.value)表示从大到小
		return this.value - o.value;
	}
}
滤波电路Multisim电路仿真实验汇总——硬件工程师笔记 本文系统介绍了滤波电路的基础知识及其应用。首先按频率选择性和实现方式对滤波电路进行分类,详细阐述了低通、高通、带通、带阻滤波器以及无源、有源滤波器的特点。接着重点分析了桥式整流电容滤波、电感滤波、LC滤波和CRπ型滤波四种典型电路的工作原理、应用场景及设计要点。通过理论公式和实际案例,指导如何选择滤波元件参数,考虑寄生效应,并通过仿真验证设计效果。最后提供了硬件工程师笔试面试相关的技术资源链接,包括器件知识、电路仿真及企业真题解析等内容。本文可作为电子电路设计领域工程技术人员的学习参考资料。 阅读详情

相关推荐

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

数据结构-期末复习(一)

黄色标黄的是答案,蓝色是自己做的,绿色的是没记住的。

weixin_61083660的博客 2553

Hermes Agent Windows安装教程:本地智能体离线部署实战

本地智能体(Local Agent)是一种运行在用户设备端、无需云端依赖即可响应自然语言指令并自动化执行任务的轻量级AI运行时框架。其核心原理基于配置驱动的任务监听与脚本调用机制,通过服务化驻留实现持续响应能力,技术价值在于保障数据隐私、规避API调用限制、适配内网及老旧系统环境。典型应用场景包括财务报表自动整理、科研仪器数据归档、IT资产变更通知等Windows桌面自动化需求。本文聚焦Hermes Agent这一主流开源实现,围绕Windows平台特有的服务注册、权限模型、杀软拦截、中文路径与YAML编码

weixin_34411563的博客 433

数据结构-哈夫曼树(最优二叉树)

哈夫曼树是一种重要的数据结构,它可以用来实现数据的压缩和加密。哈夫曼树的构建是基于数据的出现频率来进行的,出现频率高的数据在哈夫曼树中的深度较浅,而出现频率低的数据在哈夫。

m0_61789994的博客 4833

XGBoost算法案例 - 红酒品质分类

数据集共包含 11 个特征,共计 3269 条数据. 我们通过训练模型来预测红酒的品质, 品质共有 6 个各类别,分别使用数字: 0、1、2、3、4、5 来表示。

YIAN爱学习的博客 449

MOOS-ivp实战:从零搭建水下机器人通信系统(Ubuntu 22.04版)

本文详细介绍了在Ubuntu 22.04系统上从零开始搭建MOOS-ivp水下机器人通信系统的完整实战流程。内容涵盖环境准备、核心安装、MOOSDB通信模型解析、自定义应用节点开发、以及调试监控工具链的使用,旨在帮助开发者快速掌握这一分布式机器人系统框架,构建稳定可靠的水下机器人通信与控制系统。

snow3的博客 633

数据结构 —— 哈夫曼树

到达叶子节点的路径都是不一样的,没有一个到达叶子节点时经过其它的叶子节点,因此每个叶子节点的编码不可能是其它叶节点编码的前缀,保证了哈夫曼编码是前缀编码。传送字符为ABACCDA,A—00,B—01,C—10,D—11, 编码后为:00010010101100。5%需要判断1次,15%需要判断2次,40%需要判断3次,30%需要判断4次,10%需要判断4次、5%需要判断3次,15%需要判断3次,40%需要判断2次,30%需要判断2次,10%需要判断2次。如何找到效率最高,最优判断次数的判断树呢?

weixin_43254100的博客 2250

xenomai内核解析--嵌入式实时linux概述

Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强...

wsg1100 3699

哈夫曼树(最优二叉树)、哈夫曼编码

哈夫曼树一、哈夫曼树基本概念二、哈夫曼树的构造算法 一、哈夫曼树基本概念 (1)路径:从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径 (2)路径长度:路径上的分支数目称作路径长度。 (3)树的路径长度:从树根到每一结点的路径长度之和。 (4)权:将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。 (5)结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘...

ker的博客 6348

从d、q轴电流到电机性能:FOC控制中角度偏移的实战影响与调试策略

本文深入探讨了永磁同步电机FOC控制中d、q轴电流与角度偏移对电机性能的影响及调试策略。通过分析角度偏移导致的效率下降、电流异常等问题,提供了实用的四步调试法和参数优化技巧,帮助工程师有效提升电机控制精度和效率。

weixin_29264201的博客 293

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 442

树,二叉树,哈夫曼树...

写在前面 之前讲的链表,栈,队列等都是线性存储结构,都是一对一的关系。而树是具有一对多关系的数据结构。比如我们经常说的湖北省武汉市,湖南长沙的一个类图,就类似于一颗倒转的树。 什么是树 树是一种数据结构,由n个节点构成的具有层次关系的有限集合。 树的基本术语 节点:树中的每一个数据元素都是节点(A,B…) 节点的度:节点的子树个数(A的子树为B和C) 树的度:树中所有节点最大的度(树A和树C的度都是2) 叶子节点:度为0的节点(D,E,F) 节点的层次:树的根开始,树根所在的层为第一层,根的子节点所在的

个人站点:javatv.net 1445

让 ABAP BAPI_COSTACTPLN_POSTPRIMCOST 不再沉默:一套可落地的参数一致性校验与排错打法

SAP BAPI_COSTACTPLN_POSTPRIMCOST 沉默失败分析与解决方案 问题现象 使用 BAPI_COSTACTPLN_POSTPRIMCOST 上传计划数据时,接口执行不报错但数据未写入 COSP 等计划表,呈现"沉默失败"现象。 根本原因 索引关联断裂:INDEXSTRUCTURE 中 OBJECT_INDEX 和 VALUE_INDEX 未正确关联 COOBJECT 和 PERVALUE/TOTVALUE 表的数据 对象定义冲突:COOBJECT 中同一行填写了多

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

哈夫曼树和哈夫曼编码

本文主要是用C语言实现数据结构之哈夫曼树,同时对应哈夫曼编码。

墨城烟柳ベ旧人殇的博客 5012

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【树】哈夫曼树及其构造

1.哈夫曼树的基本概念 结点间的路径和路径长度 路径是指从一个结点到另一个结点之间的分支序列 路径长度是指从一个结点到另一个结点所经过的分支数目。 结点的权和带权路径长度 在实际的应用中,人们==给树的每个结点赋予一个具有某种实际意义的实数,称该实数为这个结点的权。==在树型结构中,把从树根到某一结点的路径长度与该结点的权 的乘积,叫做该结点的带权路径长度。  树的带权路径长度 树的带权路径...

weixin_45765128的博客 4万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【哈夫曼树】创建哈夫曼树

在一棵树中,从一个结点到另外一个结点所经过得所有的结点,我们成为两个结点之间得路径。从A到叶子结点E的路径就是:A->B->D->E;在一棵树中,从一个几点到另外一个结点所经过的边的数量,就是路径长度。从根结点A到叶子结点E,共经过了3条边,因此路径长度是3。树的每一个结点,都可以拥有自己的“权重”(weight),权重在不同的算法中起到不同的作用。结点的带权路径长度 = 树的根节点到该结点的路径长度 * 该结点权重。

weixin_52958292的博客 5401

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Huffman树(哈夫曼树)

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以...

南方以北 1万+

哈夫曼树以及哈夫曼算法

一、哈夫曼树的定义 1、哈夫曼树:最优树即带权路径长度(WPL)最短的树 “带权路径长度最短”是在"度相同”的树中比较而得的结果,因此有最优二叉树、最优三叉树之称等等。 2、哈夫曼树:最优二叉树即带权路径长度(WPL)最短的二叉树 因为构造这种树的算法是由哈夫曼教授于1952年提出的,所以被称为哈夫曼树,相应的算法称为哈夫曼算法。 二、哈夫曼树的特点 1、满二叉树不一定是哈夫曼树 2、哈夫曼树中权越大的叶子离根越近 3、具有相同带权结点的哈夫曼树不唯一 三、哈夫曼算法(构造哈夫曼树的方法)

kxbdys的博客 6130

哈夫曼树的绘制

数据结构之哈夫曼树绘制本人还是一个年轻的程序猿(还是个学生),请大家多多指教! 哈夫曼树 已知权重绘制哈夫曼树 开始我的表演 Step 1. 已知权重:2,3,3,4,7,6 Step 2. 选取其中小的两个权重:2,3 Step 3. 把2,3作为孩子结点如下图: Step 4. 重复Step 2的步骤取出权重值里两个较小的权重值3,4并进行绘制树,如下图: Step 5. 重复Step 2的步骤

yypClever的博客 2万+

java 实现哈夫曼树

一、 什么是哈夫曼树 要理解什么是哈夫曼树,首先要理解几个概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度:路径上的分支数目。 树的路径长度:从树根到每一个结点的路径长度之和。(完全二叉树就是树的路径长度最短的二叉树) 考虑带权的结点 结点的带权路径长度:从该结点到树根之间的路径长度和结点上权的乘积。 树的带权路径长度:树的所有结点的带权路径之和(...

www_chinese_com的博客 5376
上一篇: 堆排序
下一篇: 二叉排序树
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值