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

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

相关推荐
艾莉丝努力练剑24 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
_殊途2 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
秋说6 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法
lifallen7 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
liupenglove7 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
python_tty8 小时前
排序算法(二):插入排序
算法·排序算法
然我8 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法
risc1234568 小时前
BKD 树(Block KD-Tree)Lucene
java·数据结构·lucene
F_D_Z9 小时前
【EM算法】三硬币模型
算法·机器学习·概率论·em算法·极大似然估计