树删除节点

时间:2012-12-11 14:39:55

标签: c++ algorithm binary-tree

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

这是伪代码,请注意结束:

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

以下是我对它的解释:

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;

}

1 个答案:

答案 0 :(得分:1)

这是一个可怕的伪代码,一眼就看起来甚至看起来都不正确(如果这是一个二叉搜索树,如BST所示,则圈出的部分是错误的)。有关互联网上可用的二进制搜索树的更好信息。

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

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