构建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