通过键盘输入每个字符的出现概率,实现赫夫曼树和赫夫曼编码的程序代码,在屏幕上输出赫夫曼树及编码的结果。用c++写
时间: 2024-12-22 22:25:18 浏览: 11
在C++中,我们可以使用优先队列(`std::priority_queue`)以及一个简单的哈希表来构建赫夫曼树和生成编码。以下是实现该功能的一个基础版本:
```cpp
#include <iostream>
#include <queue>
#include <unordered_map>
#include <string>
struct Node {
char data;
int freq;
Node* left;
Node* right;
// 构造函数
Node(char ch, int f) : data(ch), freq(f), left(nullptr), right(nullptr) {}
};
// 计算两节点的合并频率
int combineFrequencies(Node* a, Node* b) {
return a->freq + b->freq;
}
// 比较两个节点的频率大小并返回最小的那个
bool compareNodes(const Node* a, const Node* b) {
return a->freq < b->freq;
}
// 创建赫夫曼树
Node* createHuffmanTree(std::unordered_map<char, int>& frequencies) {
std::priority_queue<Node*, std::vector<Node*>, decltype(compareNodes)> pq(compareNodes);
for (const auto& pair : frequencies) {
pq.push(new Node(pair.first, pair.second));
}
while (pq.size() > 1) {
Node* left = pq.top(); pq.pop();
Node* right = pq.top(); pq.pop();
pq.push(new Node('\0', combineFrequencies(left, right)));
pq.push(left);
pq.push(right);
}
return pq.top();
}
// 打印赫夫曼树
void printHuffmanTree(Node* root) {
if (!root) return;
printHuffmanTree(root->left);
std::cout << " " << root->data;
printHuffmanTree(root->right);
}
// 赫夫曼编码
std::string huffmanCode(Node* root, std::string code = "") {
if (!root) return code;
return huffmanCode(root->left, code + "0") + huffmanCode(root->right, code + "1");
}
int main() {
std::unordered_map<char, int> inputFrequencies = { {'A', 5}, {'B', 9}, {'C', 3} }; // 输入字符及其出现频率
Node* huffmanRoot = createHuffmanTree(inputFrequencies);
std::cout << "Huffman Tree:" << std::endl;
printHuffmanTree(huffmanRoot);
std::string huffmanCodeResult = huffmanCode(huffmanRoot);
std::cout << "\nHuffman Codes: {" << std::endl;
for (const auto& pair : inputFrequencies) {
std::cout << "'" << pair.first << "' -> '" << huffmanCodeResult[pair.first] << "'" << std::endl;
}
std::cout << "}" << stdendl;
return 0;
}
```
这个程序首先创建了一个基于频率的优先队列,并从输入频率映射开始构建赫夫曼树。然后打印出赫夫曼树,并计算每个字符的编码。注意,这里我们假设字符集固定并且只包含大写字母,你可以根据实际需求修改。
阅读全文