哈夫曼树的建立以及译码编码

这次来讲哈夫曼树,首先我们先创建一个哈夫曼树节点的结构体

HuffmanCode是代表每一个叶子节点的哈夫曼编码

接着我们来定义哈夫曼树的主体

 各个属性分别代表,哈夫曼树的叶子节点,哈夫曼编码,节点的个数,叶子的权重以及叶子节点所代表的字符

接下来我们就要在构造函数中初始化各个属性

我们知道在哈夫曼树中,叶子节点个数和哈夫曼树的节点个数之间的关系是2*n-1

那么在这里我们姑且将前n个节点定义为叶子节点,其余节点定义为分支节点,那么也就意味着最后一个节点是根节点,也就是2*codeSize-2这个节点

同时在HuffmanCoding()这个函数中对各个属性赋初值

 其中这里有一个select函数,目的是选择出权值最小的两个节点,并且这两个节点是未选择过的,也就是他的父母节点是不知道的(在我们这里定义的也即为0)

通过s1,s2分别来返回两个最小的和次小的节点

这个select函数直接决定着你的哈夫曼树的结构,给出的select函数仅供参考,不止这一种实现的方法

在基本建立出了一颗哈夫曼树之后,我们要对每一个叶子节点进行编码,通常来讲是向左是0,向右是1。

在这里我是选择从叶子节点向根节点移动,并将是左节点还是右节点保存在栈中

在这里并不是一定要从叶子节点出发去找根节点,同样可以从根节点出发去选找叶子节点 ,如果是这种情况的话,那判断的条件应该就是,当前节点的左节点为-1即可(哈弗曼树中只有度为0或者2的节点)

ok那么到现在我们才真正地得到一个可以进行译码和编码的哈夫曼树,下面来看一看如何进行哈夫曼编码

其实哈夫曼编码在创建出哈夫曼树之后就变得异常简单

 

 因为在创建哈夫曼树的过程中我们对每一个叶子节点进行了编码,并将编码的结果储存在了huffmanCode中,所以我们只要找到要编码的字符,在HuffmanCode中的位置,再将它续接到resString中即可

译码的过程则稍微复杂一点点,下面来看看实现

 译码我们选择从根节点出发,遇到0向左,遇到1向右,直到碰到叶子节点,然后我们只要找到叶子节点对应的符号,并将它添加到resString中。

以上

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值