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

时间:2015-02-17 15:05:43

标签: c++ huffman-code

正如标题所示,我想将我的霍夫曼树序列化为我编码文件的标题。 我看到了这个问题:efficient way to storing huffman tree

我理解它是如何工作的,但是我无法应用它,我写了这段代码:

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);
}
}

1 个答案:

答案 0 :(得分:0)

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