我正在使用Java编写霍夫曼编码。我没有明白存储树的方式和位置。我知道如何制作树,然后将其保存为二进制文件,但为了解码目的,我们将再次需要相同的树进行解码。如何将该树保存在文件中以将其与二进制文件附加?
答案 0 :(得分:1)
将树写为一系列位:0表示叶,1表示内部节点。具有N个叶节点和N-1个内部节点的二叉树(霍夫曼或其他)的输出将是2N-1比特的序列。 (实际上你可以保存两位,因为你知道树中的第一个和最后一个节点将是叶子节点,但它可能不值得使算法复杂化以保存两位。)
也许最简单的方法是按预先安排位:
function write_tree (top_node) {
if is_leaf(top_node) {
write "0"
// optionally, write any date associated with the leaf node
// although in practice it's easier to write the leaf data
// to a separate output stream. That lets this stream contain
// actual bits rather than the characters "0"/"1"
}
else {
write "1"
write_tree (top_node.left)
write_tree (top_node.right) }}
function read_tree (bit_stream) -> returns tree
next_bit = bit_stream.read()
if next_bit = "0" {
root = new leaf
// optionally read data associated with the leaf node
}
else {
root = new internal node
root.left = read_tree (bit_stream)
root.right = read_tree (bit_stream) }
return root }
我一开始并没有注意到你提到过Java,所以我用伪代码编写了上面的内容,我确信你可以毫不费力地用Java重写。