解码霍夫曼树

时间:2015-04-02 18:49:12

标签: c++ huffman-code

我正在尝试解码形式的哈夫曼树:

001A1C01E01B1D

我正在使用此处的实现:Efficient way of storing Huffman tree对上面表单中的树进行编码并对其进行解码。

这是我的实现:

HuffmanNode* HuffmanTree::decodeTree(string tree, int idx) {
    cout << idx << endl;
    if (tree[idx] == '1') {
        idx += 2;
        return new HuffmanNode(tree[idx - 1]);
    }
    else {
        if (idx != tree.length() - 1) {
            idx++;
            HuffmanNode* leftChild = decodeTree(tree, idx);
            idx++;
            HuffmanNode* rightChild = decodeTree(tree, idx);
            return new HuffmanNode(leftChild, rightChild);
        }
        else
            return new HuffmanNode(tree[idx]);
    }
}

当函数展开时,我正在获取访问冲突写入位置(在“返回新的HuffmanNode(树[idx - 1]);”),我希望最终的返回将是树,但经过进一步检查,似乎并非如此。谁能给我一些指示? (没有双关语)

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是在递归运行中未修改idx。将其作为int &HuffmanNode* HuffmanTree::decodeTree(string tree, int &idx)

传递给函数

您的代码中还有一个错误,这使得它成为segfault:而不是

if (tree[idx] == '1') {
    idx += 2;
    return new HuffmanNode(tree[idx - 1]);
}
你应该

if (tree[idx] == '1') {
    ++idx;
    return new HuffmanNode(tree[idx]);
}

另一个1被添加到第二个块中的索引:

idx++;
HuffmanNode* leftChild = decodeTree(tree, idx);
idx++;
HuffmanNode* rightChild = decodeTree(tree, idx);

另外,考虑做一件事,类似于你链接到的例子:传递对字符串迭代器的引用,(或istringstream或其他一些流)并且不传递索引:{{ 1}}。

此外,如果树格式正确,您不必执行HuffmanNode* HuffmanTree::decodeTree(std::string::const_iterator &tree)之类的检查。您仍然可以在函数开头执行此操作,以检查输入中的错误,并检查当前符号是if (idx != tree.length() - 1)还是'0'