哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩的哈夫曼编码。它是一种变长编码,其中常见的字符使用较短的编码,而不常见的字符使用较长的编码。哈夫曼树的构建过程如下: - 构建频率表:统计每个字符出现的频率。
- 构建最小堆:根据字符频率构建一个最小堆,频率最小的字符在树的顶部。
- 构建哈夫曼树:重复从最小堆中取出两个最小频率的节点,创建一个新的内部节点,其频率是这两个节点频率的和,然后将这个新节点重新加入到最小堆中,直到堆中只剩下一个节点,这个节点就是哈夫曼树的根节点。
以下是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) |