我正在编写一个二叉搜索树,我在找到一种有效删除节点的方法时遇到了一些麻烦。
我有这段代码:
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;
}
或者每个类似的代码,它都不起作用。有人能指出我正确的方向吗? 谢谢。
答案 0 :(得分:0)
首先,你说N = NULL,然后调用N&gt; lchild N为空并指向无,那么你期望得到lchild值?
由于这是作业,我不会给出直接答案,但提示。
要删除节点,请检查它是否有子节点,如果它没有释放它并删除对它的引用,例如parents child ptr。 如果它有1个子交换ptr指向要与子节点删除的节点并释放节点。如果您还有2个孩子,则同样适用。