贪心算法;最小堆+哈夫曼树;打印出每个字母对应编码;调试了几次,应该无错;

 

 

关键在于最小堆与哈夫曼树的结构体定义与联系。

 

最小堆数组的结构体中存放频率与对应的哈夫曼树结点。

哈夫曼树的叶子结点存储字符,内结点以#存储,并且设置父指针与一个标志左或右孩子的标志,为了方便从叶结点回溯打印结果。

 

构造哈夫曼树之前,首先将叶结点放入堆中,初始化堆。 然后利用最小堆,每次取得两个频率最小的哈夫曼树结点,并设最小的为父亲的左孩子,次小的为父亲的右孩子,然后生成一个新的结点,其频率为两者之和,并且修改两个结点的父亲为该结点,加入到堆中,并将两个结点删除。 然后再重复寻找2个最小结点,重复这样的工作,一直运行n-1次即可全部合并完毕,这时取出堆中的最后一个结点即为哈夫曼树的根节点。

 

为了能够回溯打印每个叶结点的Code,我们在构造哈夫曼树之前就应该将这些哈夫曼树叶结点存放于一个数组中,在构造结束后,我们从数组中依次根据每个叶结点的parent指针与标志域就可以回溯到根节点,打印出code码。 如果我们从根节点向下递归打印code是无法打印完成的,思考一下就可以明白了。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值