哈弗曼树

  • 哈弗曼树定义
  • 哈弗曼树示例
  • 哈弗曼树代码实现

哈弗曼树定义

给定 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数据结构】赫夫曼树相关推荐

  1. 数据结构--赫夫曼树

    数据结构 –赫夫曼树 文章目录 数据结构 一.一些概念 二.最优二叉树(赫夫曼树) 三.赫夫曼树的构造 四.赫夫曼编码 五.前缀编码 一.一些概念 路径:从树中一个结点到另一个结点之间的分支构成这两个 ...

  2. 数据结构 - 赫夫曼树

    wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接,然后循环就可以了 package tree.huffmantree;import java.util.ArrayLi ...

  3. 数据结构--赫夫曼树及其应用

    讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchil ...

  4. 数据结构-赫夫曼树(三)

    Huffman Tree 哈夫曼树 霍夫曼树 概念 代码实现: 概念 路径和路径长度: 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路 路径长度: 通路中分支的数目称之为路径长度. 根节点 ...

  5. 【赫夫曼树数据结构及其应用】

    本文主要介绍Java中赫夫曼树数据结构的基本原理.实现方式以及使用场景.赫夫曼树(Huffman Tree)是一种带权路径最短的二叉树,广泛应用于数据压缩和编码等领域. 一.赫夫曼树的基本概念 赫夫曼 ...

  6. 【数据结构】赫夫曼树

    数据结构赫夫曼树 /*名称:赫夫曼树语言:数据结构C语言版 编译环境:VC++ 6.0日期: 2014-3-26 */#include <stdio.h> #include <lim ...

  7. java振动数据压缩_【数据结构-Java】最佳实践-数据压缩(使用赫夫曼树)

    一.需求 将给出的一段文本,比如 "i like like like java do you like a java" , 根据前面的讲的赫夫曼编码原理,对其进行数据压缩处理 二. ...

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

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

  9. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

最新文章

  1. 生成对抗网络是什么?
  2. GitHub标星14k:超详细的人工智能专家路线图
  3. JAVA 获取格林威治时间(GMT)
  4. 畅享10e会有鸿蒙吗,功能虽小作用很大 华为畅享10e隐藏功能大揭秘
  5. High ASCII字符从bat文件到dos控制台的转化问题
  6. Android创建启动画面
  7. 190303每日一句
  8. JAVA调用U盾进行客户认证实例
  9. 科技感十足炫酷引导页网站源码
  10. 道路断面与中心线的融合方法
  11. python 自动编写新闻_安卓机上使用 python 自动浏览新闻
  12. 图像压缩-《Learned Image Compression with Discretized Gaussian Mixture Likelihoods and Attention Modules》
  13. 定时关机win10_Windows利用任务计划程序实现定时关[日常]
  14. 第七章第八章思维导图
  15. 【渝粤教育】电大中专学前儿童社会教育_1作业 题库
  16. C++面向对象实现一个模板类链表
  17. EXCEL如何设置,使表格能自动调整列宽以适应文字长度
  18. 【threeJS】纹理贴图
  19. java错误代码1061_异常求解 小白
  20. R包学习——reshape包中melt、cast、merge函数用法

热门文章

  1. 互联网时代,还有闷声发大财的吗?
  2. 为啥Redis/Mongo这么快,就不能直接替代mysql吗?
  3. 你有没有遇到过“世外高人”,可以说说吗?
  4. binary.Write 小坑一个兼论go的错误处理哲学
  5. 编译动态库时报错relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile
  6. ssis for循环容器_SSIS Foreach循环与For循环容器
  7. sql server注入_SQL注入:SQL Server中的介绍和预防方法
  8. ssis高级转换任务—查找_SSIS中的模糊查找转换
  9. 【阅读笔记】:End-to-end Structure-Aware Convolutional Networks for Knowledge Base Completion
  10. 彻底搞懂Gradle、Gradle Wrapper与Android Plugin for Gradle的区别和联系