哈夫曼编码的算法实现

假设要得到G的编码,查7号结点的parent域的值,是8,再去查8的左孩子右孩子域的值,他是左孩子,标注0

8号结点的parent是10号,8是左孩子,记0......继续往上找,

 

有多少个结点做多少次,写成循环,有n个结点,i的值从1开始,i<=n,都需要求出他们的哈夫曼编码,每次都找当前节点的双亲,然后看他是左孩子还是右孩子,分出0和1,直到双亲的parent为0,就找到根结点,可以结束

while,用f表示parent的值,只要不为0,就要反复回溯到双亲

在这个过程中,n个字符需要n个由0和1组成的字符串,所以我们需要由字符串构成的数组,即二维的字符数组,HC是头指针

 

把中间得到的0和1,用字符数组cd存起来,有n个元素,得到的哈夫曼树最高有n-1层,因为一开始两个结点合并,他们是在同一层,所以最高n-1层,即编码最多有n-1位,所以数组长度为n-1位就够了

我们这里把他当作字符串来看待,多一个位置,用来存放字符串结束标志\0,然后循环从下标为1开始,这里数组是要倒着放,所以数组的下标从n-1开始

 

 

 

 

 

要有这样一个循环,从1到n,反复的找双亲结点

结束了,就给字符串数组HC[i]分配一个空间HC[i]=new char[n-start]

然后将我们临时存储在cd数组中从start开始复制到HC里就行了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值