C++构建哈夫曼树需用小顶堆贪心合并频率最小两子树,根节点为唯一剩余节点;DFS递归生成编码,左0右1,叶节点保存字符到编码映射。

用C++从零构建哈夫曼树并生成最优二进制编码,需严格遵循贪心策略:每次合并频率最小的两棵子树,确保高频字符编码短、低频字符编码长。不按频率升序选取两个最小节点,最终编码长度总和必然不是最优。
定义节点结构与优先队列比较规则
声明HuffmanNode结构体,包含字符、频率、左右子指针;重载operator
struct HuffmanNode { char ch; int freq; HuffmanNode *left, *right; HuffmanNode(char c, int f) : ch(c), freq(f), left(nullptr), right(nullptr) {} }; struct Compare { bool operator()(HuffmanNode* a, HuffmanNode* b) { return a->freq > b->freq; } };
这一步必须用>号实现小顶堆——若误写为
立即学习“C++免费学习笔记(深入)”;
构建哈夫曼树主流程
第一步:将所有叶节点(字符+频率)压入priority_queue;
第二步:当队列元素数≥2时,连续pop两次获取freq最小的两个节点;
第三步:新建父节点,freq = left->freq + right->freq,left/right指针分别指向刚弹出的两节点;
第四步:将新父节点push回队列;
重复执行直到队列只剩唯一节点——该节点即为哈夫曼树根节点【必须确保循环终止条件是queue.size() > 1,若写成>=1将导致空指针解引用】。
递归生成二进制编码字符串
方法一:从根开始DFS,向左走记'0',向右走记'1',到达叶子时保存ch→code映射;
void generateCodes(HuffmanNode* root, string code, unordered_map
方法二:用stack替代递归,避免深树栈溢出——但需手动维护路径字符串长度,易在push/pop时错位,初学者慎用。


















