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;
}

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

相关推荐
zander25825 分钟前
114. 二叉树展开为链表
数据结构·链表·深度优先
变量未定义~1 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH1 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜1 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu1 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana22 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode