通过外部输入实现哈夫曼树的创建以及生成哈夫曼编码,用c++语言编写
时间: 2024-11-27 12:23:44 浏览: 23
【C++】根据输入的字符串生成哈夫曼树, 并进行哈夫曼编码和解码
5星 · 资源好评率100%
在C++中,我们可以使用哈希表和优先队列数据结构来实现哈夫曼树的创建及哈夫曼编码的过程。以下是基本步骤:
1. **输入频率统计**:
首先,从外部输入获取每个字符及其出现的频率,通常会存储在一个映射或关联数组中。
```cpp
#include <map>
std::map<char, int> frequencies;
// 读取并更新频率到frequencies中
```
2. **构建优先队列**:
使用`std::priority_queue`存储节点,每个节点包含字符和其频率。我们通常将频率作为比较关键字,频率低的元素排在前面。
```cpp
struct Node {
char c;
int freq;
std::pair<int, Node*> parent;
};
std::priority_queue<std::pair<int, Node*>, std::vector<std::pair<int, Node*>>, std::greater<int>> huffmanQueue(frequencies.begin(), frequencies.end());
```
3. **合并节点**:
从优先队列中取出两个频率最低的节点,合并成一个新的节点,新节点的频率等于两者之和,并将这个新节点插入回优先队列。这个过程会持续直到只剩下一个节点。
```cpp
while (huffmanQueue.size() > 1) {
auto left = huffmanQueue.top(); huffmanQueue.pop();
auto right = huffmanQueue.top(); huffmanQueue.pop();
huffmanQueue.push({left.first + right.first, createNode(left.second, right.second)});
}
```
4. **创建哈夫曼树和编码**:
最后的节点就是哈夫曼树的根,你可以递归地遍历这个树,左孩子代表0,右孩子代表1。对于每一个字符,记录路径上的所有节点即可得到对应的二进制编码。
```cpp
std::string huffmanCode(Node* root, std::string prefix) {
if (!root->parent)
return prefix;
return huffmanCode(root->parent->second, prefix + (root->parent->first == leftChild ? "0" : "1"));
}
// 调用函数生成所有字符的哈夫曼编码
for (auto& pair : frequencies) {
pair.second = huffmanCode(huffmanTree.root, "");
}
```
阅读全文