【Java数据结构】赫夫曼树
哈弗曼树
- 哈弗曼树定义
- 哈弗曼树示例
- 哈弗曼树代码实现
哈弗曼树定义
给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
结点的带权路径长度:从根到该结点的路径长度与该结点的权值乘积。
树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为 WPL。
哈弗曼树的构建过程:
在一个二叉树的权的集合中,取出根结点权值最小的两颗二叉树,组成一颗新的二叉树,前面取出的两颗二叉树是新二叉树的两个子树,根结点的权值是前两个取出的两颗二叉树的根结点的权值之和。
哈弗曼树示例
给出每个结点的权值,如下:
首先将权值排序,(每个元素相当于一颗只有根结点的二叉树)
取出权值最小的两个二叉树,将它们合并为一个新的二叉树(相加后的权值再放入原来的权值集合中),如图 3 和 5 合并成为了 8,并放入权值集合中:
7 和 8 合并成为了 15,放入权值集合中:
8 和 11 合并成为了 19,放入权值集合中:
14 和 15 合并成为了 29,放入权值集合中:
19 和 23 合并成了 42,放入权值集合中:
29 和 29 合并成了 58,放入集合中:
42 和 58 合并成了100,最后形成了如下二叉树,即哈弗曼树。
哈弗曼树代码实现
二叉树的节点代码:实现了 Comparable 接口,实现对类的比较大小(compareTo () 方法),实现 toString() 方便输出结果。
public class Node implements Comparable<Node> {int value;Node left;Node right;public Node(int value){this.value = value;}@Overridepublic int compareTo(Node o) {return -(this.value - o.value);}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}
}
创建赫夫曼树代码:
// 创建赫夫曼树,返回赫夫曼树的根结点的权值public static Node createHuffmanTree(int [] arr){List<Node> nodes = new ArrayList<>(); // 先使用数组中所有的元素创建若干个二叉树(只有一个节点)for (int value: arr){nodes.add(new Node(value));}while (nodes.size() > 1){ // 循环处理Collections.sort(nodes); // 降序排序// 取出权值最小的两个二叉树Node left = nodes.get(nodes.size() - 1); // 权值最小的二叉树Node right = nodes.get(nodes.size() - 2); // 权值次小的二叉树Node parent = new Node(left.value + right.value); // 创建一个新的二叉树// 把取出来的两个二叉树移除nodes.remove(left);nodes.remove(right);nodes.add(parent);// 放入原来的二叉树集合中}return nodes.get(0); // 最后权值集合中,只剩一个权值,即构建的赫夫曼树的根的权值。}
测试案例:
public static void main(String[] args) {int [] arr = {3, 7, 8, 29, 5, 11, 23, 14};Node node = createHuffmanTree(arr);System.out.println(node);
}
运行效果:构建了一棵根的权为100的二叉树,此时整个权值集合中仅剩根的权值,所以输出为 100 。
Node{value=100}
【Java数据结构】赫夫曼树相关推荐
- 数据结构--赫夫曼树
数据结构 –赫夫曼树 文章目录 数据结构 一.一些概念 二.最优二叉树(赫夫曼树) 三.赫夫曼树的构造 四.赫夫曼编码 五.前缀编码 一.一些概念 路径:从树中一个结点到另一个结点之间的分支构成这两个 ...
- 数据结构 - 赫夫曼树
wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接,然后循环就可以了 package tree.huffmantree;import java.util.ArrayLi ...
- 数据结构--赫夫曼树及其应用
讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchil ...
- 数据结构-赫夫曼树(三)
Huffman Tree 哈夫曼树 霍夫曼树 概念 代码实现: 概念 路径和路径长度: 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路 路径长度: 通路中分支的数目称之为路径长度. 根节点 ...
- 【赫夫曼树数据结构及其应用】
本文主要介绍Java中赫夫曼树数据结构的基本原理.实现方式以及使用场景.赫夫曼树(Huffman Tree)是一种带权路径最短的二叉树,广泛应用于数据压缩和编码等领域. 一.赫夫曼树的基本概念 赫夫曼 ...
- 【数据结构】赫夫曼树
数据结构赫夫曼树 /*名称:赫夫曼树语言:数据结构C语言版 编译环境:VC++ 6.0日期: 2014-3-26 */#include <stdio.h> #include <lim ...
- java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)
一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...
- 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07
赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...
- 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码
//严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...
最新文章
- 生成对抗网络是什么?
- GitHub标星14k:超详细的人工智能专家路线图
- JAVA 获取格林威治时间(GMT)
- 畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘
- High ASCII字符从bat文件到dos控制台的转化问题
- Android创建启动画面
- 190303每日一句
- JAVA调用U盾进行客户认证实例
- 科技感十足炫酷引导页网站源码
- 道路断面与中心线的融合方法
- python 自动编写新闻_安卓机上使用 python 自动浏览新闻
- 图像压缩-《Learned Image Compression with Discretized Gaussian Mixture Likelihoods and Attention Modules》
- 定时关机win10_Windows利用任务计划程序实现定时关[日常]
- 第七章第八章思维导图
- 【渝粤教育】电大中专学前儿童社会教育_1作业 题库
- C++面向对象实现一个模板类链表
- EXCEL如何设置,使表格能自动调整列宽以适应文字长度
- 【threeJS】纹理贴图
- java错误代码1061_异常求解 小白
- R包学习——reshape包中melt、cast、merge函数用法
热门文章
- 互联网时代,还有闷声发大财的吗?
- 为啥Redis/Mongo这么快,就不能直接替代mysql吗?
- 你有没有遇到过“世外高人”,可以说说吗?
- binary.Write 小坑一个兼论go的错误处理哲学
- 编译动态库时报错relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile
- ssis for循环容器_SSIS Foreach循环与For循环容器
- sql server注入_SQL注入:SQL Server中的介绍和预防方法
- ssis高级转换任务—查找_SSIS中的模糊查找转换
- 【阅读笔记】:End-to-end Structure-Aware Convolutional Networks for Knowledge Base Completion
- 彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系