哈夫曼的构造算法:每次把权值最小的两颗二叉树合并
typedef strcut TreeNode *HuffmanTree;
struct TreeNode {
int Weight;
HuffmanTree Left, Right;
}
HuffmanTree Huffman( MinHeap H )
{
int i;
HuffmanTree T;
BuildMinHeap( H );//将H->Elements[]按权值调整为最小堆
for ( i = 1; i < H->Size; i++ ){
T = malloc( sizeof(struct TreeNode ) );
T->Left = DeleteMin( H );
//从最小堆中删除一个结点,作为新T的左子结点
T->Right = DeleteMin( H );
//从最小堆中删除一个结点,作为新T的右子结点
T->Wight = T->Left->Weight + T->Right->Weight;
//计算新权值
Insert( H, T );//将新T插入最小堆
}
T = DeleteMin( H );
retrun T;
}
这里的算法,在如何挑选两个最小元素时,用到了昨天所写的堆(最优队列)。每一次循环时,都从最小堆中挑选两个元素出来,既T->Left = DeleteMin( H ), T->Right = DeleteMin( H )。然后将其权值合并
T->Wight = T->Left->Weight + T->Right->Weight,接着插入到堆中去。
如果要从零开始构建哈夫曼树,流程应该是:
- 按照元素的频率高低,建立一个最小堆:BuildMinHeap( H )
- 建完堆之后,按照哈夫曼树的构造方法,从最小堆中选出两个最小的元素。
- Insert( H, T).