搜索二叉树的删除

搜索二叉树删除比较麻烦,具体看代码里的解释:(删除带有两个子节点的节点需要用到中序后继节点)

        //先寻找中序后继节点,再进行删除
        //寻找中序后继节点
        public Node getHouJiNode(Node delNode) {
		//定义中序后继节点
		Node houji = delNode;
		//定义中序后继的父节点
		Node houjiparent = delNode;
		//当前节点
		Node current = delNode.rightChild;
		
		while(current != null) {
			houjiparent = houji;
			houji = current;
			current = current.leftChild;//往左边找
		}
		
		//把删除节点替换成终须后继节点
		//1.如果删除节点的右节点不是后继节点(正常右左左……找到的)
		if(houji != delNode.rightChild) {
			//中序后继的父节点的左子节点指向中序后继节点的右子节点(中序后继节点没有左子节点)
			houjiparent.leftChild = houji.rightChild;
			//后继的右边接上删除的右边,左边接上删除的左边
			houji.rightChild = delNode.rightChild;
			houji.leftChild = delNode.leftChild;
		}
		//2.删除节点的右节点就是中序后继节点,右边不用动,吧左边接上就可以
		else {
			houji.leftChild = delNode.leftChild;
		}
		
		return houji;
		
	}
	
	
	//删除节点delete
	public boolean delete(long data) {
		//引用当前节点
		Node current = root;
		
		//引用当前节点的父节点
		Node parent = root;
		
		//是左子节点还是右节点
		boolean isLeftChild = true;
		
		
		//循环找到要删的节点
		while (current.data != data) {
			
			parent = current;
			
			if (current.data > data) {
				current = current.leftChild;
				isLeftChild = true;
			} else {
				current = current.rightChild;
				isLeftChild = false;
			}
			
			//没有
			if(current == null) {
				return false;
			}		
		}
		//循环结束,current指向要删除节点,parent指向父节点
		
		
		
		//进行删除current节点
		
		//1.如果是叶子节点(没有子节点)
		if (current.leftChild == null &¤t.rightChild ==null) {
			if (current == root) {
				root = null;
			}
			//如果是左边的节点
			else if (isLeftChild) {
				parent.leftChild = null;
			}
			//如果是右边的节点
			else {
				parent.rightChild = null;
			}
		}
		
		//2.删除带有一个子节点的节点
		else if (current.rightChild == null) {
			//子节点是左子节点
			if (current == root) {
				root = current.leftChild;
			}
			else if (isLeftChild) {//删除的节点是左节点
				//把父节点的左子节点指向删除节点的左子节点(接上去)
				parent.leftChild = current.leftChild;
			}
			else {//删除的节点是右节点
				parent.rightChild = current.leftChild;
			}
		}
		else if (current.leftChild == null) {
			//子节点是右子节点
			if (current == root) {
				root = current.rightChild;
			}
			else if (isLeftChild) {//删除的节点是左节点
				parent.leftChild = current.rightChild;
			}
			else {//删除的节点是右节点
				parent.rightChild = current.rightChild;
			}
		}
		
		//3.删除有2个子节点的节点,需要寻找中续后继节点来替换删除节点
		else {
			Node houji = getHouJiNode(current);
			if (current == root) {
				root = houji;
			}
			else if (isLeftChild) {
				parent.leftChild = houji;
			}
			else {
				parent.rightChild = houji;
			}
		}
		
		return true;
	}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值