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;
}