二叉排序树中删除一个节点

//从T节点开始删除,parent为T的父节点,key为要删除的节点的关键字值

//返回删除后T位置的新指针

BiNode* DelNode(BiNode* T, BiNode* parent, int key)
{

	BiNode* s; BiNode* p; 

	BiNode* rp = NULL; 
	if(key < T->data) 
	{ 
		if(NULL != T->lchild)
			T->lchild = DelNode(T->lchild, T, key);
		return T; 
	}
	if(key > T->data) 
	{ 
		if(NULL != T->rchild) 
			T->rchild = DelNode(T->rchild, T, key); 
		return T; 
	}
	if(T->data == key)
	{ 
		if(NULL==T->lchild && NULL==T->rchild) //叶子节点 
		{ 
			if(NULL != parent) 
			{ 
				if(parent->lchild == T) 
				{ 
					parent->lchild = NULL; 
				} 
				else 
				{ 
					parent->rchild = NULL; 
				} 
			} 
			free(T); return NULL; 
		
		} 
		if(NULL == T->lchild) //左子树为空
		{ 
			if(NULL != parent) 
			{
				if(parent->lchild == T) 
				{
					parent->lchild = T->rchild; 
				} 
				else
				{ 
					parent->rchild = T->rchild; 
				} 
			}
			rp = T->rchild; 
			free(T);
			return rp; 
		} 
		if(NULL == T->rchild) //右子树为空 
		{ 
			if(NULL != parent) 
			{ 
				if(parent->lchild == T) 
				{ 
					parent->lchild = T->lchild; 
				} 
				else 
				{
					parent->rchild = T->lchild; 
				} 
			} 
			rp = T->lchild; 
			free(T);
			return rp;
		} 
		//左右子树均不为空 
		p = T; 
		s = T->lchild; 
		while(s->rchild) 
		{ 
			p = s; 
			s = s->rchild;
		} 
		T->data = s->data;
		if(p != T)
		{ 
			p->rchild = s->lchild; 
		} 
		else 
		{ 
			T->lchild = s->lchild;
		} 
		free(s); 
		return T; 
		} 
	return T;
}
//在二叉排序树中删除一个等于某值的节点//returnt the new root
BiNode* DelNodeInBiSortTree(BiNode* T, int key)
 {
	 if(NULL == T) 
		 return NULL;  
	 if(key == T->data) 
	 { 
		 T = DelNode(T,NULL,key); return T; 
	 } 
	 if(key < T->data && T->lchild) 
	 { 
		 T->lchild = DelNode(T->lchild,T,key);
		 return T; 
 
	 } 
	 if(key > T->data && T->rchild)
	 { 
		 T->rchild = DelNode(T->rchild,T,key);
	 } 
	 return T;
 } 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值