2 删二分搜索树中的最大最小元素
重点是考虑要删除节点的左孩子或者有孩子怎么连接到父节点
//删除最小值所在的节点
public E removeMin(){
E ret = minimum();
root = removeMin(root);
return ret;
}
//删除以node为根的二分搜索树的最小节点
//返回删除节点后新的二分搜索树的根
private Node removeMin(Node node){
if(node.left == null){ //递归结束条件
Node rightNode = node.right;//保存node的右节点 为不为空都可以这么做
node.right = null; //b
size--;
return rightNode; //删除后保留下来
}
node.left = removeMin(node.left);
return node; //返回根节点node
}
//删除最大值所在的节点
public E removeMax(){
E ret = maxmum();
root = removeMax(root);
return ret;
}
//删除以node为根的二分搜索树的最大节点
//返回删除节点后新的二分搜索树的根
private Node removeMax(Node node){
if(node.right == null){ //递归结束条件
Node leftNode = node.left;//保存node的左节点 为不为空都可以这么做
node.left = null; //b
size--;
return leftNode; //删除后保留下来
}
node.right = removeMax(node.right);
return node; //返回根节点node
}
3 二分搜索树删除节点
该节点的左孩子替代之
该节点的右孩子代替之
要让比该点大的最小值代替该节点 称为该节点的后继, 其实就是右子树的最小值
//从二分搜索树中删除元素ej节点
private Node remove(Node node, E e){
if(node == null)
return null;
if(e.compareTo(node.e) < 0){
node.left = remove(node.left, e);
return node;
}
else if(e.compareTo(node.e) > 0){
node.right = remove(node.right, e);
return node;
}
else{ //e == node.e
//左子树为空的情况
if(node.left == null){
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}
//右子树为空的情况
if(node.right == null){
Node leftNode = node.left;
node.left = null;
size--;
return leftNode;
}
//左右子树均不为空
//找到比该节点大的最小节点,右子树的最小节点
//该节点代替这个节点的位置
Node successor = minimum(node.right);
successor.right = removeMin(node.right); //返回删除最小值后右子树的头节点
size++;//本来removemin中删除的节点被保存在succerrsor 所以节点个数没编 但是remove内部调用size-- 要加回来
successor.left = node.left;
node.left = node.right = null;
size--;
return successor;
}
}
另一种实现方法
四 二分搜索树的特性