二叉搜索树的增删查改
代码中注释很详细
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;
}
}
}
}
}
😐 😐 😐