5.2 哈夫曼树与哈夫曼编码

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构造编码二叉树:


你可能感兴趣的:(5.2 哈夫曼树与哈夫曼编码)