一、二叉排序树删除操作
1、分析
2、code
/*若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点*/
/*并返回TRUE;否则返回FALSE*/
Status DeleteBST(BiTree *T,int key)
{
if(!*T) /*不存在关键字等于key的数据元素*/
return FALSE;
else
{
if(key==(*T)->data) /*找到关键字等于key的数据元素*/
return Delete(T);
else if(key<(*T)->data)
return DeleteBST(&(*T)->lchild,key);
else
return DeleteBST(&(*T)->rchild,key);
}
}
/*从二叉排序树中删除结点p,并重接它的左或右子树*/
Status Delete(BiTree *p)
{
BiTree q,s;
if((*p)->rchild==NULL) /*右子树空则只需要重接它的左子树*/
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL) /*左子树空则只需要重接它的左子树*/
{
q=*p;
*p=(*p)->rchild;
free(q);
}
else /*左右子树均不为空*/
{
q=*p;
s=(*p)->lchild;
while(s->rchild) /*转左,然后向右到尽头(找待删除节点的前驱)*/
{
q=s;
s=s->rchild;
}
(*p)->data=s->data; /*s指向被删结点的直接前驱(后继)*/
if(q!=*p)
q->rchild=s->lchild; /*重接q的右子树*/
else
q->lchild=s->lchild; /*重接q的左子树*/
free(s);
/*把上面的代码替代为下面的也一样,只是前面找的是前驱,后面找的是后继*/
//s=(*p)->rchild;
//while(s->lchild) /*转右,然后向右到尽头(找待删除节点的后继)*/
//{
// q=s;
// s=s->lchild;
//}
//(*p)->data=s->data; /*s指向被删结点的直接前驱(后继)*/
//if(q!=*p)
// q->lchild=s->rchild; /*重接q的左子树*/
//else
// q->rchild=s->lchild; /*重接q的右子树*/
//free(s);
}
return TRUE;
}
转载于:https://blog.51cto.com/xiaoahei/1228361
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110092.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...