概念

typedef struct TreeNode* HuffmanTree;
struct TreeNode{
int weight;
HuffmanTree Left,Right;
};
typedef struct HNode* Heap;
struct HNode{
HuffmanTree Elements;
int Size;
int Capacity;
};
HuffmanTree Huffman(Heap H)
{
int i;
HuffmanTree T;
BuildMinHeap(H);
for(i=1;i<H->Size;i++){
T=(HuffmanTree)malloc(sizeof(struct TreeNode));
T->Left=DeleteMinHeap(H);
T->Right=DeleteMinHeap(H);
T->weight=T->Left->weight+T->Right->weight;
Insert(H,T);
}
T=DeleteMinHeap(H);
return T;
}
哈夫曼树的特点
- 没有度为1的结点
- 有n个叶子结点的哈夫曼树共有2n-1个结点
- 哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树
- 对同一组权值{w1 ,w2 , …… , wn},存在不同构的两棵哈夫曼树
哈夫曼编码
- 为节省空间,可进行不等长编码(如根据频率高低)
- 在不等长编码时要注意避免编码的二义性
- 避免二义性的方法:使用前缀码(prefix code:任何字符的编码都不是另一字符编码的前缀)可以无二义地解码
