哈夫曼树与哈夫曼编码

  最近写了一个哈夫曼编码小程序。对于数据结构书上介绍的算法硬是没看懂,而只是看懂了图示,所以就用了自己的方式来做。

   程序运行如下图:

 2011022101471261.jpg

 

  写了一个哈夫曼树类。可以对任何数据进行编码。测试的话,只需要输入要进行编码的字符串就行了,会输出编码方案(就是编码后对应的01序列),对应的哈夫曼树形态,和编码结果。

 

   我的哈夫曼树类,在内部维护了一个链式二叉树。当输入一个字符串作为要编码的对象时,做如下几步:

  1.先统计各个字符出现的次数。比如:“Steven Kyle Lee”中的e出现了5次。
  2.用字符和它的出现次数(作为权值),new出对应的树节点。这些节点纳入一个线性表(list容器),这一步相当于是创建森林了,只是每个树都只有一个根节点。
  3.构建哈夫曼树。做一个循环,找出森林中权值最小的2棵树,new出一个树节点,其左右子树分别接上权值最小的2棵子树,其自身的权值是找出的权值最小2棵子树的和。删除找出的权值最小的2棵子树。new出来的这个结点纳入list容器.(实际中,这一步,是在其中一个权值最小的节点上操作的,只删除另一个权值最小的节点)。循环退出条件是list容器只剩下一颗树。
  4.经过步骤3后,list容器剩下的那棵树即是一棵哈夫曼树了。其实以上3步,就是模拟了书上图示的过程。
  5.创建哈夫曼树完成后,就要知道某个字符对应的哈夫曼编码了(01序列)。这个比较简单,递归遍历树,进入左子树编码序列加0,进入右子树编码序列加1。达到叶子节点后,就用map容器创建映射关系(key是要编码的字符,Value是这个字符对应的01序列)

 

  OK,我的算法大概就如上所述。附上源代码(VS2008),高手多多指教!

  

  源代码下载

转载于:https://www.cnblogs.com/StevenKyleLee/archive/2011/02/19/1958278.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值