最优二进制前缀编码通过哈希辅助的哈夫曼树构建:先用unordered_map统计频次并去重,再以shared_ptr节点和优先队列自底向上合并,最后dfs生成无前缀冲突的编码表。

要为一组字符及其出现频率构建最优二进制前缀编码,需先构造哈希辅助的哈夫曼树——即用哈希表快速定位节点、避免重复创建、支持动态合并与键值映射,再依贪心策略自底向上生成最小加权路径长度的二叉树。
准备字符频次数据并建立哈希映射
读入字符-频次对,存入 std::unordered_map
将 map 中每对 (c, freq) 封装为 shared_ptr
用优先队列构建哈夫曼树
定义比较器:struct Compare { bool operator()(const shared_ptr
把所有叶子节点 push 进 pq;每次 pop 两个频次最小的节点,新建父节点,其 freq = a->freq + b->freq,left = a,right = b;新节点再 push 回 pq。
重复上一步直到 pq.size() == 1;此时 pq.top() 即为哈夫曼树根节点。注意:若初始只有 1 个字符,需手动构造 left/right 均为空的单节点树,否则后续编码会崩溃。
从根节点递归生成二进制编码表
声明 unordered_map
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
① 若 node 为叶子(node->ch != '\0'),则 codeMap[node->ch] = path;
② 否则,若 node->left 存在,递归 dfs(node->left, path + "0", codeMap);
③ 若 node->right 存在,递归 dfs(node->right, path + "1", codeMap);
这一步必须严格区分叶子与非叶子节点,否则 '\0' 会被误写入编码表,导致解码时多出无效映射。
输出编码结果并验证前缀性质
遍历 codeMap,按字符 ASCII 升序打印 char → code;例如 'a'→"101"、'b'→"0"。
对任意两不同编码 s1 和 s2,检查 s1.substr(0, s2.length()) != s2 且 s2.substr(0, s1.length()) != s1;只要有一组违反,说明构造失败——但本算法在标准哈夫曼流程下不会触发该检查。
返回 codeMap 即完成最优二进制编码构建。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










