哈夫曼树以及哈夫曼算法
目录
一、哈夫曼树的定义
二、哈夫曼树的特点
三、哈夫曼算法(构造哈夫曼树的方法)
四、哈夫曼树的构造过程
五、哈夫曼树构造算法的实现
一、哈夫曼树的定义
1、哈夫曼树:最优树即带权路径长度(WPL)最短的树
“带权路径长度最短”是在"度相同”的树中比较而得的结果,因此有最优二叉树、最优三叉树之称等等。
2、哈夫曼树:最优二叉树即带权路径长度(WPL)最短的二叉树
因为构造这种树的算法是由哈夫曼教授于1952年提出的,所以被称为哈夫曼树,相应的算法称为哈夫曼算法。
二、哈夫曼树的特点
1、满二叉树不一定是哈夫曼树
2、哈夫曼树中权越大的叶子离根越近
3、具有相同带权结点的哈夫曼树不唯一
三、哈夫曼算法(构造哈夫曼树的方法)
1、算法步骤
(1)根据n个给定的权值{W1, W2,...,Wn}构成n棵二叉树的森林,F={T1, T2,...,Tn},其中Ti只有一个带权为Wi的根结点。
构造森林全是根
(2)在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二又树的根结点的权值为其左右子树上根结点的权值之和。
选用两小造新树
(3)在F中删除这两棵树,同时将新得到的二叉树加入森林中,
删除两小添新人
(4)重复(2)和(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树。
重复2、3剩单根
2、哈夫曼算法口诀:①构造森林全是根;②选用两小造新树;③删除两小添新人;④重复2、3剩单根。
四、哈夫曼树的构造过程
如下图所示
由上图的过程可得出以下三个结论:
①包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1 个新结点。
②包含n个叶子结点的哈夫曼树中共有2n- 1个结点。
③经过n-1次合并产生n-1个新结点,且这n-1个新结点都是具有两个孩子的分支结点。
④哈夫曼树的结点的度数为0或2,没有度为1的结点。
五、哈夫曼树构造算法的实现
1、顺序存储结构的节点类型以及存储结构图如下图所示
2、算法思路
3、算法描述
void CreatHuffmanTree (HuffmanTree HT, int n){ //构造哈夫曼树——哈夫曼算法
if(n<= 1) return;m=2*n-1; //数组共2n-1个元素HT= new HTNode[m+1]; //0号单元未用,HT[m]表示根结点for(i=1;i<=m;++i){ //将2n-1个元素的lch、 rch、 parent置为0HT[i].lch=0; HT[i].rch=0; HT[i].parent=0;
}for(i=1;i<=n;++i)
cin>>HT[i].weight; //输入前n个元素的weight值
//初始化结束,下面开始建立哈夫曼树
for(i=n+1;i<=m;i++){//合并产生n-1个结点——构造Huffman树Select(HT, i-1, s1, s2); //在HT[k](1≤k≤i-1)中选择两个其双亲域为0,//且权值最小的结点并返回它们在HT中的序号s1和s2HT[s1].parent=i; HT[s2].parent=i; //表示从F中删除s1,s2HT[i].lch=s1; HT[i].rch=s2; //s1,s2分别作为的左右孩子HT[i].weight=HT[s1].weight + HT[s2].weight; //i的权值为左右孩子权值之和
}}
哈夫曼树以及哈夫曼算法相关推荐
- python哈夫曼树_python霍夫曼树
class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...
- 一文看懂哈夫曼树与哈夫曼编码
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...
- 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...
- 听说你还不懂哈夫曼树和哈夫曼编码
基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码
第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- 【数据结构】-哈夫曼树以及哈夫曼编码
哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...
- C++ 实现哈夫曼树和哈夫曼编码
C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...
- 霍夫曼树(赫夫曼树、哈夫曼树)
霍夫曼树:给定n个权值做为n个叶子节点,若该树的带权路径长度达到最小,这棵树为最优二叉树,也称赫夫曼树. 霍夫曼树中的几个概念 路径和路径长度 一棵树中,一个节点往下可以达到的孩子或孙子节点之间的通路 ...
最新文章
- Python怎么利用多核cpu
- javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)
- 杭电oj1176,2084java实现
- Angle Finder(角度测量)
- c#文本框只能填入数字和字母
- C# 版本 疫情传播仿真程序
- leetcode230. 二叉搜索树中第K小的元素(中序遍历)
- 实战:基于自定义注解实现自定义框架Spring
- 用css控制背景图片的位置,大小
- TIF图片转bitmap的两种方式(C#)
- VS C# string 字符包含判断
- 如何c51和mdk共存兼容_如何使用无线技术控制大功率快速充电
- 【智能优化算法-蝙蝠算法】基于混合粒子群和蝙蝠算法求解单目标优化问题附matlab代码
- 7种常见的PPT设计元素
- 魔兽争霸php文件怎么打开,魔兽争霸之PHP设计模式
- 学妹跑过来问我为啥Xshell 打不开了,让我帮她处理下【手把手讲解】
- 鸿蒙初判陶镕铁,大禹治水为何还要求雨?他用金箍棒到底做什么用?
- win10系统nfs服务器搭建
- 图片生成 php源码_php图像验证码生成代码
- Elasticsearch 响应数据压缩功能详解