[C、C++]数据结构:哈夫曼树 & 字母表的哈夫曼编码

本文详细介绍了哈夫曼树的概念,包括带权路径长度、构造过程、如何使用字符频率构建哈夫曼树以及哈夫曼编码的应用,涉及最小堆的使用和前缀编码的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎关注本人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是最小堆,包含堆的大小,容量,以及节点指针数组
/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值