目录

  • 赫夫曼树概述
  • 定义
  • 构造赫夫曼树步骤
  • 代码实现

赫夫曼树概述

HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树、霍夫曼树、哈夫曼树

赫夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1L1+W2L2+W3L3+…+WnLn),N个权值Wi(i=1,2,…n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,…n)。可以证明赫夫曼树的WPL是最小的。

定义

路径: 路径是指从一个节点到另一个节点的分支序列。

路径长度: 指从一个节点到另一个结点所经过的分支数目。 如下图:从根节点到a的分支数目为2

树的路径长度: 树中所有结点的路径长度之和为树的路径长度PL。 如下图:PL为10

节点的权: 给树的每个结点赋予一个具有某种实际意义的实数,我们称该实数为这个结点的权。如下图:7、5、2、4

带权路径长度: 从树根到某一结点的路径长度与该节点的权的乘积,叫做该结点的带权路径长度。如下图:A的带权路径长度为2*7=14

树的带权路径长度(WPL): 树的带权路径长度为树中所有叶子节点的带权路径长度之和

最优二叉树:权值最大的节点离跟节点越近的二叉树,所得WPL值最小,就是最优二叉树。如下图:(b)

  • (a)WPL=9*2+4*2+5*2+2*2=40
  • (b)WPL=9*1+5*2+4*3+2*3=37
  • (c) WPL=4*1+2*2+5*3+9*3=50

构造赫夫曼树步骤

对于数组{5,29,7,8,14,23,3,11},我们把它构造成赫夫曼树

第一步:使用数组中所有元素创建若干个二叉树,这些值作为节点的权值(只有一个节点)。

第二步:将这些节点按照权值的大小进行排序。

第三步:取出权值最小的两个节点,并创建一个新的节点作为这两个节点的父节点,这个父节点的权值为两个子节点的权值之和。将这两个节点分别赋给父节点的左右节点

第四步:删除这两个节点,将父节点添加进集合里

第五步:重复第二步到第四步,直到集合中只剩一个元素,结束循环

代码实现

  • 节点类
//接口实现排序功能
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 ;}
}
  • 测试类
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class Demo {public static void main(String[] args) {int[] arr = {5, 29, 7, 8, 14, 23, 3, 11};Node node = createHuffmanTree(arr);System.out.println(node); //Node value=100}//创建赫夫曼树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);//打印结果System.out.println(nodes);}return nodes.get(0);}
}
  • 循环次数结果
[Node value=29, Node value=23, Node value=14, Node value=11, Node value=8, Node value=7, Node value=8]
[Node value=29, Node value=23, Node value=14, Node value=11, Node value=8, Node value=15]
[Node value=29, Node value=23, Node value=15, Node value=14, Node value=19]
[Node value=29, Node value=23, Node value=19, Node value=29]
[Node value=29, Node value=29, Node value=42]
[Node value=42, Node value=58]
[Node value=100]
Node value=100Process finished with exit code 0

数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)相关推荐

  1. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  2. 数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)

    数据结构和算法的重要性 算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算 数据结构和算法的关系: 程序 = 数据结构 + 算法 数据结构是算法的基础, 换言之,想要学好算法,需要把数 ...

  3. 《数据结构与算法》(十一)- 树、森林与二叉树的转换及哈夫曼树详解

    目录 前言 1. 树.森林与二叉树之间的转换 1.1 树转换为二叉树 1.2. 森林转换为二叉树 1.3. 二叉树转换为树 1.4 二叉树转换为森林 1.5 树与森林的遍历 2. 哈夫曼树及其应用 2 ...

  4. 霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

    一.简介 霍夫曼树常处理符号编写工作.根据整组数据中符号出现的频率高低,决定如何给符号编码.如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长. 相关术语 路径:从书中一个节点到另一个节点之 ...

  5. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

  6. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序 ...

  7. 数据结构与算法之完全二叉树的节点个数

    数据结构与算法之完全二叉树的节点个数 目录 数据结构与算法之完全二叉树的节点个数 1. 数据结构与算法之完全二叉树的节点个数 (一)思路 先遍历左边界获得树的高度h 遍历右子树的左边界,看看到没到最后 ...

  8. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  9. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

最新文章

  1. LeetCode简单题之赎金信
  2. centos7安装tomcat8.5
  3. 光流法 Optical Flow
  4. 开工大吉,先送一波福利~
  5. 【小白学习keras教程】五、基于reuters数据集训练不同RNN循环神经网络模型
  6. ITM_win_agentCPU内存占用较高
  7. 图像标注技巧_保护互联网上图像的一个简单技巧
  8. 【Util】 时间天数增加,时间比较。
  9. IPHONE 开发 7 -- Object C 02 字符串NSString 与 char* ,字符串的遍历,字符串的比较,截取与大小写改变,搜索字符串与替换字符串...
  10. 0407 背景相关的作业
  11. HTTP请求解析过程 (简单概括)
  12. SSM框架之Spring MVC(三)http响应、文件上传
  13. STM32——PS2遥控手柄
  14. 现代信号处理 张贤达_清华大学信号处理著名学者张贤达去世,享年74岁
  15. 内核查找符号指针函数kallsyms_lookup_name
  16. Javascript正则表达式表示固定开头和结尾的字符串
  17. 一建报名条件是什么?
  18. Lect1 图像分类
  19. 断言assert的理解和用法
  20. 转-2017双十一阿里技术汇总

热门文章

  1. PhotoShop入门到精通(三)之 钢笔工具
  2. DSP与FPGA之EMIF接口的调试说明
  3. 双非本科非科班海投300+家Java后台岗位(个人心得感悟,附赠面试参考资料)...
  4. 电脑开机后显示器无信号怎么办?
  5. openocd+telnet调试
  6. vue数组变化视图_vue数组操作不更新视图问题
  7. ITSM-Ivanti体验报告
  8. iphone开发笔记2
  9. 有了这 27 个Linux 技巧,让你工作效率翻倍!
  10. SQL教程——联合查询