Huffman树构造基础java版

哈夫曼树和哈夫曼编码——二叉排序树——最小生成树 哈夫曼树和哈夫曼编码1.将权值从小到大排序;2.然后每次选取最小的两个节点,组成新的节点(原来两个节点的 和)放入有序序列;3.接着选择最小的两个。哈夫曼树的左分支为0,右分支为1,从根节点到每个节点比如经历两次右分支则,编码就是11.二叉排序树选取第一个为根节点,然后把下一个要插入的节点与根节点进行比较,大的放在右子树,小的放在左子树位置。最小生成树不管是哪种最小生成树的方法,权值之和都是唯一的... 阅读详情

前言:

Huffman树,即最小生成树。

其构造过程如下:

哈夫曼树并不唯一,但带权路径长度一定是相同的。

如下,有权值为1,5,8,4的四个结点,

其huffman树构造过程如下:

总的来说,可以归结为以下几个步骤:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,哈夫曼树的构造规则为:

1. 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); 
2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; 
3. 从森林中删除选取的两棵树,并将新树加入森林; 
4. 重复(02)、(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

话不多说,代码如下:

package Huffman树;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Huffman {

	static class node implements Comparable<node>{//自排序

		int weight;//权值
		node lchild;
		node rchild;
		public node(int w,node l,node r)
		{
			this.weight=w;
			this.lchild=l;
			this.rchild=r;
		}
		
		public int compareTo(node o) {
			return this.weight-o.weight;
		}
	}
	
	
	static node createHuffmanTree(ArrayList<node> nodes)
	{
		while(nodes.size()>1)
		{
			Collections.sort(nodes);//排序
			
			node l=nodes.get(0);
			node r=nodes.get(1);
			//System.out.println(l.weight+" "+r.weight);
			node p=new node(l.weight+r.weight,l,r);
		
			//移走两个最小的
			nodes.remove(0);
			nodes.remove(0);
			//把大的放进去
			nodes.add(p);
		}
		return nodes.get(0);
	}
	
	//前序遍历,并求WPL 带权路径长度
	static long WPL=0;
	static void preorder(node root,int levelNum)
	{
		if(root.lchild==null)
		{
			WPL+=root.weight*levelNum;
			return;
		}
		else
		{
			preorder(root.lchild,levelNum+1);
			preorder(root.rchild,levelNum+1);
		}
		
	}
	
	public static void main(String[] args) {	
		ArrayList<node> nodes=new ArrayList<node>();
		Scanner cin=new Scanner(System.in);
		int n=cin.nextInt();
		for(int i=0;i<n;i++)
		{
			int w=cin.nextInt();//这里我直接把它的权值当做name了
			nodes.add(new node(w,null,null));
		}
		node r=createHuffmanTree(nodes);
		
		WPL=0;//WPL:带权路径长度
		preorder(r,0);
		System.out.println("WPL: "+WPL);
		cin.close();
	}

}

结果:

Unity与IOS交互,调用IOS系统相机和相册 与IOS的交互,在步骤上要比android简单许多,不会产生因为系统版本,或者包名导致的许多问题。过程中最头疼的一个问题是IOS回调Unity,很简单的一个问题,搞了半天。 阅读详情

相关推荐

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1169

最小生成树与哈夫曼树

转载自添加链接描述 最小生成树 定义:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。 算法: Kruskal算法(加边法):初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。 Prim算法(加点法):每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。 哈夫曼树 定义:...

weixin_43673669的博客 5296

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 187

哈夫曼树和最小生成树

首先给我们一串权值,然后我们需要让这串权值组成一个树,然后当他的wpl最小我们可以发现当他的小权值离根节点越远,大权值离根节点越近的时候,我们这个时候构建出来的树就是wpl最小的树,也就是我们说的哈夫曼树构建的方法我演示一个当我们有这样子的一串权值的时候我们先选出3 5也就是他最小的和第二小的,把最小的当成左孩子,另一个为右孩子,然后他们的父节点就是3+5=8,就是8,然后再把8选入原串中,把我们刚刚选出来的两个数字去除,然后再来选两个最小的和第二小的数最后我们就可以得到。

zt235的博客 1957

光学系统设计:波段、光源、光纤与探测器匹配指南

在光学测量和光纤通信系统中,波段、光源、光纤和探测器的匹配关系是系统设计的核心基础。波段指电磁波谱中的特定波长范围,光源负责产生特定波长的光信号,光纤作为传输介质需要与波长匹配以降低损耗,探测器则负责将光信号转换为电信号。理解各组件的光谱特性对于系统性能至关重要,例如在850nm短波长多模光纤系统中,VCSEL激光器与PIN光电二极管的组合能提供最佳性价比。典型应用场景包括生物医学成像、光纤通信和气体传感,其中光谱重叠优化、模场直径匹配和偏振特性协调是关键技术要点。通过实测数据对比不同组合的传输性能,可以为

weixin_33812433的博客 338

Altium Designer 16安装教程(Windows11、小白教程)

Altium Designer 16在Windows11中的超详细安装教程

qq_47003770的博客 1万+

哈夫曼树(最优二叉树)、 最小生成树、最短路径、拓扑排序

树中的内容: --------------------------------------------------------------------------------------------------------------------------------- 图中的内容: 带权图的最短路径和距离:

m0_56639363的博客 2099

SAP_MM模块通过CC11 创建物料版本

通过本文,我们了解了 SAP 的[SAP_MM模块通过CC11 创建物料版本]的基本概念和应用方法。当物料主数据、BOM(物料清单)、工艺路线等对象需要进行变更控制时,通过创建“版本”或“更改单”来记录、控制和追溯变更。创建完变更主记录(Change Number)后,可在物料主数据维护时引用它,从而创建物料版本化信息。,在其中可以定义物料、BOM、工艺路线等对象的变更版本信息,从而在系统中实现版本化的物料管理。

我小时候很黑的博客 816

赫夫曼树和最小生成树的区别是什么???它们一样吗??

你并比任何人聪明! 你所拥有的只是,吸取别人的优点,发现自己的问题,谦卑自己的学习态度,不断学习 你只有不断学习,才能不落后! 哈夫曼树 和最小生成树一样吗??? 它们的区别是什么???

H002399的专栏 2795

2026最新贝壳二手房爬虫实战:突破极验5.0滑块验证码,完整房源数据采集方案

本文详细介绍了2026年贝壳找房爬虫技术方案,重点突破其极验5.0滑块验证码等反爬机制。文章首先解析了贝壳六大核心反爬模块,包括AI驱动的验证码、设备指纹绑定和TLS指纹识别等。针对最难破解的滑块验证码,提出了基于YOLOv11深度学习模型的缺口检测方案,准确率达99.5%,并结合人类行为轨迹模拟实现98%以上的成功率。最后设计了分布式爬虫架构,包含任务调度、代理池、验证码服务和数据清洗等模块,为大规模采集贝壳真实房源数据提供了完整解决方案。该方案在复杂反爬环境下仍保持高效稳定,具有重要的商业和研究价值。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2054

开源推荐:5个最实用的AIGC风格迁移项目

随着人工智能技术的飞速发展,AIGC(人工智能生成内容)领域取得了显著的成果。风格迁移作为AIGC中的一个重要分支,旨在将一种图像的风格应用到另一种图像上,创造出具有独特艺术效果的新图像。本文的目的是为读者推荐5个最实用的AIGC风格迁移开源项目,详细介绍这些项目的技术原理、使用方法和应用场景,帮助读者在实际项目中选择合适的工具进行风格迁移。文章的范围涵盖了这些项目的核心概念、算法原理、数学模型、项目实战以及相关的学习资源和未来发展趋势等方面。

AI 原生应用开发的博客 1704

Java数据结构课程设计 构造Huffman树

题目:以7个权值:7,5,1,4,8,10,20为例,构造Huffman树。 import java.util.*; public class HuffmanTree { private List nodes; public static void main(String[] args) { Scanner reader = new Scanner(System.in); i

揸支枪|去打仗 1287

2025年11月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(二)

本文整理了2025年11月架构设计师考试的16-30题真题及解析,涵盖多个计算机系统知识领域。主要内容包括:Linux绝对路径以根目录开始(A);模块调用下层数量用扇出表示(B);游乐园问题通过集合运算得出10人未游玩(B);磁盘位示图计算为200字节(C);测试用例核心是输入与预期输出(D)。其他题目涉及软件可靠性测试概念(B错)、评价程序准确度排序(真实程序最高,A)、测试阶段顺序(单元→组装→系统,A)、Web服务器压力测试前置步骤(C)、分时系统响应时间影响因素(用户数量多,A)、逆向工程方法(基于

一几文的编程学习笔记。 225

贪心算法 Huffman树 JAVA

问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。   2. 重复步骤1,直到{pi}中只剩下一个数。   在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。   本题任务:对于给

qq_56229081的博客 344

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

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

每日一题---蓝桥基础题“Huffman树”java解决

题目 问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa +pb。   2. 重复步骤1,直到{pi}中只剩下一个数。   在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。   本题任务:

weixin_52025712的博客 349

ssm框架搭建

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

蓝桥杯-基础练习 Huffman树

问题描述  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。  给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。  2. 重复步骤1,直到{pi}中只剩下一个数。...

MadKang的博客 1909

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

BASIC-28 Huffman树

问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。   2. 重复步骤1,

Faith_777的博客 343

蓝桥杯-Huffman树(VIP试题)

问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa +pb。   2. 重复步骤1,直到{pi}中

PYROMANIA 3545

蓝桥杯-贪心Huffman

package jiChu; import java.util.Arrays; import java.util.Scanner; /** 问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb

Vivinia的博客 380

@java蓝桥杯B组习题基础练习(30)BASIC-028 Huffman 树 贪心

问题描述 Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。   2. 重复步骤1,直到{pi}中只剩下一个...

DAurora的博客 463

JAVA:实现Huffman霍夫曼编码算法(附带源码)

JAVA:实现Huffman霍夫曼编码算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1825

Huffman树

假设用于通讯电文仅有8个字母A、B、C、D、E、F、G组成,字母在电文出现的频率分别为:0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。接下来在从选择森林中继续选择两颗权值最小的树,以它们为叶子,构建一个新树,树的根的权值为两棵树的权值只和。创建哈夫曼树的算法实现,在构造哈夫曼树的过程中,我们是每次都是取森林中的具有最小权值的结点,为了更好的实现,所以第一步,我们应该。选择森林中的权值最小的两棵树,以它们为叶子,构建一个新树,树的根的权值为两棵树的权值只和。

搏博的专栏 1116

Huffman树创建(基于循序存储)以及基于Huffman树的编码

import java.util.HashMap; import java.util.List; import java.util.Map; public class HuffmanTree<T> { private HuffmanTreeArrayNode<T>[] huffmanTree; public void createHuffmanTree(List<HuffmanTreeArrayNode<T>> leafNodes){//.

flow 359

试题 基础练习 Huffuman树

资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa...

Cypresszky的博客 498

JAVA蓝桥基础练习 Huffuman树

问题描述   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。   2. 重复步骤1,直到{pi}中只剩下一个数。   在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。   本题任务:对于给

weixin_46574356的博客 162

java哈夫曼_哈夫曼编码(java版)

哈夫曼树又叫最优二叉树,是一类带权路径最短的二叉树。哈夫曼树是二叉树的一种应用,在信息检索中很常用。哈夫曼树可以用来解决报文编码问题,在通信领域有着非常广泛的运用。具体什么是带权路径二叉树,什么是哈夫曼编码这里不做介绍,这里只介绍代码,必须先知道这些概念才能阅读代码!以下为全部代码,做了比较详细的注释,所以不做另外解释节点类:package huffman_binary_tree;//树结点pub...

weixin_39595430的博客 226
上一篇: 如何在面试中介绍自己的项目经验
下一篇: 浅谈Java中的进制转换
Zyy~
博客等级 码龄9年 52粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值