霍夫曼树(赫夫曼树、哈夫曼树)
霍夫曼树:给定n个权值做为n个叶子节点,若该树的带权路径长度达到最小,这棵树为最优二叉树,也称赫夫曼树。
霍夫曼树中的几个概念
路径和路径长度
一棵树中,一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1.
节点的权及带权路径长度
若将树中节点赋给一个有某种含义的数值,则称这个数值为该节点的全,节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。
树的带权路径长度
所有叶子节点的带权路径长度之和,记为WPL。 权值越大的节点距离根节点月季的二叉树草率最有二叉树 wpl最小的就是赫夫曼树
霍夫曼树代码实现
public class Node implements Comparable<Node>{private int value;private Node left;private Node right;public Node() {}public Node(int value) {this.value = value;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}public Node getLeft() {return left;}public void setLeft(Node left) {this.left = left;}public Node getRight() {return right;}public void setRight(Node right) {this.right = right;}@Overridepublic String toString() {return "" + value;}@Overridepublic int compareTo(Node o) {return this.value - o.value;}public void preorderTraversal(){System.out.println(this);if (this.left != null){this.left.preorderTraversal();}if (this.right != null){this.right.preorderTraversal();}}
}
数组转霍夫曼树工具类
public class HuffmanUtil {public static Node createHuffmanTree(int[] array){List<Node> nodeList = new ArrayList<>();for (int val : array){nodeList.add(new Node(val));}Node root = null;while (nodeList.size() > 1){//排序Collections.sort(nodeList);//取出前两位Node left = nodeList.get(0);Node right = nodeList.get(1);//得出和,新建节点root = new Node(left.getValue() + right.getValue());root.setLeft(left);root.setRight(right);//删除旧节点,加入新节点nodeList.remove(left);nodeList.remove(right);nodeList.add(root);}return root;}
}
测试方法(前序遍历输出赫夫曼树)
public class TestApp {public static void main(String[] args) {int[] array = {13,7,8,29,6,1};Node root = HuffmanUtil.createHuffmanTree(array);root.preorderTraversal();}
}
霍夫曼树(赫夫曼树、哈夫曼树)相关推荐
- c语言赫夫曼树的编码与译码,哈夫曼树与编码译码实现
一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径上的分枝 ...
- 哈夫曼树(Huffman Tree),与哈夫曼编码
目录 一.哈夫曼树 1.什么是哈夫曼树? 2.哈夫曼树关键字说明 3.用代码实现哈夫曼树思路分析 4.代码实现 二.哈夫曼编码 1.哈夫曼编码基本介绍 2.原理剖析 3.代码实现 一.哈夫曼树 1.什 ...
- 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...
- 关于哈夫曼树的例题(含哈夫曼树的具体构造过程)
1.设在某通信系统中使用了八个字符,出现频率分别为0.08,0.05,0.1,0.12,0.26:0.18,0.14,0.07,试构造一棵哈夫曼树,给出哈夫曼编码,再写出先.中.后序遍历结果,最后将哈 ...
- 哈夫曼树带权路径长度c语言,【哈夫曼树】求结点的哈夫曼的带权路径长度
本文用C++采用顺序存储实现求哈夫曼树(即最小生成树)的带权路径长度 努力 下面来了解一下哈夫曼树的构造以及如何求带权路径长度: 哈夫曼树为带权路径长度最小的树 哈夫曼树 哈夫曼树的顺序存储 [问题描 ...
- 心中有“树”!图文并茂介绍数据结构中常见的树(二)
计算机科学家尼古拉斯·沃斯(Niklaus Wirth)曾说过:编程=数据结构+算法 ,可见数据结构在编程中的重要性. 50 年过去了,计算机行业日新月异,大佬的这句名言是否还适用于当下?使用成熟且丰 ...
- 心中有“树”!图文并茂介绍数据结构中常见的树(三)
在前面两篇文章中,我们简要介绍了数据结构中的各种[树]在搜索.数据库等领域的使用场景,希望对大家有所帮助. 本篇内容,是我们 <心中有"树"> 系列的最后一篇,我会在这 ...
- 心中有“树”!图文并茂介绍数据结构中常见的树(一)
提到数据结构中的树(Tree) ,大家应该都不陌生,相关书籍中都有大段篇幅的介绍,刷 Leetcode 的时候会遇到很多相关问题.很多人往往会用 "手写红黑树" 来形容面试难度很高 ...
- R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理、比较误分类率指标
R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理.比较误分类率指标 目录
- KD树是什么? 为什么要用KD树? KD树怎么用? KD树和KNN的关联是什么?
KD树是什么? 为什么要用KD树? KD树怎么用? KD树和KNN的关联是什么? sklearn中如何配置? 为了提高KNN的搜索效率,这里介绍一种可以减少计算距离次数的方法---KD树方法. KD树 ...
最新文章
- VisualSVN Server2.5服务器迁移
- 台风怎么看内存颗粒_生态板、密度板、颗粒板各有好处,看你怎么用了!
- 面试题整理11 数字在排序数组中出现的次数
- Selenium 自动化测试基础知识
- 三极管稳压管组成的线性电源关键理解
- qt html导pdf 页眉,如何使用wkhtmltopdf unpatched qt在每个页面上添加页眉和页脚?
- CarAppFocusManager
- 矩池云上如何修改cuda版本
- windbg远程调试方法
- 前方高能!java并发编程实战百度网盘
- matlab插值法计算根号,怎么用matlab利用拉格朗日插值计算法的原理编写并计算函数所在节点的近似值....
- SPSS学习 日记
- 方舟服务器商店系统怎么弄,方舟生存进化怎么设置商店系统
- chrome浏览器主页变成hao123
- 烙铁-电子工程师的画笔
- Machine Learning Practical 爱宝课程记录week1
- iOS微信支付--解析失败
- JS实现多张图片绕中心点转动
- Mysql出现问题:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)解决方案
- Java个人支付宝知宝收款调用_Andriod 监听微信支付宝收款实现个人支付宝支付接口!附安卓 App(开源)...