用c++ 写一个哈夫曼树,并且输出他的表
时间: 2024-04-30 11:19:19 浏览: 11
下面是使用C++实现哈夫曼树,并输出哈夫曼表的示例代码:
```c++
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
// 定义哈夫曼树结点
struct HuffmanNode {
char c; // 字符
int freq; // 频率
HuffmanNode* left; // 左子节点指针
HuffmanNode* right; // 右子节点指针
HuffmanNode(char c = '\0', int freq = 0, HuffmanNode* left = nullptr, HuffmanNode* right = nullptr) :
c(c), freq(freq), left(left), right(right) {}
};
// 定义哈夫曼编码表类型
using HuffmanTable = unordered_map<char, string>;
// 定义比较函数类
class Compare {
public:
bool operator()(const HuffmanNode* a, const HuffmanNode* b) {
return a->freq > b->freq;
}
};
// 构建哈夫曼树
HuffmanNode* buildHuffmanTree(const string& s) {
vector<int> freq(256, 0); // 统计字符出现的频率
for (char c : s) {
++freq[c];
}
priority_queue<HuffmanNode*, vector<HuffmanNode*>, Compare> pq;
for (int i = 0; i < 256; ++i) {
if (freq[i] > 0) {
pq.push(new HuffmanNode(i, freq[i]));
}
}
while (pq.size() > 1) {
HuffmanNode* left = pq.top();
pq.pop();
HuffmanNode* right = pq.top();
pq.pop();
pq.push(new HuffmanNode('\0', left->freq + right->freq, left, right));
}
return pq.top();
}
// 生成哈夫曼编码表
void generateHuffmanTable(HuffmanNode* root, string code, HuffmanTable& table) {
if (!root) {
return;
}
if (root->c != '\0') {
table[root->c] = code;
}
generateHuffmanTable(root->left, code + "0", table);
generateHuffmanTable(root->right, code + "1", table);
}
// 输出哈夫曼表
void printHuffmanTable(const HuffmanTable& table) {
cout << "Huffman Table:" << endl;
for (const auto& p : table) {
cout << p.first << ": " << p.second << endl;
}
}
int main() {
string s = "Hello World!";
HuffmanNode* root = buildHuffmanTree(s);
HuffmanTable table;
generateHuffmanTable(root, "", table);
printHuffmanTable(table);
return 0;
}
```
代码中使用了一个优先队列来存储哈夫曼树节点,每次取出频率最小的两个节点合并成一个新节点,并加入队列中。然后通过递归遍历哈夫曼树,生成哈夫曼编码表,并输出哈夫曼表。