1. 引入
例:将百分制的考试成绩转换为五分制成绩。
如何根据不同的查找频率构造更有效的搜索树
2. 哈夫曼树的定义
3. 哈夫曼树的构造
将权值从小到大进行排序,每次把权值最小的两颗二叉树合并形成一个新的二叉树,新二叉树权值为两个合并二叉树权值的和。
typedef struct TreeNode *HuffmanTree;
struct TreeNode{
int Weight;
HuffmanTree Left;
HuffmanTree Right;
};
// 假设H->Size个权值已经存在H->Elements[]->Weight里
HuffmanTree Huffman( MinHeap H )
{
int i;
HuffmanTree T;
BuildMinHeap(H); // 将H->Elements[]按权值调整为最小堆
for(i = 1; i < H->Size; i++)
{
T = (HuffmanTree)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); // T为根结点【有一点不理解的:返回根结点后这个Huffman树是否已经构造好了,怎么构造的?通过堆?】
return T;
}
整体时间复杂度O(NlogN)
4.哈夫曼树的特点
5. 哈夫曼编码
用Huffman构造编码二叉树: