哈夫曼树的几个定义

哈夫曼树又叫最优二叉树:特点是带权路径最短
带权路径长度:该结点到根结点的路径长度乘以该结点的权值。
树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和。

最优二叉树:从已给出的目标带权结点(单独的结点) 经过一种方式的组合形成一棵树.使树的权值最小.。最优二叉树是带权路径长度最短的二叉树。根据结点的个数,权值的不同,最优二叉树的形状也各不相同。它们的共同点是:带权值的结点都是叶子结点。权值越小的结点,其到根结点的路径越长。

哈夫曼树的特点:

  • 权值最大的结点离根结点越近。
  • 没有度为1的结点。
  • 带权路径长度最短。
哈夫曼树的构造以及哈夫曼编码

前缀码:任何一个字符的编码都不是另外一个字符编码的前缀。此种编码为前缀码。
哈夫曼树的构造步骤参见哈夫曼树的构造步骤详解
这篇比较详细的写出了,哈夫曼的构造步骤

哈夫曼树的构造以及哈夫曼编码java实现
package 哈夫曼树与哈夫曼编码;import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;public class Huffman {public static class Node<E> {E data;double weight;Node leftChild;Node rightChild;public Node(E data, double weight) {super();this.data = data;this.weight = weight;}public String toString() {return "Node[data=" + data + ", weight=" + weight + "]";}}public static void main(String[] args) {List<Node> nodes = new ArrayList<Node>();nodes.add(new Node("A", 40.0));nodes.add(new Node("B", 8.0));nodes.add(new Node("C", 10.0));nodes.add(new Node("D", 30.0));nodes.add(new Node("E", 10.0));nodes.add(new Node("F", 2.0));Node root = Huffman.createTree(nodes);System.out.println(breadthFirst(root));}private static Node createTree(List<Node> nodes) {// 只要nodes数组中还有2个以上的节点while (nodes.size() > 1) {quickSort(nodes);//获取权值最小的两个节点Node left = nodes.get(nodes.size()-1);Node right = nodes.get(nodes.size()-2);//生成新节点,新节点的权值为两个子节点的权值之和Node parent = new Node(null, left.weight + right.weight);//让新节点作为两个权值最小节点的父节点parent.leftChild = left;parent.rightChild = right;//删除权值最小的两个节点nodes.remove(nodes.size()-1);nodes.remove(nodes.size()-1);//将新节点加入到集合中nodes.add(parent);}return nodes.get(0);}/*** 将指定集合中的i和j索引处的元素交换* * @param nodes* @param i* @param j*/private static void swap(List<Node> nodes, int i, int j) {Node tmp;tmp = nodes.get(i);nodes.set(i, nodes.get(j));nodes.set(j, tmp);}/*** 实现快速排序算法,用于对节点进行排序* * @param nodes* @param start* @param end*/private static void subSort(List<Node> nodes, int start, int end) {if (start < end) {// 以第一个元素作为分界值Node base = nodes.get(start);// i从左边搜索,搜索大于分界值的元素的索引int i = start;// j从右边开始搜索,搜索小于分界值的元素的索引int j = end + 1;while (true) {// 找到大于分界值的元素的索引,或者i已经到了end处while (i < end && nodes.get(++i).weight >= base.weight);// 找到小于分界值的元素的索引,或者j已经到了start处while (j > start && nodes.get(--j).weight <= base.weight);if (i < j) {swap(nodes, i, j);} else {break;}}swap(nodes, start, j);//递归左边子序列subSort(nodes, start, j - 1);//递归右边子序列subSort(nodes, j + 1, end);}}public static void quickSort(List<Node> nodes){subSort(nodes, 0, nodes.size()-1);}//广度优先遍历public static List<Node> breadthFirst(Node root){Queue<Node> queue = new ArrayDeque<Node>();List<Node> list = new ArrayList<Node>();if(root!=null){//将根元素加入“队列”queue.offer(root);}while(!queue.isEmpty()){//将该队列的“队尾”元素加入到list中list.add(queue.peek());Node p = queue.poll();//如果左子节点不为null,将它加入到队列if(p.leftChild != null){queue.offer(p.leftChild);}//如果右子节点不为null,将它加入到队列if(p.rightChild != null){queue.offer(p.rightChild);}}return list;}
}/*
以上代码中的关键步骤包括:
(1)对list集合中所有节点进行排序;(2)找出list集合中权值最小的两个节点;(3)以权值最小的两个节点作为子节点创建新节点;(4)从list集合中删除权值最小的两个节点,将新节点添加到list集合中程序采用循环不断地执行上面的步骤,直到list集合中只剩下一个节点,最后剩下的这个节点就是哈夫曼树的根节点
*/

【数据结构】-哈夫曼树以及哈夫曼编码相关推荐

  1. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  2. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  3. Python数据结构11:树的实现,树的应用,前中后序遍历,二叉查找树BST,平衡二叉树AVL树,哈夫曼树和哈夫曼编码

    1.概念 树一种基本的"非线性"数据结构. 相关术语: 节点Node:组成树的基本部分.每个节点具有名称,或"键值",节点还可以保存额外数据项,数据项根据不同的 ...

  4. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  5. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  6. 【数据结构】【哈夫曼树】哈夫曼树、赫夫曼树(Huffman Tree)C语言实现

    目录 一.哈夫曼树定义与原理 二.构建哈夫曼树 三.哈夫曼编码 完整代码: 前言:章末含c语言实现完整代码 一.哈夫曼树定义与原理 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权 ...

  7. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  8. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  9. 哈夫曼树和哈夫曼树编码

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...

最新文章

  1. 深度学习工程师从业者必备的21张速查表(神经网络、线性代数、可视化等)
  2. 数据结构课程设计——机票售卖系统(C++)
  3. 生产订单成本的计划、控制和结算
  4. 检索数据_16_按照某个模式搜索
  5. python错误修复_如何修复python错误(对象不可调用)
  6. 深度学习之基于Inception_ResNet_V2和CNN实现交通标志识别
  7. 操作系统之虚拟存储管理
  8. html动画曲线快速结束,CSS3 animation动画
  9. 金山毒霸免费Wifi独立版,只需一块无线网卡,完爆360随身wifi
  10. Activity的任务栈Task以及启动模式与Intent的Flag详解
  11. MSIL实用指南-struct的生成和操作
  12. ArcGIS下载在线地图影像上篇(手工版)
  13. 恩智浦智能车竞赛摄像头相关组入门
  14. loadrunner11压力测试设置
  15. Linux系统软件安装
  16. My Dad said
  17. Difference between Triplets POJ - 3244
  18. mysql 语法 日期转换成字符串_mysql日期转换成字符串的方法
  19. GitHub 上值得收藏的100个精选前端项目!你知道几个?
  20. MySQL学习笔记(九)MVCC

热门文章

  1. c++ 字符串 判断中文
  2. 网页报错:You don't have permission to access
  3. 网易云信圈组上线实时互动频道,「破冰」弱关系社交
  4. 5G网络实现自动驾驶车联网——第三篇:5G网络实现远程SSH,远程桌面
  5. 黑马程序员博学谷Java就业班课程
  6. 计算机专业大学课程学习路线图
  7. git合并多次提交为一次提交
  8. 迪士尼机器人芭蕾舞_迪士尼乐园里的机器人又有新消息,这次是关于柔软皮肤...
  9. Android获取内置sdcard跟外置sdcard路径
  10. R语言使用matrix函数创建空矩阵、使用nrow参数和ncol参数指定矩阵的行列数