欢迎关注本人b站账号:Dr_四倍体果蝇
UID:12595237
一、哈夫曼树の重要概念
结点的权、结点的带权路径长度,树的带权路径长度。
哈夫曼树(最优二叉树):含有某n个叶子结点的,带权路径长度最低的二叉树。
哈夫曼树不唯一。
二、哈夫曼树の构造
1.每次选择2个权值最低的结点(树)作为兄弟,形成新的树,根节点为两结点权值之和
2.新树加入树的集合
3.重复前两步直到剩下一棵树
一共结合n-1次。
哈夫曼树的结点数为n-1。
三、哈夫曼编码
往往结点的权重用其data的出现频率代替,为了让传递的二进制信息尽可能小。
例:根据ABCD的频率得到编码方案
左侧是固定长度编码,右侧是可变长度编码。
前缀编码:不存在某个元素的编码是另一个元素的前缀的情况。
非前缀编码:存在~
哈夫曼编码得到的一定是前缀编码。每一个元素作为叶子结点,把频度作为权值。一般左指针看成0,右指针看成1。
四、哈夫曼编码实现26字母表编码
已经将所有整理的思路放在了注释里。
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) // 数组的大小:数组的总字节数/数组的第一个元素的字节数
#define MAX_TREE_HT 100 // 哈夫曼树的编码数组的最大长度
// MinHeapNode 结构体定义
struct MinHeapNode {
char data;
int freq;
struct MinHeapNode* left, * right;
};
// MinHeapNode是最小堆的节点,包含字符数据和频率,以及左右子节点的指针
// 左右子节点指针为空的结点就是叶子结点,左右子节点指针不为空的结点就是内部结点
// 最小堆结点就是哈夫曼树的结点,哈夫曼树的叶子结点就是字符,哈夫曼树的非叶子结点就是内部结点
// MinHeap 结构体定义
struct MinHeap {
int size;
int capacity;
struct MinHeapNode** array;
};
// MinHeap是最小堆,包含堆的大小,容量,以及节点指针数组
/