目录
1.问题
2.解析
哈夫曼编码
而上图得到的前缀码不是最优的
在每次加法时,若第二个加数小于等于第一个加数时,则将以第二个加数为根的树放在第一个加数左边,得到最优前缀码如下:
3.设计
create_HuffmanTree();
void HfCoding(HfTree HT, HfCode& HC, int n)
{
HC = (HfCode)malloc(n * sizeof(char*));
char* code = (char*)malloc(n * sizeof(char));
int cur = 2 * n - 2,code_len = 0;
for (int i = 0; i < cur + 1; i++)
{
HT[i].weight = 0;
}
while (cur != -1)
{
if (HT[cur].weight == 0)
{
HT[cur].weight = 1;
if (HT[cur].lchild != -1)
{
code[code_len++] = '0';
cur = HT[cur].lchild;
}
else
{
code[code_len] = '\0';
HC[cur] = (char*)malloc((code_len + 1) * sizeof(char));
if (!HC[cur])
{
printf("HC[cur] malloc faild!");
exit(-1);
}
strcpy(HC[cur], code);
}
}
else if (HT[cur].weight == 1)
{
HT[cur].weight = 2;
if (HT[cur].rchild != -1)
{
code[code_len++] = '1';
cur = HT[cur].rchild;
}
}
else
{
HT[cur].weight = 0;
cur = HT[cur].parent;
--code_len;
}
}
free(code);
}