数据结构----哈夫曼树

一、哈夫曼树的基本概念

哈夫曼树也叫最优二叉树。
在这里插入图片描述
在这里插入图片描述结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树。反过来不成立。
在这里插入图片描述
在这里插入图片描述
满二叉树不一定是哈夫曼树,权值越大离根越近。具有相同带权结点的哈夫曼树不唯一。

二、哈夫曼树的算法

1,哈夫曼树的构造算法

把n个结点看成n颗二叉树,每次选取权值最小的两个根结点构成新的树,新的根结点的权值为左右子树根结点之和,新根结点的权值和剩余的权值比较,再选出最小的两个结点,重复上述步骤,直到森林中只有一颗树。
在这里插入图片描述
哈夫曼树只有度为0和2的结点。包含n个叶子结点(度为0)的哈夫曼树经过n-1次合并产生n-1个新结点(度为2),所以总共有2n-1个结点。

2,哈夫曼树算法实现

顺序存储:一维结构数组,2n-1个数组,定义2n大小的数组,只用1~2n-1,0空着。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、哈夫曼的编码

1,哈夫曼的编码思想

关键:要设计长度不等(出现频率高的长度更短,可以节约空间)的编码,任意字符不是其他字符的前缀(前缀编码)
哈夫曼树是
前缀编码
(没有一个叶子结点的祖先是别的叶子结点),且能保证字符编码总长度最短(因为哈夫曼树的带权路径长度最短)(最优前缀码)。
在这里插入图片描述

2,哈夫曼编码的算法实现

从一维数组的叶子结点出发,找双亲结点,根据双亲结点的指针域确定是左孩子还是右孩子,并且标记为0或者为1,继续从该结点找其双亲结点,重复步骤直到双亲结点的parent域为0,说明到根结点了。每个叶子结点重复该步骤。
需要一个二维数组记录每个叶子结点的编码,数组第一列为叶子结点的字符,第二列为字符顺序i(i=1~n),第三列存放字符编码(一个字符串),(哈夫曼树最高n-1层,因此字符串长度为n,前n-1存放编号,n位置存放\0,而且存放时从字符串的最后往前存放)。
在这里插入图片描述

3,文件的编码和译码

在这里插入图片描述
在这里插入图片描述
根据接收的字符频度表来构建哈夫曼树。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值