我正在尝试解码形式的哈夫曼树:
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]);”),我希望最终的返回将是树,但经过进一步检查,似乎并非如此。谁能给我一些指示? (没有双关语)
答案 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'
。