下面展示一些 内联代码片
。
部分源码,完整源码看首张截图
#include <iostream>
#include <string>
#include <unordered_map>
#include <queue>
//企鹅联系-------3765140556
using namespace std;
// 哈夫曼树节点
struct HuffmanNode {
char character;
int frequency;
HuffmanNode* left;
HuffmanNode* right;
HuffmanNode(char ch, int freq) {
character = ch;
frequency = freq;
left = nullptr;
right = nullptr;
}
};
// 用于比较两个哈夫曼树节点的优先级
struct CompareNodes {
bool operator()(HuffmanNode* a, HuffmanNode* b) {
return a->frequency > b->frequency;
}
};
// 生成哈夫曼树
HuffmanNode* buildHuffmanTree(const unordered_map<char, int>& frequencies) {
// 创建最小堆
priority_queue<HuffmanNode*, vector<HuffmanNode*>, CompareNodes> minHeap;
// 将叶子结点(字符)加入最小堆
for (auto& pair : frequencies) {
HuffmanNode* node = new HuffmanNode(pair.first, pair.second);
minHeap.push(node);
}
// 构建哈夫曼树
while (minHeap.size() > 1) {
// 取出最小的两个节点
HuffmanNode* left = minHeap.top();
minHeap.pop();
HuffmanNode* right = minHeap.top();
minHeap.pop();
// 创建新的父节点
HuffmanNode* parent = new HuffmanNode('\0', left->frequency + right->frequency);
parent->left = left;
parent->right = right;
// 将父节点加入最小堆
minHeap.push(parent);
}
// 返回根节点
return minHeap.top();
}
// 构建字符与编码的映射表
void buildCodeMapping(HuffmanNode* root, string code, unordered_map<char, string>& codeMap) {
if (root == nullptr) {
return;
}
// 叶子节点,将字符与对应的编码存入映射表
if (root->left == nullptr && root->right == nullptr) {
codeMap[root->character] = code;
}
// 递归构建左子树和右子树的编码
buildCodeMapping(root->left, code + "0", codeMap);
buildCodeMapping(root->right, code + "1", codeMap);
}