BST二叉搜索树

二叉搜索树的增删查改

代码中注释很详细

class BinarySearchTree{
	static class BSnode{
		public int val;
		public BSnode left;
		public BSnode right;
		public BSnode(int val){
			this.val=val;
		}
		BSnode root=null;
		//查找
		public boolean search(int val){
			if(root==null)return false;
			BSnode cur=root;
			while(cur!=null){
				if(cur.val==val){
					return true;
				}else if(cur.val>val){
					cur=cur.right;
				}else{
					cur=cur.left;
				}
			}
			//循环走完了,cur==null还没有找到
			return false;
		}
		//插入
		public boolean insert(int val){
			//先找要插入的节点
			//再和该节点的值进行比较,决定插左还是插右
			BSnode bsnode=new BSnode(val);
			if(root==null){
				root=bsnode;
				return true;
			}
			BSnode parent=null;
			BSnode cur=root;
			//找到要插入的根节点
			while(cur!=null){
				if(cur.val==val){
					return false;
				}else if(cur.val>val){
					parent=cur;
					cur=cur.left;
				}else{
					parent=cur;
					cur=cur.right;
				}
			}
			if(parent.val>val){
				parent.right=bsnode;
			}else{
				parent.left=bsnode;
			}
			return true;
		}
		//删除
		public void remove(int val){
			if(root==null)return;
			BSnode parent=null;
			BSnode cur=root;
			while(cur!=null){
				if(cur.val==val){
					removeNode(parent,cur,val);
				}else if(cur.val>val){
						cur=cur.left;
				}else{
					cur=cur.right;
				}
			}
		}
		public void removeNode(BSnode parent,BSnode cur,int val){
			//三种情况
			//①:cur.left==null
			//cur是root-----cur=root.right;
			//cur不是root,是parent.right----parent.right=cur.right;
			//cur不是root,是parent.left-----parent.left=cur.right;
			if(cur.left==null){
				if(cur==root){
					cur=root.right;
				}else if(cur==parent.right){
					parent.right=cur.right;
				}else{
					parent.left=cur.right;
				}
			}
			//②:cur.right==null
			//cur是root----cur=root.left;
			//cur不是root,是parent.left-----parent.left=cur.left;
			//cur不是root,是parent.right----parent.right=cur.left;
			else if(cur.right==null){
				if(cur==root){
					cur=root.left;
				}else if(cur==parent.left){
					parent.left==cur.left;
				}else{
					parent.right=cur.left;
				}
			}
			//③:cur.left!=null&&cur.right!=null;
			//找个替罪羊:
			//在待删除节点的左树的右边找最小的节点
			//或者在右树的左边找最大的节点
			//覆盖掉待删除节点
			//然后删除替罪羊
			else{
				//右树里面左边找最小的
				BSnode target=cur.right;
				BSnode taragetParent=cur;
				while(target.left!=null){
					targetParent=target;
					target=target.left;
				}
				//覆盖删除
				cur.val=target.val;
				//删除替罪羊
				if(target==targetParent.left){
					targetParent.left=target.right;
				}else{
					targetParent.right=target.right;
				}
			}
		}
	}
}

😐 😐 😐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值