typedef struct TreeNode *HuffmanTree;
struct TreeNode {
int Weight;
HuffmanTree Left, Right;
};
void Insert(int X)
{ // 将X插入最小堆H中
int i;
// 检查堆是否已满
if (IsFull(H))
printf("已满");
for (i = ++size; H[i/2] > X; i/=2)
H[i] = H[i/2]; // 向上调整结点,保证最小堆的有序性
H[i] = X;
}
HuffmanTree Huffman(MinHeap H)
{
// 假设H->Size个权值已经存在H->Elements[]->Weight里
int i; HuffmanTree T;
BuildMinHeap(H); // 将H->Elements按权值调整为最小堆
for (i = 1; i < H->Size; i++) {
// 做H->Size-1次合并
T = malloc(sizeof(struct TreeNode)); // 建立新结点
T->Left = DeleteMin(H); // 从最小堆中删除一个结点,作为新T的左子结点
T->Right = DeleteMin(H); // 从最小堆中删除一个结点,作为新T的右子结点
T->Weight = T->Left->Weight + T->Right->Weight; // 计算新权值
Insert(H, T); // 将新T插入最小堆
}
T = DeleteMin(H);
}
int WPL(HuffmanTree T, int Depth)
{ // 计算最优编码长度
if (!T->Left && !T->Right)
return (Depth * T->Weight);
else // 否则T一定有2个孩子
return (WPL(T->Left, Depth+1)
+ WPL(T->Right, Depth+1));
}
int main()
{
MinHeap H = CreateHeap(N); // 创建一个空的、容量为N的最小堆
H = ReadData(N); // 将f[]读入H->Data[]中
HuffmanTree T = Huffman(H); // 建立Huffman树
int CodeLen = WPL(T, 0); // 计算最优编码长度
}
【例】