欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

哈夫曼树 Huffman Tree

时间:2024-06-21 10:40 作者:admin 点击:
哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩的哈夫曼编码。它是一种变长编码,其中常见的字符使用较短的编码,而不常见的字符使用较长的编码。哈夫曼树的构建过程

哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩的哈夫曼编码。它是一种变长编码,其中常见的字符使用较短的编码,而不常见的字符使用较长的编码。哈夫曼树的构建过程如下:

  1. 构建频率表:统计每个字符出现的频率。
  2. 构建最小堆:根据字符频率构建一个最小堆,频率最小的字符在树的顶部。
  3. 构建哈夫曼树:重复从最小堆中取出两个最小频率的节点,创建一个新的内部节点,其频率是这两个节点频率的和,然后将这个新节点重新加入到最小堆中,直到堆中只剩下一个节点,这个节点就是哈夫曼树的根节点。

以下是C++代码示例,展示如何构建哈夫曼树:

#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <string>

// 定义哈夫曼树的节点
struct HuffmanNode {
    char data; // 存储字符
    int freq; // 存储字符的频率
    HuffmanNode *left, *right;

    // 构造函数
    HuffmanNode(char data, int freq) : data(data), freq(freq), left(nullptr), right(nullptr) {}
};

// 定义比较函数,用于优先队列
struct Compare {
    bool operator()(HuffmanNode* l, HuffmanNode* r) {
        return l->freq > r->freq;
    }
};

// 构建哈夫曼树
HuffmanNode* buildHuffmanTree(const std::map<char, int>& freq) {
    std::priority_queue<HuffmanNode*, std::vector<HuffmanNode*>, Compare> minHeap;

    // 将每个字符及其频率加入最小堆
    for (auto& pair : freq) {
        minHeap.push(new HuffmanNode(pair.first, pair.second));
    }

    // 构建哈夫曼树
    while (minHeap.size() > 1) {
        HuffmanNode* left = minHeap.top();
        minHeap.pop();
        HuffmanNode* right = minHeap.top();
        minHeap.pop();

        // 创建一个新的内部节点
        HuffmanNode* sum = new HuffmanNode('$', left->freq + right->freq);
        sum->left = left;
        sum->right = right;

        // 将新节点加入最小堆
        minHeap.push(sum);
    }

    return minHeap.top(); // 返回哈夫曼树的根节点
}

// 打印哈夫曼编码
void printCodes(HuffmanNode* root, const std::string& str) {
    if (!root)
        return;

    if (root->left == nullptr && root->right == nullptr) {
        std::cout << root->data << ": " << str << std::endl;
        return;
    }

    printCodes(root->left, str + "0");
    printCodes(root->right, str + "1");
}

int main() {
    // 假设有以下字符及其频率
    std::map<char, int> freq = {
        {'a', 5}, {'b', 9}, {'c', 12}, {'d', 13}, {'e', 16}, {'f', 45}
    };

    // 构建哈夫曼树
    HuffmanNode* root = buildHuffmanTree(freq);

    // 打印哈夫曼编码
    printCodes(root, "");

    // 释放哈夫曼树占用的内存
    // ...

    return 0;
}

请注意,上述代码中没有包含释放哈夫曼树占用的内存的代码。


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%