我正在编写自己的霍夫曼编码器,到目前为止,我已经创建了霍夫曼树,方法是使用 minHeap 弹出两个最低频率节点并创建一个链接到它们的节点,然后将新节点推回一个(起泡,冲洗,重复直到只有一个节点)。
所以现在我已经创建了树,但是我需要使用这棵树来为每个字符分配代码。我的问题是我不知道如何在 C++ 中存储数字的二进制表示。我记得读过 unsigned char 是字节的标准,但我不确定。
我知道我必须反复遍历树,每当我碰到叶节点时,我必须分配相应的字符,无论当前代表路径的代码是什么。
这是我到目前为止所拥有的:
void traverseFullTree(huffmanNode* root, unsigned char curCode, unsigned char &codeBook){
if(root->leftChild == 0 && root->rightChild == 0){ //you are at a leaf node, assign curCode to root's character
codeBook[(int)root->character] = curCode;
}else{ //root has children, recurse into them with the currentCodes updated for right and left branch
traverseFullTree(root->leftChild, **CURRENT CODE SHIFTED WITH A 0**, codeBook );
traverseFullTree(root->rightChild, **CURRENT CODE SHIFTED WITH A 1**, codeBook);
}
return 0;
}
CodeBook 是我的数组,最多可容纳 256 个字符的代码(对于 ASCII 中的每个可能字符),但我只会将代码实际分配给出现在树中的值。
我不确定这是否是遍历我的霍夫曼树的正确方法,但这似乎立即起作用(尽管我还没有测试过)。另外,我如何调用没有零或一(树的最顶端)的整个树的根的遍历函数?
我应该改用字符串并将零或 1 附加到字符串吗?