一、哈/赫夫曼树的基本定义

(1)路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
(2)路径长度:路径上的分支数目。
(3)树的路径长度:从树根到每一个结点的路径长度之和。(完全二叉树即为树的路径长度最短的二叉树
(4)结点的带权路径长度:从该结点到树根之间的路径长度和结点上权的乘积。
(5)树的带权路径长度:树的所有结点的带权路径之和(WPL,Weighted Path Length )。

假设有 n 个权值构建一颗有 n 个叶子结点的二叉树,每个叶子结点带权 ,则其中带权路径长度 WPL 最小的二叉树称为 最优二叉树或哈/赫夫曼树。根据结点的个数,权值的不同,最优二叉树的形状也各不相同,但共同点是:**带权值的结点都是叶子结点。权值越小的结点,其到根结点的路径越长。**叶子上的权值均相同时,完全二叉树一定是最优二叉树,否则完全二叉树不一定是最优二叉树,同时 最优二叉树的形态不唯一

例如,给定4个叶子结点a,b,c和d,分别带权7,5,2和4。构造如下图所示的三棵二叉树:

(a)WPL=7 * 2+5 * 2+2 * 2+4 * 2=36
(b)WPL=7 * 3+5 * 3+2 * 1+4 * 2=46
(c)WPL=7 * 1+5 * 2+2 * 3+4 * 3=35
其中©树的WPL最小,即可以验证其是哈夫曼树。

二、哈/赫夫曼树的创建

(1)从小到大进行排序,每个数据都是一个结点 , 每个结点可以看成是一棵最简单的二叉树(左右结点都为空的二叉树);
(2)取出根结点权值最小的两棵二叉树,组成一棵新的二叉树, 该新的二叉树的根结点的权值是前面两棵二叉树根节点权值的和
(3)再将这棵新的二叉树, 以根结点的权值大小再次排序, 不断重复以上的步骤, 直到数组中, 所有的数据都被处理, 即可得到一棵哈夫曼树。

三、代码实现

package Tree;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class HuffmanTree {/*** @param arr   需要创建成哈夫曼树的数组* @return      创建好后的哈夫曼树的root结点*/public static Node huffmantree(int[] arr) {List<Node> list=new ArrayList<>();for(int value:arr) {list.add(new Node(value));//将Node结点值放入ArrayList中}while(list.size()>1) {//最后一个结点直接加入即可Collections.sort(list);//Collections.sort方法用于升序排序//取出根结点权值最小的两颗二叉树Node leftNode=list.get(0);Node rightNode=list.get(1);//构建一棵新二叉树,其权值为权值最小的两个结点之和Node parent=new Node(leftNode.value+rightNode.value);//父结点需要连接上左右两个结点parent.left=leftNode;parent.right=rightNode;//将已经使用过的两个权值最小的结点从list中删除,避免重复list.remove(leftNode);list.remove(rightNode);//将新形成的父结点加入其中,并开始下一次循环重新排序list.add(parent);}return list.get(0);//最后list中只剩下哈夫曼树的root结点}public static void preOrder(Node root) {if (root != null) {root.preOrder();} else {System.out.println("该树为空树,无法遍历!");}}public static void main(String[] args) {int[] arr= {13,7,8,3,29,6,1};Node root=huffmantree(arr);preOrder(root);}}class Node implements Comparable<Node>{//实现Comparable接口,重写compareTo方法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) {//Node1的构造函数this.value=value;}@Overridepublic String toString() {//重写toString方法return "Node [value=" + value + "]";}@Overridepublic int compareTo(Node n) {return this.value-n.value;//升序排序(n.value-this.value为降序排序)}
}

运行结果:

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. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

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

  2. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

  3. 哈夫曼树-最优二叉树

    # 定义 1. 路径:结点中一个结点到另一个结点的通路(线)叫做路径 2. 路径长度:结点到另一个结点,线的累加和 3. 权:结点带有的数值 4. 带权路径长度:权×路径长度 最优二叉树指的是带权路径 ...

  4. java 实现最优二叉树_哈夫曼树(最优二叉树) - Java实现

    简介 哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树.从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称 ...

  5. 哈夫曼树 (最优二叉树)

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

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

  7. 赫夫曼树赫夫曼编码的创建

    目录 基础知识点 最优二叉树 如何构造赫夫曼树 赫夫曼编码 编码与压缩文件 代码 结构体设计 创建赫夫曼树 创建构建赫夫曼编码 基础知识点 赫夫曼树又称为最优树,是一种带权路径长短最短的树,有着广泛的 ...

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

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

  9. 6.6.1最优二叉树(赫夫曼树)

    首先我们来看一个伪代码.这个是代表成绩的等级. 然后我们知道,每一次高考,学生的成绩分布应该接近某个比例,现在我们假如分别规律如下: 为此可以作出下面的这个树. 我们发现,概率分布主要是在70-79, ...

  10. 最优二叉树(赫夫曼树)

    赫夫曼树的介绍(写的不好地方大佬请指教) 最优二叉树又称哈夫曼树,是带权路径最短的二叉树.根据节点的个数,权值的不同,最优二叉树的形状也不同. 图 6-34 是 3 棵最优二叉树的例子,它们共同的特点 ...

最新文章

  1. 人工智能会被赋予人性么?
  2. AC日记——斗地主(dfs)
  3. python绝技 — 侦听802.11 Probe请求
  4. tms tck_两个用于Eclipse的TCK –开源到底有什么?
  5. UML、XML、WebService,NUnit单元测试,测试驱动开发,httphandl,httpmodel
  6. ubuntu7.10 apache+php+mysql配置
  7. 程序员的进阶课-架构师之路(8)-二叉树
  8. linux配置git(一)安装git
  9. 利用socket实现java程序自动关闭
  10. [转载] 用Tkinter打造GUI开发工具(45)用Tkinter做自己的中文代码编辑器
  11. 谷歌浏览器清除指定网站cookie和缓存方法步骤
  12. 开滦二中2021高考成绩查询,成人成才 无缝严管丨开滦二中西校区2018高考总结交流大会...
  13. LTE上行物理层传输机制(1)-PUSCH上行跳频之Type1频率跳频
  14. spm + host
  15. 高性能服务器设计[转自腾讯km,由qzhang同学翻译]
  16. Java枚举是什么?关于Java枚举的一些理解
  17. Uber的优劣势分析
  18. CAP定理与BASE理论
  19. 炉石android更新日志,炉石传说新版本一览_炉石传说更新内容
  20. Linux和windows之间实现文件的粘贴复制

热门文章

  1. 什么是云原生(cloud native)?
  2. 用上帝的恋爱公式讲线性回归-下
  3. 何谓理性?又何谓感性?
  4. php的session使用方法,phpsession会话使用方法详解_PHP教程
  5. 有意思了!数据库也搞Serverless!
  6. Oracle 创建序列
  7. 点赞破百万,字节算法大能亲撰 30W 字数据算法笔记:GitHub 标星 93K
  8. java基础学习——Java数组
  9. 分享95个ASP整站程序源码,总有一款适合您
  10. php notice undefined variable,PHP提示Notice: Undefined variable的解决办法