huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

9b7c2d8c164b527853c49697679e0254.png

   艾薇巴蒂!许久不见甚是想念,想必这”涨姿势”的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码

构造哈夫曼树
首先,我们需要了解哈夫曼树是什么:

相关知识点路径: 

       路径是指从一个节点到另一个节点的分支序列。

04d2c5b66bd9ab0e0f48d96b5b3bc322.png

路径长度

       指从一个节点到另一个结点所经过的分支数目。,从根节点到a的分支数目是2,

d96dff6d2f2428b6c8b0fb8a784e6fd6.png

数的路径长度

       树中所有结点的路径长度之和为树的路径长度PL 如图pl为10

cdfb1b1a5c1977e79463e376cc446fc4.png

节点的权

        给树的每个结点赋予一个具有某种实际意义的实数,我们称该实数为这个结点的权

带权路径长度

        从树根到某一结点的路径长度与该节点的权的乘积,叫做该结点的带权路径长度树的带权路径长度: 树的带权路径长度为树中所有叶子节点的带权路径长度之和。

0b0c889f44ecd8e2fa1c5591d960302a.png

构造Huffman树的步骤:
      1) 根据给定的n个权值,构造n棵只有一个根结点的二叉树,n个权值分别是这些二叉树根结点的权;
      2) 设F是由这n棵二叉树构成的集合,在F中选取两棵根结点权值最小的树作为左、右子树,构造成一颗新的二叉树,置新二叉树根结点的权值等于左、右子树根结点的权值之和。为了使得到的哈夫曼树的结构唯一,规定根结点权值最小的作为新二叉树的左子树。

      3) 从F中删除这两棵树,并将新树加入F;
      4) 重复2)、3)步,直到F中只含一棵树为止,这棵树便是Huffman树。
说明:n个结点需要进行n-1次合并,每次合并都产生一个新的结点,最终的Huffman树共有2n-1个结点。

0cc8adac289a88006b0912eedb901b72.png

如何构建哈夫曼树:

a169fb94fb697a565e039b47ff94de0f.png

如上即可较为清晰的理解最优二叉树的构造了。哈夫曼树代码的实现

3a74bd7c94cdf20b507685b2c50a80aa.png

所以:我们构成了一个哈夫曼树的结点结构HTNode:

c3a01b35420b5e5e37c5c58f2deafaff.png e1913fc99b246bbd86d47e9035f6f39e.png 468d98cbaaa4cf2aa6e21d6b5740aeec.png 4a6421350e326053e337245dd8e174e5.png 73ff2dd94f1eb5f849a3c042fe2bc9d8.png ec13e0b752bf42a7a1e47cb5ec728cba.png

下面给出具体实现代码:

afccdb26ee43789a065c928329ffa4df.png

       不会吧?不会吧?不会真的还有人看了小软的课程还没有明白吧?不明白也没有关系哦,只要动动你可爱的小手指上滑再反复观看,拍拍你聪明的小脑袋瓜就一定能了如指掌啦!

       小软这就去再看一遍,让我们一起加油,顶峰相见!

01b8e6e23646b5e616f5836d72c84b74.png

- END -

图片来源:来源于网络

责任编辑:刘泊璇   连雨欢

6ba455a3df8cd829a8f8b0bd8dfb504c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值