[数据结构]哈夫曼树和哈夫曼编码、译码(通俗易懂)

一、哈夫曼树的相关的几个名词

1、路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。如下图根结点到a结点之间的通路就是一条路径。

2、路径长度:在一条路径中,每经过一个结点,路径长度都要加1。如下图根结点到b结点之间所经过的通路数为2,也就是路径长度为2。

3、结点的权:每一个结点都有一个唯一的数值,称为结点的权。如下图结点a的权值为7,b的权值为5。

4、结点的带权路径长度:根结点到结点间的路径长度*结点的权值。如图1结点b的带权路径长度=2*5=10。

5、树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。如图1的WPL=1*7+2*5+3*2+3*4=35。

二、什么是哈夫曼树?

在权为w1,w2,...,wn的n各叶子结点的所有二叉树中,树的带权路径长度WPL最小的二叉树称为最优二叉树,也叫赫夫曼树或哈夫曼树。

//哈夫曼树的结点结构
typedef struct {
	char ch;///字符结点
	int weight;///字符权值
	int parent;///父母结点
	int lchild;///左孩子在数组位置的下标
	int rchild;///右孩子在数组位置的下标
}hnode;

三、如何构建哈夫曼树?

在构建哈夫曼树时,只需遵循一个原则:权值越大的结点离根结点越近。(权值最大就作为根结点)

1、构建哈夫曼树的过程:

(1)在n个结点权值中选出最小和次最小的结点权值,两结点组成一个新的二叉树,其根结点的权值为左右孩子结点的权值和。

(2)在原有的n个结点权值中删除最小和次最小·,将新权值加入到n-2个权值的行列中。

(3)重复(1)、(2),直到所有结点构成一棵二叉树为止,这棵树就是哈夫曼树。

2、构建哈夫曼树:

哈夫曼树表:

结点i 字符 权值 左孩子 右孩子 双亲结点
0 a 7 -1 -1 6
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值