我能够从文本文件中获取前缀并将它们放入向量中,例如:
所以我的代码:
节点只是一个包含值并具有左右指针的东西。
这里出现了一些可怕的错误,但我不确定它到底是什么。有没有人看到实施中的任何明显问题?
编辑:我发现了一些有趣的东西。似乎它读取的每一点,直到它找到一片叶子。我猜这就是我编码的方式。例如,当读取“1”时,它会向右移动,再次向右移动,并且“c”为“d”。递归:(答案 0 :(得分:0)
一个问题是 - 在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
答案 1 :(得分:0)
您需要将 next bit
传递给decode
中的递归,而不是当前的递归。事实上,你可以不进行递归,只需从tempRoot
返回新的decode
并继续迭代。解码叶节点时不要忘记返回root
。
BTW:buildTree
中有很多内存泄漏。