0

我正在尝试完成删除功能。

这是伪代码,注意结尾:

我不知道伪代码是否错误。

以下是我的解释:

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;

}
4

1 回答 1

1

那是一些可怕的伪代码,乍一看它甚至看起来都不正确(如果这是一个二叉搜索树,正如BST所表明的那样,那么圆圈部分是错误的)。互联网上有更多关于二叉搜索树的信息。

无论如何,您都试图在右子树中找到最小的元素,因为它小于右子树中的所有其他元素,但大于左子树中的所有其他元素。

看起来你的最小功能是正确的。释放后需要删除对 minNode 的引用。(minNode->parent)->left如果您没有父指针,那么= NULL 或稍微乏味的东西。现在这left只是指向内存中的一个空白空间,导致完全随机的行为。

于 2012-12-11T18:10:25.403 回答