数据结构笔记--haffman树与haffman编码分析

构建haffman树思想是把所有的字符挂到一颗完全二叉树的叶子节点,任何一个非页子节点的左节点出现频率不大于右节点。算法为把统计信息转为Node存放到一个数组里面,每一次从数组里面删选两个最小的节点,构建一个新的父Node(非叶子节点), 字符内容刚弹出来的两个节点字符内容之和,最开始的弹出来的作为左子节点,后面一个作为右子节点,并且把刚构建的父节点放到数组里面。重复以上的动作N-1次,N为不同字符的个数(每一次数组里面个数减1)。结束以上步骤,数组里面剩一个节点,弹出作为树的根节点。代码重点在与从数组中找出最小与次小值。
定义一颗haffman树节点的结构体如下:

typedef struct hafftree
{
    int  m_weight;   // 权重
    int  m_lchild;   // 左孩子节点位置
    int  m_rchild;   // 右孩子节点位置
    int  m_parent;   // 父节点位置
    bool m_flag;     // 是否遍历过
}HaffTree;

给出函数原型:HaffTree* CreateHaff(int* weight, int len, HaffTree *pHT);
void HaffCode(HaffTree* pHT, int len, vector* vCode);

首先,要创建一颗haffman树,需要一个整形数组,根据数组元素创建。有数组,为了可扩展性,那就把长度也传进来吧。注意,我们认为,haffman编码的时候,给定一颗haffman树,第二个参数len保存的是weight数组的长度,如果你的需求不一样,可以自行修改。只需注意,weight数组的长度len1与创建后的haffman树数组长度len2的对应关系是len2 = len1*2-1。

#define MAX 0x7fffffff

// haffman树的创建
void CreateHaff(const int* weight, const int len, HaffTree* pHT
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值