赫夫曼树

基本介绍

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

也就是说:赫夫曼树是带权路径长度最短的树,权值较大的节点离根较近

一些概念

路径和路径长度 : 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1

结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积

举个例子:

节点的权:就是13 14 5 16

节点带权路径长度 13为例 他的路径是2 从第一层到第三层 所以就是 13*2 = 26

树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树

赫夫曼树创建思路

给定我们一个数列{13,7,8,3,29,6,1},要求转换成一颗赫夫曼树

步骤:

1.从小到大进行排序,将每个数据,当做都是一个节点,每个节点可以看成是一颗最简单的二叉树

2.取出根节点权值最小的两颗二叉树

3.组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和

4.再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复1-2-3-4 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

步骤:

  1. 排序 1,3,4,7,8,13,29

  2. 挑出1和3构建新的二叉树

跟6号组合

7,8比10小,单独拿出来,组成一颗新的二叉树,以此类推

代码

package 赫夫曼树;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class HuffmanTree {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] = {13,7,8,3,29,6,1};Node node = createHuffmanTree(arr);preOrder(node);}//创建赫夫曼树的方法public static Node createHuffmanTree(int[] arr) {//先把数组中的所有元素取出来,构建成Node类型//放入到ArrayList中,可以排序List<Node> nodes = new ArrayList<Node>();for(int value : arr){nodes.add(new Node(value));}while(nodes.size() > 1){//排序  我们是从小到大Collections.sort(nodes);System.out.println(nodes);//取根节点权值最小的两颗二叉树//取出最小的二叉树节点(二叉树)Node leftNode = nodes.get(0);Node rightNode = nodes.get(1);//构建新的二叉树Node parent = new Node(leftNode.value+rightNode.value);parent.left = leftNode;parent.right = rightNode;//从我们的ArrayList删除处理过的二叉树nodes.remove(leftNode);nodes.remove(rightNode);//将parent加入到nodes集合中nodes.add(parent);System.out.println("第一次处理后"+nodes);}//返回赫夫曼树的root节点return nodes.get(0);}//前序便利方法public static void preOrder(Node root) {if(root != null){root.preOrder();}else{System.out.println("空树");}}}
//创建节点类
//为了让Node支持排序 Collections集合排序
//让Node实现Comparable接口
class Node implements Comparable<Node>{int value;//节点权值Node left;//指向左子节点Node right;//指向右子节点public Node(int value) {this.value = value;}@Overridepublic String toString() {return "Node [value=" + value + "]";}@Overridepublic int compareTo(Node o) {// TODO Auto-generated method stubreturn this.value - o.value;//表示从小到大排序}//前序遍历的方法public void preOrder() {System.out.println(this);if(this.left != null){this.left.preOrder();}if(this.right != null){this.right.preOrder();}}}

执行结果

[Node [value=1], Node [value=3], Node [value=6], Node [value=7], Node [value=8], Node [value=13], Node [value=29]]
第一次处理后[Node [value=6], Node [value=7], Node [value=8], Node [value=13], Node [value=29], Node [value=4]]
[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=13], Node [value=29], Node [value=10]]
[Node [value=7], Node [value=8], Node [value=10], Node [value=13], Node [value=29]]
第一次处理后[Node [value=10], Node [value=13], Node [value=29], Node [value=15]]
[Node [value=10], Node [value=13], Node [value=15], Node [value=29]]
第一次处理后[Node [value=15], Node [value=29], Node [value=23]]
[Node [value=15], Node [value=23], Node [value=29]]
第一次处理后[Node [value=29], Node [value=38]]
[Node [value=29], Node [value=38]]
第一次处理后[Node [value=67]]
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. 数据结构-赫夫曼树(三)

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

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

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

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

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

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

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

  8. 数据结构(十五)— 树结构之赫夫曼树及其应用

    现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...

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

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

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

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

最新文章

  1. apache ab test使用 单独安装ab和htpasswd
  2. 《Core Data应用开发实践指南》一1.3 创建Grocery Dude项目
  3. 【PAT甲级 进制转换】1019 General Palindromic Number (20 分) Java版 7/7通过
  4. linux服务器无密码登录不了,设置ssh无密码登录linux服务器的方法
  5. Windows 2000本地路由表
  6. ::在sql语句中是什么写法_不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思...
  7. ajax请求使用utf-8,Ajax,请求标头UTF-8到ISO字符集[重复]
  8. js最新手机号码、身份证正则表达式
  9. mysql的sql语句where,SQL之WHERE语句
  10. SnagIt9.0过了适用期,弹出关于的窗口解决办法
  11. 苹果CMSV10如何打包麻花影视APP教程
  12. 华为x86服务器销售额,x86服务器销量排行
  13. 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...
  14. 手机投屏电脑,无需第三方软件,鼠标控制手机
  15. 编程中的命名方式和常用命名名称
  16. java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x0
  17. python怎么自学
  18. keras中的卷积层池化层
  19. 外链html怎么添加,网站外链添加如何来做,要注意这些原则
  20. 开放原子开源基金会副秘书长刘京娟:中国开源发展现状及趋势思考

热门文章

  1. mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
  2. 跟踪算法原理_「综述」目标跟踪算法
  3. python训练营 朋友圈点赞收费吗_微信朋友圈点赞,是不是扣话费?有人给
  4. Openlayer:学习笔记之解析地图组成
  5. asp.net html 扩展,StaticHtml
  6. Guava学习笔记(零):Google Guava 类库简介
  7. 历史悠久的区块链游戏:麻将
  8. LIO-SAM探秘第三章之代码解析(三) --- mapOptmization.cpp (1)
  9. Canny边缘检测算法解析
  10. Ubuntu16.04 安装显卡驱动 cuda,cudnn