【问题标题】:Deleting nodes in BST using free(N)使用 free(N) 删除 BST 中的节点
【发布时间】:2011-03-30 16:20:37
【问题描述】:

我正在编写一个二叉搜索树,但在找到有效删除节点的方法时遇到了一些麻烦。

我有这个代码:

struct node* deleteNode(int i, struct node *N)

{
    if (N==NULL)
    {
        return NULL;
    }
    else if (i<N->value)
    {
        N->size--;
        N->lChild=deleteNode(i,N->lChild);
    }
    else if (i>N->value)
    {
        N->size--;
        N->rChild=deleteNode(i,N->rChild);
    }
    else if (N->lChild==NULL)
    {
        return N->rChild;
    }
    else if (N->rChild==NULL)
    {
        return N->lChild;
    }
    else
    {
        N->size--;
        N->value=findMin(N->rChild);
        N->rChild=deleteNode(N->value,N->rChild);
    }
    return N;
}

N 是一个节点结构,它有 5 个字段:value、lChild、rChild、size、height。 事实上,我在这里所做的是让树不指向我想要删除的节点,但是当我试图放置类似的东西时:

    else if (N->rChild==NULL)
    {
        free(N);
        N=NULL;
        return N->lChild;
    }

或所有看起来相似的代码,它都不起作用。有人可以指出我正确的方向吗? 谢谢。

【问题讨论】:

    标签: c binary-search-tree free


    【解决方案1】:

    首先你说 N=NULL 然后调用 N->lchild N is null 并且没有指向任何东西那么你期望如何获得 lchild 值?

    由于这是作业,我不会直接给出答案,而是提示。

    要删除节点,请检查它是否有子节点,如果它没有释放它并删除对它的引用,例如父子节点 ptr。 如果它有 1 个子节点,则将指向要删除的节点的 ptr 与子节点交换并释放节点。如果您还有 2 个孩子,这同样适用。

    【讨论】:

    • 为此类事情添加评论
    • 是的,这是一个不好的例子,但即使我没有输入 N=NULL; 也很好。启动时,程序崩溃。 (所以只有 free(N); 所以显然他不喜欢我在释放 N 之后使用 N->something),问题是我真的不知道该放在哪里。
    • 你想先交换指针然后释放节点,并记住删除对该节点的所有引用以避免双重释放
    • 将它放在“返回”之后是解决方案(事实上,我无法检查该东西是否真的被正确释放,这有点烦人)或者我应该保留父母的参考节点并从那里释放子节点? (我希望这是两者中的第一个,保持引用似乎......很复杂)。
    • 如果要删除节点,为什么还需要返回?如果确实需要返回它,则需要在返回后以任何称为删除节点的方法释放它
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2014-05-26
    • 2016-11-11
    • 1970-01-01
    • 2021-10-23
    • 2021-05-24
    相关资源
    最近更新 更多