关于二叉排序树的删除问题
Status Delete(bitree &p) //由于用了引用,所以相当于将p的右子树接在了p的双亲上
{
bitree q,s;
if(!p->Rchild)
{
q=p->Lchild;
free(p);
p=q;//!相当于将p的右子树接在p的双亲上(p原来所在的位置)
}
else if(!p->Lchild)
{
q=p->Rchild;
free(p);
p=q;
}
else
{
q=p;
s=p->Lchild;
while(s->Rchild) {q=s;s=s->Rchild;}
p->data=q->data;
if(q!=p)
{
q->Rchild=s->Lchild;
}
else //q==T,即T的左孩子并没有右子树
{
q->Lchild=s->Lchild;
}
delete s;
}
return true;
}
Status DeleteBST(bitree &T,int k)
{
if(!T) return FALSE;
else if(T->data==k)
{
Delete(T);
}
else if(T->data>k)
{
return DeleteBST(T->Lchild,k);
}
else
{
return DeleteBST(T->Rchild,k);
}
}
其中关于子树的重接是利用了指针的引用,来改变被删除节点p的双亲的指针
DeleteBST(T->Lchild,k);
所以秩序在Delete函数中执行这样的操作便可实现子树的重接
(以p没有右子树为例子,其他情况可见代码)
if(!p->Rchild)
{
q=p->Lchild;
free(p);
p=q;//!相当于将p的右子树接在p的双亲上(p原来所在的位置)
}