如何在c++中序列化Huffman树

How to serialize the Huffman tree in c++

本文关键字:序列化 Huffman c++      更新时间:2023-10-16

正如标题所示,我想将我的huffman树序列化为编码文件的头。我看到了这个问题:存储huffman树的有效方法

我知道它是如何工作的,但我不能应用它,我已经写了这个代码:

typedef Node<char,unsigned long> Node;
void Encoder::EncodeNode(Node node)
{
if (node.left == &Node::NIL and node.right == &Node::NIL)
   {
    writeBit(1);
    outFile << node.first;
   }
else
   {
    writeBit(0);
    EncodeNode(*node.left);
    EncodeNode(*node.right);
   }
}

这是我用来编码字符的writeBit函数:

void Encoder::writeBit(unsigned short bit)
{
if(bit < 2){//if not EOF
    if(bit){
        byteBuffer |= (1 << (7 - byteCursor));
    }
    byteCursor++;
    if (byteCursor == 8) {
        outFile << byteBuffer;
        byteBuffer = 0;
        byteCursor = 0;
    }
}else{
    outFile << bit;
    }
}

但有了这个功能,我一个字也写不出来。有什么建议吗?

更新:能顺利吗?:

void Encoder::EncodeNode(Node node)
{
if (node.left == &Node::NIL and node.right == &Node::NIL)
{
    char c = node.first;
    writeBit(1);
    for (unsigned short i = 0; i < 8; i++) {
        writeBit(c & (1 << (7-i)));
    }
}
else
{
    writeBit(0);
    EncodeNode(*node.left);
    EncodeNode(*node.right);
}
}

查看Ezran对您链接的问题的回答(与已接受的答案相反)。这是最有效的方法,也是最简单的方法。您根本不需要对树结构进行编码。您所需要发送的只是每个符号的位数。