C 使用free(N)删除BST中的节点

C 使用free(N)删除BST中的节点,c,binary-search-tree,free,C,Binary Search Tree,Free,我正在编写一个二叉搜索树,但在找到有效删除节点的方法时遇到了一些困难 我有以下代码: 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);

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

我有以下代码:

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=NULL,然后调用N->lchild N为NULL,并且没有指向任何内容,那么您希望如何获得lchild值

因为这是家庭作业,所以我不会直接回答,而是给出一些提示

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

为这样的事情添加注释是一个糟糕的例子,但即使我没有将N=NULL;启动时,程序会崩溃。(所以只有free(N);显然他不喜欢我在释放N之后使用N->something),问题是我真的不知道该放在哪里。你想先交换指针,然后释放节点,记住删除对该节点的所有引用,以避免在“return”之后使用双重自由(事实上,我无法检查是否真的正确释放了该对象,这有点烦人)或者我应该保留父节点的引用并从中释放子节点吗?(我希望这是两个中的第一个,保留该引用似乎…复杂)。如果要删除节点,为什么需要返回该节点?如果确实需要返回该节点,则需要在返回后以任何称为“删除节点”的方法释放该节点
    else if (N->rChild==NULL)
    {
        free(N);
        N=NULL;
        return N->lChild;
    }