数据结构与算法-学习笔记(5)-二叉排序树的删除

菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。

今天学习的是,
二叉排序树的删除!!!

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;
		}
	}
}

在这里插入图片描述

若有错误的地方,请同学们指出。
谢谢同学们的阅读!!!

发布了28 篇原创文章 · 获赞 15 · 访问量 1063

猜你喜欢

转载自blog.csdn.net/qq_43765237/article/details/105362076