用c++完成哈夫曼树构造及其哈夫曼编码 输入格式: 请依次输入结点权值: 5 29 7 8 14 23 3 11 输出哈夫曼编码为: 5 :0001 29 :10 7 :1110 8 :1111 14 :110 23 :01 3 :0000 11 :001
时间: 2024-12-22 18:25:33 浏览: 8
哈夫曼树-数据压缩与优化:基于哈夫曼树的最佳编码实践及其应用
在C++中,我们可以使用优先队列(如`std::priority_queue`)以及哈夫曼树的特性来构造哈夫曼树并生成哈夫曼编码。下面是一个简单的步骤概述:
1. 定义一个结构体或类`Node`,包含节点值(weight)和一个空的左子节点和右子节点。
```cpp
struct Node {
int weight;
Node* left = nullptr;
Node* right = nullptr;
};
```
2. 输入数据,创建一个大小为节点数的优先队列,并将所有节点插入其中,按照权重从小到大排序。
```cpp
int weights[] = {5, 29, 7, 8, 14, 23, 3, 11}; // 权重数组
std::priority_queue<std::pair<int, Node*>, std::vector<std::pair<int, Node*>>, std::greater<int>> pq(weights.begin(), weights.end());
```
3. 从队列中取出两个最小权重的节点,合并它们成为新节点(根节点),并将新节点的权重设为两个子节点的权重之和。同时将新节点放回队列。
```cpp
while (pq.size() > 1) {
auto node1 = pq.top(); pq.pop();
auto node2 = pq.top(); pq.pop();
pq.push({node1.first + node2.first, new Node{node1.first + node2.first, node1.second, node2.second}});
}
```
4. 最后的队列顶元素就是哈夫曼树的根节点。为了找到每个节点的哈夫曼编码,我们需要一个递归函数来遍历树并记录路径。
```cpp
void getHuffmanCode(Node* root, std::string code, std::map<int, std::string>& huffmanCodes) {
if (!root->left && !root->right) { // 叶子节点,直接添加哈夫曼编码
huffmanCodes[root->weight] = code;
} else {
getHuffmanCode(root->left, code + "0", huffmanCodes);
getHuffmanCode(root->right, code + "1", huffmanCodes);
}
}
```
5. 调用`getHuffmanCode`函数获取哈夫曼编码,然后输出结果。
```cpp
std::map<int, std::string> huffmanCodes;
getHuffmanCode(pq.top(), "", huffmanCodes);
// 输出哈夫曼编码
for (const auto& pair : huffmanCodes) {
std::cout << pair.first << ": " << pair.second << "\n";
}
```
阅读全文