【树】哈夫曼树及其构造
1.哈夫曼树的基本概念 |
- 结点间的路径和路径长度
路径是指从一个结点到另一个结点之间的分支序列。
路径长度是指从一个结点到另一个结点所经过的分支数目。 - 结点的权和带权路径长度
在实际的应用中,给树的每个结点赋予一个具有某种实际意义的实数,称该实数为这个结点的权。
在树型结构中,把从树根到某一结点的路径长度与该结点的权的乘积,叫做该结点的带权路径长度。 - 树的带权路径长度
树的带权路径长度为树中从根到所有叶子结点的各个带权路径长度之和,通常记为:
2. 构造哈夫曼树 |
哈夫曼树:它是由 n 个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。因为这种树最早由哈夫曼(Huffman)研究,所以称为哈夫曼树,又叫最优二叉树。
- 构造哈夫曼树的算法步骤如下:
直观地看,先选择权小的,所以权小的结点被放置在树的较深层,而权较大的离根较近,这样自然在哈夫曼树中权越大叶子离根越近,这样一来,在计算树的带权路径长度时,自然会具有最小带权路径长度,这种生成算法就是一种典型的贪心法。
3. 哈夫曼树的类型定义 |
(2)哈夫曼树的类型定义
用静态三叉链表实现的哈夫曼树类型定义如下:
#define N 20 /* 叶子结点的最大值。*/
#define M 2 * N - 1 /* 所有结点的最大值。*/
typedef struct
{int weight; /* 结点的权值*/int parent; /* 双亲的下标*/int LChild; /* 左孩子结点的下标*/int RChild; /* 右孩子结点的下标*/
} HTNode, HuffmanTree[M + 1]; /* HuffmanTree 是一个结构数组类型,0 号单元不 用。 */
4.哈夫曼树的算法实现 |
void CrtHuffmanTree(HuffmanTree ht, int w[], int n)
{ /*构造哈夫曼树 ht[M+1], w[ ]存放 n 个权值。*/for (i = 1; i <= n; i++)ht[i] = {w[i], 0, 0, 0}; /* 1 ~ n 号单元存放叶子结点,初始化*/m = 2 * n - 1;for (i = n + 1; i <= m; i++)ht[i] = {0, 0, 0, 0}; /* n+1 ~ m 号单元存放非叶结点,初始化 *//*————————————初始化完毕!对应算法步骤 1—————————*/for (i = n + 1; i <= m; i++) /*创建非叶结点,建哈夫曼树*/{select(ht, i - 1, s1, s2); /* 在 ht[1] ~ ht[i-1] 的范围内选择两个 parent 为 0 且
weight 最小的结点,其序号分别赋值给 s1、s2 返回 */ht[i].weight = ht[s1].weight + ht[s2].weight;ht[s1].parent = i;ht[s2].parent = i;ht[i].LChild = s1;ht[i].RChild = s2;} /*哈夫曼树建立完毕*/
}
该算法分成两大部分,其中第一部分是初始化,先初始化 ht 的前 1~n 号元素,存放叶子结点(相当初始森林),它们都没有双亲与孩子。再初始化 ht 的后 n-1 个(从 n+1~2n-1)非叶结点元素;第二部分为实施选择、删除合并 n-1 次(相当步骤(2)~(4)):选择是从当前森林中(在森林中树的根结点的双亲为 0)选择两棵根的权值最小的树;删除合并是将选到的两棵树的根权和存入 ht 的当前最前面的空闲元素中(相当于合并树中新结点),并置入相应的双亲与孩子的位置指示。
【树】哈夫曼树及其构造相关推荐
- 哈夫曼树(带权路径长度+树的带权路径长度+哈夫曼树定义+构造哈夫曼树+哈夫曼树性质+哈夫曼编码+计算平均码长-这里指WPL)
带权路径长度 树的带权路径长度WPL 哈夫曼树 哈夫曼树构造 哈夫曼树性质 哈夫曼编码 固定长度编码 可变长编码 前缀编码 固定长度编码.可变长编码.前缀编码.哈夫曼编码 思维倒图 试题
- 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)
目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...
- 数据结构-树(哈夫曼树)
树的基本概念 定义 树(Tree)是n(n>=0)个结点的有限集.n=0时成为空树. 在任意一个非空树中:有且仅有一个特定的称为根(Root)的结点:n>1时,其余结点可分为m(m> ...
- 快速画出哈夫曼树/霍夫曼树/最优树
2019独角兽企业重金招聘Python工程师标准>>> 哈夫曼树(霍夫曼树)又称为最优二叉树. n个叶子结点的哈夫曼树共有几个结点 ? Huffman 树是所谓的正则二叉树,只有度为 ...
- PTA 线性结构/AVL树/哈夫曼树错题
1.稀疏矩阵压缩存储后,必会失去随机存取功能. T F 解析:稀疏矩阵的存储方式是将数据压缩存储进一维数组,数组下标与之前的不相同了,想要某一元素需要根据公式计算它的下标,所以说是失去了随机存取的功能 ...
- 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...
- c语言最优树的构造,哈夫曼树的构造及编码 Haffman树的构造及其编码
写出构造完整的哈夫曼树的编码 void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, ...
- 哈夫曼树构造以及代码实现
哈夫曼树构造以及代码实现 什么是哈夫曼树 理解哈夫曼树 哈夫曼树的构造 哈夫曼树构造-代码实现 什么是哈夫曼树 构造一颗二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffma ...
- 【Lua】哈夫曼树构造算法的分析与实现
哈夫曼树构造算法分析 1.哈夫曼树中权重越大的叶子离根越近,采用贪心算法构造哈夫曼树,首先选中权重值小的叶子结点进行构造 2.步骤 构造森林全是根:根据n个给定结点的权重值{W1, W2-Wn}构成 ...
最新文章
- awk命令扩展使用操作
- Java基础 —— 异常
- 美国计算机工程专业,美国计算机工程专业哪些学校比较好
- Failed to start firewalld.service: Unit firewalld.service is masked.
- ssis组件_用于SSIS的Melissa Data Quality免费组件
- macOS设备上的照片导入Bridge
- MySQL常用DDL语法总结
- 多媒体计算机与一般计算机,计算机和多媒体计算机的区别
- 修改element插件样式---select样式
- gopher攻击mysql_从一道CTF题目看Gopher攻击MySql
- 利用PPT制作不一样的动态文字技巧
- 《勒索软件防护体系建设指南》发布|美创深度参编,入选代表性厂商
- android 红外遥控程序,基于Dragonboard 410c android系统红外遥控功能的实现方法
- 宏转录组方法_土壤宏转录组RNA的提取方法评价
- Win10Pcap驱动部分学习
- Matlab中num2str函数的用法
- 大文件的切割与归并(数据分析案例三)
- Grafana 导出所有dashboard
- 【Appium】基于 Appium 的 iOS 自动化
- 动态观测系统 overall memory 的变化