删除分为两种可能:
1.只有左子树,或右子树,或叶结点。
二叉排序树:删除操作

q=p;
p=p->left;
free(q);

叶结点、只有右子树的情况相似。

2.有左子树和右子树的情况

先看完整代码:

int Delete(Tree &p)
{
    Tree q,s;
    if(p->right==NULL)/*只有左子树*/
    {
        q=p;
        p=p->left;
        free(q);
    }
    else if(p->left==NULL)/*只有右子树*/
    {
        q=p;
        p=p->right;
        free(q);
    }
    else
    {
        q=p;
        s=p->left;
        while(s->right)
        {
            q=s;
            s=s->right;
        }
        p->data=s->data;
        if(q!=p)
        {
            q->right=s->left;
        }
        else
        q->left=s->left;
        free(s);
    }
    return TRUE;
}
int DeleteBSF(Tree &T,int key)
{
    if(!T)
    return FALSE;
    else
    {
        if(key==T->data)
        return Delete(T);
        else if(key<T->data)
        return DeleteBSF(T->left,key);
        else
        return DeleteBSF(T->right,key);
    }
}
View Code

相关文章: