数据结构-编写哈夫曼树

本文介绍了哈弗曼树的基本概念,包括树中每个节点的权值、带权路径长度以及最小带权路径长度的二叉树定义。详细阐述了哈弗曼树的构造算法,通过不断合并权值最小的子树来构建最终的哈弗曼树。同时,解释了哈弗曼编码的规则,即在哈弗曼树中以左分支为0,右分支为1,确定从根节点到每个叶子节点的编码。

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

数据结构—哈弗曼树

(学期接近尾声,学数据结构13周了,还是好菜。)

1.哈夫曼树

树中的每个结点赋予一个数值,称为权。
从根结点到该结点之间的路径长度与该结点权的乘积为节点的带权路径长度。
所有叶子结点的带权路径长度之和最小的二叉树称为哈弗曼树。

2.哈夫曼树的构造算法

(1)根据给定的n0个权值对应构成n0棵二叉树的森林F,每棵二叉树中都只有一个带权值wi的根结点,其左右孩子为空。
(2)森林F中选取两棵结点权值最小的子树分别作为左右子树构造成一棵新的二叉树,并且新的二叉树的权值为左右子树权值之和。
(3)森林F中,用新的二叉树代替这两棵子树。
(4)重复(2)和(3),直到只剩一棵树,这棵树便是哈弗曼树。

示例:

在这里插入图片描述
这里有个定理:对于有n0个叶子结点的哈弗曼树,共有2*n0-1个结点。

// 哈弗曼树结点类型
typedef struct
{
    char data;
    double weight;
    int parent;
    int lchild;
    int rchild;
}HTNode;

↓ht[0]~ht[n0-1]存放叶子结点,ht[n0] ~ht[2*n0-2]存放非叶子结点。

// 构造哈弗曼树
void CreateHT(HTNode ht[],int n0)
{
   
    int i,k,lnode,rnode;
    double min1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值