菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。
今天学习的是,
二叉排序树的删除!!!
Status DeletBST(BiTree *T,int key)
{
if( !*T ) //若为空
{
return FALSE;
}
else //非空
{
if(key == (*T)->data)
{
return Delete(T);
}
else if( key < (*T)->data ) //若key小于根节点,那么对左子树进行递归查找
{
return DeletBST(&(*T)->lchild,key);
}
else ////若key大于于根节点,那么对右子树进行递归查找
{
return DeletBST(&(*T)->rchild,key);
}
}
}
//有三种情况下的删除
//删除的节点为叶子,即没有左右子树
//删除的节点只有一个左子树或右子树
//删除的节点有左右子树,此时需要寻找前驱或后继进行替换
//前驱:此根节点左子树的最大值,即此左子树的最右子树
//后继:此根节点右子树的最小值,即此右子树的最左子树
Status Delete(BiTree *p)
{
BiTree q,s;
if((*p)->rchild == NULL) //右子树为空情况
{
q = *p;
*p = (*p)->lchild; //左子树的data替换到要删除的根节点上
free(q); //释放左子树的空间
}
else if((*p)->lchild == NULL) //左子树为空
{
q = *p;
*p = (*p)->rchild; //右子树的data替换到要删除的根节点上
free(q); //释放右子树的空间
}
else //此处用前驱的替换
{
q = *p;
s = (*p)->lchild; //左子树
while(s->rchild) //左子树的最右子树
{
q = s; //q每次指向前驱的上一层
s = s->rchild; //s每次向下走一步
}
//跳出循环找到前驱
(*p)->data = s->data; //前驱的数据替换过去
if(q ! = *p) //有右子树
{
q->rchild = s->lchild
}
else //没有最右子树q = *p
{
q->lchild = s->lchild;
}
}
}
若有错误的地方,请同学们指出。
谢谢同学们的阅读!!!