c++哈夫曼树和哈夫曼表

哈夫曼树(Huffman Tree)是一种用于编码和解码的数据结构。它是一种二叉树,具有以下特点:

  1. 权值越大的节点越靠近树的根部。
  2. 没有度为1的节点。
  3. 叶子节点存储着编码后的数据,而非叶子节点存储着编码规则。

哈夫曼表(Huffman Table)是用于存储字符和其对应编码的数据结构。它可以通过哈夫曼树来生成,具有以下特点:

  1. 每个字符都有唯一的编码。
  2. 编码的长度和字符的出现频率相关,频率越高的字符编码越短。

在C++中,可以使用结构体或类来实现哈夫曼树和哈夫曼表。

下面是一个使用结构体来实现哈夫曼树的示例代码:

cpp 复制代码
// 哈夫曼树节点
struct HuffmanNode {
    char data;  // 节点存储的字符
    int weight;  // 节点的权值
    HuffmanNode* left;  // 左子节点指针
    HuffmanNode* right;  // 右子节点指针

    HuffmanNode(char d, int w) : data(d), weight(w), left(nullptr), right(nullptr) {}
};

// 构造哈夫曼树
HuffmanNode* buildHuffmanTree(vector<pair<char, int>>& data) {
    struct Compare {
        bool operator()(HuffmanNode* a, HuffmanNode* b) {
            return a->weight > b->weight;
        }
    };

    priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq;

    // 将data中的字符和权值构造为HuffmanNode,并放入优先队列
    for (auto ele : data) {
        pq.push(new HuffmanNode(ele.first, ele.second));
    }

    // 不断取出权值最小的两个节点,构造新的节点,再放入优先队列,直到只剩下一个节点
    while (pq.size() > 1) {
        HuffmanNode* node1 = pq.top();
        pq.pop();
        HuffmanNode* node2 = pq.top();
        pq.pop();

        HuffmanNode* newNode = new HuffmanNode('\0', node1->weight + node2->weight);
        newNode->left = node1;
        newNode->right = node2;

        pq.push(newNode);
    }

    return pq.top();
}

下面是一个使用哈夫曼树生成哈夫曼表的示例代码:

cpp 复制代码
// 哈夫曼表条目
struct HuffmanEntry {
    char data;  // 字符
    string code;  // 字符对应的编码
};

// 构造哈夫曼表
void buildHuffmanTable(HuffmanNode* root, string code, vector<HuffmanEntry>& table) {
    if (root == nullptr) {
        return;
    }

    if (root->left == nullptr && root->right == nullptr) {
        HuffmanEntry entry;
        entry.data = root->data;
        entry.code = code;
        table.push_back(entry);
    }

    buildHuffmanTable(root->left, code + "0", table);
    buildHuffmanTable(root->right, code + "1", table);
}

使用示例:

cpp 复制代码
int main() {
    vector<pair<char, int>> data = {{'a', 5}, {'b', 9}, {'c', 12}, {'d', 13}, {'e', 16}, {'f', 45}};

    HuffmanNode* root = buildHuffmanTree(data);

    vector<HuffmanEntry> table;
    buildHuffmanTable(root, "", table);

    // 输出哈夫曼表
    for (auto entry : table) {
        cout << entry.data << ": " << entry.code << endl;
    }

    return 0;
}

这样,就可以通过构造哈夫曼树和哈夫曼表来实现对数据的编码和解码操作。

相关推荐
XiaoLeisj17 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq37 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v2 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A3 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组