[英]issues with huffman decoding using tree
我能够从文本文件中提取前缀并将其放入向量中,例如:
所以我的代码:
节点只是拥有值并具有左右指针的东西。
这里出了什么问题,但是我不确定这到底是什么。 有人看到实施中有任何明显的问题吗?
编辑:嗯,我发现了一些有趣的东西。 似乎每读取一次,它就会一直到找到叶子为止。 我想这就是我的编码方式。 例如,当读取“ 1”时,它会正确,再次正确地显示“ d”。 递归:(
一个问题是-在buildTree
,如果当前节点已经有一个子节点怎么办? 您将只创建一个新子项并覆盖前一个子项。
如果节点还没有子节点,则只应创建该节点。
因此,您的buildTree
函数应如下所示:
void Foo:: buildTree(vector<char> v) {
node* root = new node;
vector<char>:: iterator itr;
node* current = root;
for(itr = v.begin(); itr != v.end(); itr++) {
cout << *itr << ".";
if (*itr == '0') {
if (current->left == NULL)
current->left = new node;
current = current->left;
}
else if (*itr == '1') {
if (current->right == NULL)
current->right = new node;
current = current->right;
}
else { // is a symbol
current->value = *itr;
current = root;
}
}
nodeVector.push_back(*root);
}
另一个问题是您的decode
功能-您要遍历树,但要传递相同的bit
。
我可能会完全放弃递归方法,而只使用一个for循环。
一些伪代码:
current = root
for each character c
if c == 0
if current.left == NULL
print current.value
current = root
else
current = current.left
else
if current.right == NULL
print current.value
current = root
else
current = current.right
您需要将下 bit
传递给decode
的递归,而不是当前位。 实际上,您无需递归即可执行操作,只需从decode
返回新的tempRoot
并继续进行迭代即可。 解码叶节点时,请不要忘记返回root
。
顺便说一句: buildTree
很多内存泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.