学习笔记:哈夫曼树及其应用

哈夫曼树及其应用

哈夫曼树

哈夫曼树又称最优二叉树,它是树的带权路径长度值最小的一棵二叉树,可用于构造最优编码,在信息传输,数据压缩等方面有着广泛的应用。

相关概念

  1. 路径:树中一个结点到另一个结点之间的分支序列。

  2. 路径长度:路径上分支的条数。

  3. 结点的权:给结点赋予的数值。

  4. 带权路径长度:结点的权值就是与该结点到数根间路径长度的乘积。

  5. 树的带权路径长度树中所有叶子结点的带权路径长度之和,计为:WPL

在这里插入图片描述
在这里插入图片描述

  1. 最优二叉树:在叶子个数n以及各叶子权值Wi确定的条件下,树的带权路径长度WPL值最小的二叉树称为最优二叉树。

(哈夫曼依据最优二叉树的特点:权值越大,离根越近!给出了构造方法,因此最优二叉树又称哈夫曼树。)

哈夫曼树的建立

  1. 初始化:按给定的n个权值{w1,w2,…wn},构造n棵二叉树的集合F={T1,T2,…Tn},其每棵二叉树只含一个权值为wi的根结点,左右子树为空树。
  2. 在F中选取根结点权值最小的两棵二叉树,分别作为左右子树构造一颗新的二叉树,并置新二叉树根结点的权值为其左右子树根结点的权值之和。
  3. 从F中删除选中的两颗树,并插入刚生成的新树。
  4. 重复2,3两步,直至F中只含一棵树为止。

哈夫曼算法的实现

对于给定的N个叶子节点,构造哈夫曼树,其最终总的结点数一定是:2N-1。

可选用静态链表作为存储结构。即用哈2N-1个元素的数组来存储哈夫曼树,结点间的父子关系用下标来指示。

在使用哈夫曼树进行编码和编译时,既要用结点的双亲信息,有要用结点的孩子信息,所以采用静态三叉链表存储哈夫曼树。
在这里插入图片描述

#define N 20
#define M 2*N-1

typedef struct
{
   
	int weight;
	int parent;
	int LChild;
	int RChild;
}HTNode,HuffmanTree[M+1];

在这里插入图片描述

哈夫曼算法:

void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小张的日常笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值