用c++语言写一个能在clion上运行的哈夫曼树
时间: 2024-12-29 13:35:25 浏览: 39
在CLion中编写一个Huffman树的C++程序需要包含基本的数据结构、优先队列以及Huffman编码算法。下面是一个简单的示例,使用`std::pair`和`std::priority_queue`实现Huffman树:
```cpp
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <map>
// 定义一个节点类
struct Node {
char data;
int freq; // 频率
Node* left, *right;
Node(char d, int f) : data(d), freq(f), left(nullptr), right(nullptr) {}
};
// 计算两个节点频率之和
int combineFrequencies(Node* a, Node* b) {
return a->freq + b->freq;
}
// 使用自定义比较函数进行优先级队列操作
bool compareByFrequency(const std::pair<Node*, int>& nodePair1, const std::pair<Node*, int>& nodePair2) {
return nodePair1.second > nodePair2.second;
}
// 创建Huffman树函数
Node* buildHuffmanTree(std::vector<std::pair<char, int>>& frequencies) {
if (frequencies.empty()) return nullptr;
std::priority_queue<std::pair<Node*, int>, std::vector<std::pair<Node*, int>>, decltype(compareByFrequency)> pq(compareByFrequency);
for (const auto& pair : frequencies) {
pq.push({new Node(pair.first, pair.second), pair.second});
}
while (pq.size() > 1) {
Node* left = pq.top().first;
pq.pop();
Node* right = pq.top().first;
pq.pop();
Node* combined = new Node('\0', combineFrequencies(left, right));
combined->left = left;
combined->right = right;
pq.push({combined, combineFrequencies(combined, left)});
}
return pq.top().first;
}
// 打印Huffman编码
void printCodes(Node* root, std::map<char, std::string>& codes, std::string prefix = "") {
if (!root) return;
if (root->data != '\0') {
codes[root->data] = prefix;
}
printCodes(root->left, codes, prefix + "0");
printCodes(root->right, codes, prefix + "1");
}
int main() {
std::vector<std::pair<char, int>> frequencies{{'a', 5}, {'b', 9}, {'c', 4}, {'d', 6}};
Node* huffmanTree = buildHuffmanTree(frequencies);
std::map<char, std::string> codes;
printCodes(huffmanTree, codes);
// 在这里你可以打印出生成的Huffman编码,例如:
for (const auto& pair : codes) {
std::cout << "Character '" << pair.first << "' has Huffman code: " << pair.second << std::endl;
}
delete huffmanTree; // 释放内存
return 0;
}
```
在CLion中编译这个程序并运行,它将创建一个基于给定字符频率的Huffman树,并打印出每个字符对应的Huffman编码。
阅读全文
相关推荐


















