二叉搜索树的实现是用树的结果来实现的
搜索二叉树的构成原理:
递归找到要插入的位置,然后创建节点返回的时候把节点连接起来,
二叉搜索树就是左边的都比跟节点小,右边的都比根节点大,和折半查找差不多
首先介绍二叉搜索的insert操作,就是构成二叉搜索树
public Node _insert(Node node,int key,int value) {
if(node ==null) {
count++;
return new Node(key, value);
}
if(node.key==key) {
node.value =value;
}
else if(key>node.key) {
node.right=_insert(node.right,key,value);
}
else {
node.left=_insert(node.left,key,value);
}
return node;
}
介绍二叉搜索树的remove函数的原理
首先先要找到这个要删除的节点,如果找不到返回null
remove分为3种结果
如果删除节点的right为空 那么直接用该节点的left代替该节点
如果删除节点的left为空 那么直接用该节点的right代替该节点
如果删除节点左右孩子都不为空
那就去寻找该右节点的最小的那个数或者寻找该左节点的最大的数
来代替这个要替换的节点
接下来我们讲解找右节点最小的数
因为最小的都在搜索树的右节点只要递归找的右节点即可
public Node minnum(Node node) {
if(node.left==null) {
return node;
}
return minnum(node.left);
}
找到最小的节点,那么该节点必然没有left
所以根据以上规则删除最小的这个节点
private Node removeMin(Node right) {
if(right.left==null) {
return right.right;
}
right.left= removeMin(right.left);
return right;
}
然后根据找出来的这个节点替换要remove的节点
private Node _remove(Node node,int k) {
if(node==null) {
return null;
}
if(k>node.key) {
node.right=_remove(node.right,k);
return node;
}
else if(k<node.key) {
node.left=_remove(node.left, k);
return node;
}
else {
if(node.left==null) {
Node rightNode = node.right;
count--;
return rightNode;
}
else if(node.right==null) {
Node leftNode = node.left;
count--;
return leftNode;
}
else {
Node delnode = node;
Node rightmin= minnum(node.right);
rightmin.right=removeMin(node.right);
rightmin.left= node.left;
return rightmin;
}
}
}