哈夫曼树c++注意事项
时间: 2023-11-30 12:42:16 浏览: 88
以下是关于哈夫曼树在C++中的注意事项:
1. 哈夫曼树是一种二叉树,因此需要定义一个二叉树的结构体或***类。
3. 在构造哈夫曼树时,需要将节点按照权值从小到大排序,因此需要定义一个比较函数或者重载运算符来实现排序。
4. 在构造哈夫曼树时,需要使用递归的方法来构造树,因此需要定义一个递归函数来实现。
5. 在编码和解码时,需要使用哈希表来存储字符和对应的编码,因此需要定义一个哈希表的结构体或类来实现。
以下是一个简单的C++代码示例,用于构造哈夫曼树和进行编码和解码:
```c++
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
// 定义哈夫曼树节点结构体
struct HuffmanNode {
char ch; // 字符
int freq; // 权值
HuffmanNode *left, *right; // 左右子节点
HuffmanNode(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {}
};
// 定义最小堆的比较函数
struct Compare {
bool operator()(HuffmanNode* a, HuffmanNode* b) {
return a->freq > b->freq;
}
};
// 构造哈夫曼树
HuffmanNode* buildHuffmanTree(string s) {
// 统计字符出现的频率
unordered_map<char, int> freq;
for (char c : s) {
freq[c]++;
}
// 将字符和对应的频率存储到优先队列中
priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq;
for (auto p : freq) {
pq.push(new HuffmanNode(p.first, p.second));
}
// 构造哈夫曼树
while (pq.size() > 1) {
HuffmanNode* left = pq.top();
pq.pop();
HuffmanNode* right = pq.top();
pq.pop();
HuffmanNode* parent = new HuffmanNode('$', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
// 递归编码
void encode(HuffmanNode* root, string code, unordered_map<char, string>& table) {
if (!root) {
return;
}
if (root->ch != '$') {
table[root->ch] = code;
}
encode(root->left, code + "0", table);
encode(root->right, code + "1", table);
}
// 哈夫曼编码
string huffmanEncode(string s) {
// 构造哈夫曼树
HuffmanNode* root = buildHuffmanTree(s);
// 递归编码
unordered_map<char, string> table;
encode(root, "", table);
// 将字符串编码为二进制串
string res = "";
for (char c : s) {
res += table[c];
}
return res;
}
// 哈夫曼解码
string huffmanDecode(string s, HuffmanNode* root) {
string res = "";
HuffmanNode* cur = root;
for (char c : s) {
if (c == '0') {
cur = cur->left;
} else {
cur = cur->right;
}
if (cur->ch != '$') {
res += cur->ch;
cur = root;
}
}
return res;
}
int main() {
string s = "hello world";
string encoded = huffmanEncode(s);
cout << "Encoded string: " << encoded << endl;
HuffmanNode* root = buildHuffmanTree(s);
string decoded = huffmanDecode(encoded, root);
cout << "Decoded string: " << decoded << endl;
return 0;
}
```
阅读全文