哈夫曼编码的思想(思路)

写的比较乱(哈哈),但是理解起来应该还好大笑

//哈夫曼构建

#define n 50 //叶子节点个数
//哈夫曼重点在于它是用数组存储结构的,也是用数组序列化(构建)的
//它需要一个指明节点权值数组和节点自身字符数组的就可以了
//然后通过哈夫曼规则构建有父节点和左右孩子节点的结构体数组,这就是哈夫曼
//所以就没有用到链表指针
typedef struct node
{
    char ch;//节点字符,对于非叶子节点,此域不用
    int weight;//权值
    int parent;//父节点下标
    int lchild,rchild;//左右孩子下标
}HuffmanTree[2*n];

//1.对于Huffman这个数组,(0不用)前n项是叶子节点,后面n-1是非叶子节点
//2.所以首先是要初始化前n项叶子节点(也可以称为树)(主要初始化权值 weight 和其自身字符 ch,parent 和 child节点指向0 )
//3.其次初始化后n-1项非叶子节点(parent 和 child节点指向0)
//4.然后用这些叶子节点初始化后面的非叶子节点(如果设当前非叶子节点的下标为i,那么可以从0到i-1范围内循寻找最小权值的两个节点(访问过的节点可以用标志位标记为1),所以找到的条件是找到的两个节点是在前面节点中最小的且没有被标记的)
//5.初始化非叶子节点过程中,对于叶子节点要指明其父亲节点下标,对于非叶子节点要指明其左右孩子下标还有其权值是两个孩子权值之和

//哈夫曼的编码
typedef char* HuffmanCode[n+1]
//从其定义可知哈夫曼编码是一个字符指针数组,数组中的每个成员便是每个节点的编码了,
//由于它是变长的,所以设其为指针变量
//由哈夫曼自身规律可知编码的最大长度为n-1,即非叶子节点个数
//我们容易想到求各个叶子节点的编码可以逆推,从叶子节点一直推到根节点即可(编码可规定为:左孩子为0,右孩子为1)
//因为我们的叶子节点是存储在前n项数组中的,所以遍历前n项即可
//遍历也很简单,首先对于当前节点i我们要取出其父节点f,(在哈夫曼树中只有根节点没有父节点,只有叶子节点没有孩子),所以只要夫节点
//为空说明一个节点编码完成),然后就判断啊,f节点的做孩子是i的话就编码置为0,如果不是就置为1
//因为是逆推,所以字符指针可以分配一块有n个单位的地址,然后逆向赋值,这就ok了。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值