我正在尝试完成删除功能。
这是伪代码,请注意结束:
我不知道伪代码是否错误。
以下是我对它的解释:
Node* minNode = Minimum(toDelete->right);
int tmp = 0;
tmp = minNode->val;
// delete(&tmp);
free(minNode);
minNode=NULL;
toDelete->val=tmp;
除了删除它之外,它会在打印时开始填充一万亿个零。
我正在做的事情有意义吗? 我所拥有的其余代码是正确的,或者无论如何我都这么认为。它只会在这种情况下搞砸了。
这是最小功能
Node* BST::Minimum(Node *curr) {
// if (curr->left != NULL) {
// return(Minimum(curr->left));
// }
// return curr;
Node* node = curr;
while (node->left != NULL) {
node = node->left;
}
return node;
}
答案 0 :(得分:1)
这是一个可怕的伪代码,一眼就看起来甚至看起来都不正确(如果这是一个二叉搜索树,如BST
所示,则圈出的部分是错误的)。有关互联网上可用的二进制搜索树的更好信息。
无论如何,你试图找到右子树中的最小元素,因为它将小于右子树中的所有其他元素,但大于左子树中的所有其他元素。
看起来你的最小功能是正确的。您需要在释放后删除对minNode的引用。所以如果你没有父指针,(minNode->parent)->left
= NULL或稍微繁琐的东西。现在left
只指向内存中的空白区域,导致完全随机的行为。