Huffman Tree
带权路径长度(WPL):二叉树有n个叶子结点,每个叶子结点带有权值Wk,从根结点到每个叶结点的长度为lk,则每个叶子结点的带权路径长度之和就是WPL.
最优二叉树或者哈夫曼树:WPL最小的二叉树
哈夫曼树的构造方法:
每次把权值最小的两颗二叉树合并。
这里利用最小堆的特性,构造一个最小堆,每次返回最小的结点,返回两次则可以作为哈夫曼树的左右结点,权值为左右结点之和,将这个新的结点插入到最小堆中,继续上面的操作。
时间复杂度O(N logN)
typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
int weight;
HuffmanTree left;
HuffmanTree right;
};
HuffmanTree Huffman(MinHeap H)
{
int i;
HuffmanTree T;
BuildMinHeap(H);
for (i = 1; i<H->size; i++){
T = (HuffmanTree)malloc(sizeof(struct TreeNode));
T->left = Delete(H);
T->right = Delete(H);
T->weight = T->left->weight+T->right->weight;
Insert(H, T);
}
T = Delete(h);
return t;
}
Huffman树的特点:
>没有度为1的结点
>n个叶子结点的Huffman树共有2n-1个结点
>哈夫曼树的任意非叶子结点的左右子树交换后,仍然是Huffman树
>对同一组权值,可能存在不同构的两棵Huffman树
Huffman Coding
优点:不定长编码,存储空间最少
注意 :