哈夫曼树的构造
- 每次把权值最小的两棵二叉树合并
// 建立哈夫曼树的结构体
typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
int Weight;
Huffman Tree Left,Right;
}
// 建立哈夫曼树
Huffman Tree Huffman(MaxHeap H)
{
int i;
HuffmanTree T;
BuildMinHeap(H); // 调整为最小堆
for (i=1;i<H->Size;i++)
{
T=malloc(sizeof(struct TreeNode));
T->Left=DeleteMin(H);
T->Right=DeleteMin(H);
T->Weight=T->Left->Weight+T->Right->Weight;
Insert(H,T);
}
T=DeleteMin(H);
return T;
}
// 时间复杂度为O(NlogN)
哈夫曼树的数特点:
- 没有度为1的结点
- n个叶子结点的哈夫曼树共有2n-1个结点
- 哈夫曼的任意非叶结点的左右子树交换后仍是哈夫曼树
- 对同一组权值{W1,W2,......,Wn},是否存在不同构的两棵哈夫曼树呢?
可能存在不同构的两棵哈夫曼树,但是他们的WPL值相同