二叉排序树的删除

在二叉排序树中删除一结点,要考虑删除点子树的情况,在删除了指定点后,要将其子树重新链接起来,

分情况计论,如果想要删除叶结点,只需将其父结点指向它的指针,指向NULL,再释放它即可,如果被删除结点的右子树为空,可以拿它的左子树结点顶替它的位置,再释放它,如果被删结点的左子树为空,可以拿它的右子树结子顶替它,




如果被删结点左右子树都不空,可以在它的右子树中寻找中序的第一个结点(关键字最小),用它的值填补删结点,之后再业处理这个结点的删除问题,还可找被删除结点左子树的中序的最后一个结点(关键字在左子树中最大),用它来填补被删结点




bool deleteBSTree(BSTree &root ,int e){

	BSTree p = NULL ;
	BSTree s = NULL ;
	BSTree  ptr = NULL;
	p = searchBS( root,e,ptr);

	if(!p)return false;
	if(p->lchild!=NULL&&p->rchild!=NULL){
			s = p->lchild;
			//下面的几步主要是为了使ptr成为删除点p的前驱
			if(s->rchild==NULL&&s->lchild==NULL){
				ptr = p;			
			}
			while(s->rchild!=NULL){
				ptr = s;
				s = s->rchild;
			}
			p->data= s->data;
			p=s;	
	}

	if(p->lchild==NULL&&p->rchild!=NULL){
	
			s = p->rchild;

	}else if(p->lchild!=NULL&&p->rchild==NULL){
	
		s=p->lchild;
	
	}else if(p->lchild==NULL&&p->rchild==NULL){
		if(ptr->data<p->data)
			ptr->rchild = NULL;
		else  if(ptr->data>p->data)
			ptr->lchild = NULL;
	
		return true;
	}

	if(p==root){	
	root = s;
	}else if(ptr->data<s->data){
		ptr->rchild = s;
	}else if(ptr->data>s->data){
		ptr->lchild = s;
		
	}
	free(p);
	return true;

}

BSTNode *searchBS(BSTNode * root,int e,BSTree  &father){
	
	BSTNode * p = root;
	father =NULL;

		while(p!=NULL&&p->data!=e){
			
			father = p;
			if(p->data<e) p=p->rchild;
			else p = p->lchild;	
		
	}
	return p;

}






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值