Huffman Tree 哈夫曼树 霍夫曼树

  • 概念
    • 代码实现:

概念

  • 路径和路径长度:
  1. 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路
  2. 路径长度: 通路中分支的数目称之为路径长度. 根节点到指定节点的路径长度为 L层-1
  • 节点的权及带权路径长度:
  1. 节点的权: 为每个节点定义字段赋予有着某种含义的数值
  2. 带权路径长度: 从根节点到该节点之间的路径长度和该节点的权的乘积
  • WPL(Weighted path length): 所有叶子节点的带权路径长度之和

WPL = 13x2 + 7x2 + 8x2 + 2x2 = 62

WPL = 13x1 + 8x2 + 7x3 + 3x3 = 59

WPL = 7x1 + 3x2 + 8x3 + 13x3 = 76

* 权值越大的节点, 且离根节点越近的二叉树, 称之为最优二叉树(即赫夫曼树)

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

代码实现:


public class HuffmanTreeApp {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("空树, 无法遍历!");}}/**  创建赫夫曼树方法* @param arr 待创建成赫夫曼树的数组* @return 返回赫夫曼树的根结点*/public static Node createHuffmanTree(int[] arr) {List<Node> nodes = new ArrayList<>();for (int value : arr) {nodes.add(new Node(value));}/** 最后 List内会只剩一个 Node*/while(nodes.size() > 1) {/** 从小到大排序*/Collections.sort(nodes);System.out.println(nodes);/** 取出根节点权值最小的两颗二叉树*///(1) 取出权值最小的结点(二叉树)Node leftNode = nodes.get(0);//(2) 取出权值第二小的结点(二叉树)Node rightNode = nodes.get(1);//(3) 构建一颗新的二叉树Node parent = new Node(leftNode.value + rightNode.value);parent.left = leftNode;parent.right = rightNode;//(4) 将 parent加到 List中nodes.add(parent);//(5) 从 List中删除处理过的二叉树nodes.remove(leftNode);nodes.remove(rightNode);}/** 返回赫夫曼树的 root结点*/return nodes.get(0);}
}/** 定义结点, 实现 Comparable接口, 为了使用 Collections集合排序*/
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;}@Overridepublic String toString() {return "Node [value=" + value + "]";}@Overridepublic int compareTo(Node o) {/** 表示从小到大排序*/return this.value - o.value;}}输出:
> [Node [value=1], Node [value=3], Node [value=6], Node [value=7], Node [value=8], Node [value=13], Node [value=29]]
> [Node [value=4], Node [value=6], Node [value=7], Node [value=8], Node [value=13], Node [value=29]]
> [Node [value=7], Node [value=8], Node [value=10], Node [value=13], Node [value=29]]
> [Node [value=10], Node [value=13], Node [value=15], Node [value=29]]
> [Node [value=15], Node [value=23], Node [value=29]]
> [Node [value=29], Node [value=38]]
> Node [value=67]
> Node [value=29]
> Node [value=38]
> Node [value=15]
> Node [value=7]
> Node [value=8]
> Node [value=23]
> Node [value=10]
> Node [value=4]
> Node [value=1]
> Node [value=3]
> Node [value=6]
> Node [value=13]

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

数据结构-赫夫曼树(三)相关推荐

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

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

  2. 数据结构 - 赫夫曼树

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

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

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

  4. 三十、赫夫曼树的设计与代码实现

    一.基本介绍 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍 ...

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

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

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

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

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

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

  8. 高级数据结构之赫夫曼树

    思考两个问题 电报发送:二战的时候大家都知道那时候普遍会应用电报,如果让你来设计一个电报的发送编码你该如何设计呢? 电报加密后越短越好,发送快. 破解难 解码容易 换加密树也要快 可逆的 压缩算法:给 ...

  9. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

最新文章

  1. php、linux、javascript 正则表达式
  2. spring在WEB中的应用。
  3. First Scrum 冲刺
  4. 11.2.0.2 HAIP
  5. Python+OpenCV 十几行代码模仿世界名画
  6. CSS中position的4种定位详解
  7. Apache中限制和允许特定IP访问
  8. MyEclipse教程:Web开发——调试JSP
  9. Kubernetes负载均衡器-traefik ingress安装
  10. 使用JavaScript生成二维码和识别二维码
  11. matlab 线性拟合(好像也可以由两点得出直线)
  12. Windows 使用学习
  13. LaTeX 公式(转自)Iowa_Battleship 神犇
  14. iOS 中的常用设计模式总结
  15. 复制url直接能跳过验证_爬虫黑科技-绕开百度人机验证
  16. 最新C语言进阶实战(完整)
  17. 缺失msvcp110.dll
  18. 不寻常的光纤链路故障
  19. ModelMapper
  20. 穆迪分析在其CreditLens™解决方案中加入CRE功能

热门文章

  1. 【PAT甲级 单源最短路径】1087 All Roads Lead to Rome (30 分)
  2. 用户故事地图,产品经理必须掌握的分析利器
  3. send message
  4. badboy简介和回放
  5. JavaEE体系架构
  6. HLM(分层线性模型)处理“聚集性”问题!
  7. 目前绝大多数处理语言先验性文章总结
  8. 页面版权声明©xx公司写法
  9. 区块链如何改变供应链金融
  10. 看一看:不同Web前端框架的优缺点分别是什么?