请构造一棵赫夫曼树并输出叶子节点的赫夫曼编码并写出完整代码C++
时间: 2024-12-22 20:33:12 浏览: 10
哈夫曼树编码哈夫曼树.txt
赫夫曼树(Huffman Tree),也叫最优二叉树,是一种自底向上的贪心算法构建的二叉树,用于数据压缩。每个非叶节点代表两个字符频率之和,其左子节点表示频率较低的那个字符,右子节点表示频率较高的那个字符。叶节点代表原始字符,它们的编码是由从根到该节点路径上遇到的所有0和1组成的。
以下是使用C++实现赫夫曼树,并生成叶子节点编码的简化版本:
```cpp
#include <iostream>
#include <queue>
#include <unordered_map>
// 定义节点结构体
struct HuffmanNode {
char data;
int freq;
HuffmanNode* left = nullptr;
HuffmanNode* right = nullptr;
};
// 比较函数用于优先队列排序
bool compareNodes(HuffmanNode* a, HuffmanNode* b) {
return a->freq < b->freq;
}
// 构建赫夫曼树
std::pair<HuffmanNode*, std::string> buildHuffmanTree(std::vector<char>& chars, std::vector<int>& freqs) {
// 创建优先级队列
std::priority_queue<HuffmanNode*, std::vector<HuffmanNode*>, decltype(compareNodes)> huffmanQueue(compareNodes);
for (int i = 0; i < chars.size(); ++i)
huffmanQueue.push(new HuffmanNode{chars[i], freqs[i]});
while (huffmanQueue.size() > 1) {
HuffmanNode* left = huffmanQueue.top(); huffmanQueue.pop();
HuffmanNode* right = huffmanQueue.top(); huffmanQueue.pop();
HuffmanNode* newNode = new HuffmanNode();
newNode->left = left;
newNode->right = right;
newNode->freq = left->freq + right->freq;
huffmanQueue.push(newNode);
}
HuffmanNode* root = huffmanQueue.top();
std::string code(root, root->data);
delete root;
return {root, code};
}
// 输出叶子节点编码
void printLeafCodes(HuffmanNode* node, std::string prefix) {
if (!node) return;
if (!node->left && !node->right) {
std::cout << node->data << ": " << prefix << '\n';
} else {
printLeafCodes(node->left, prefix + "0");
printLeafCodes(node->right, prefix + "1");
}
}
int main() {
std::vector<char> chars{'a', 'b', 'c', 'd'};
std::vector<int> freqs{10, 5, 3, 7}; // 频率值示例
auto [huffmanRoot, huffmanCode] = buildHuffmanTree(chars, freqs);
std::cout << "Huffman Tree Root Node:\n";
printLeafCodes(huffmanRoot, "");
return 0;
}
```
这个代码首先创建了一个优先队列,将字符及其频率作为节点放入其中。然后通过不断合并频率最小的两个节点,直到只剩下一个节点为止,即得到赫夫曼树的根节点。最后,通过递归遍历叶子节点生成编码。
运行此程序会输出每个字符及其对应的赫夫曼编码。
阅读全文