在BinarySortTree类中添加了 delRightTreeMin方法,更新了delNode方法
public int delRightTreeMin(Node node){
Node target=node;
//虚幻查找左节点,就会找到最小值
while(target.left!=null){
target=target.left;
}
//这是target就指向最小节点
//删除最小节点
delNode(target.value);
return target.value;
}
//删除节点
public void delNode(int value) {
if (root == null) {
return;
} else {
//1.先找到要删除的节点
Node targetNode = search(value);
//如果没有找到要删除的节点
if (targetNode == null) {
return;
}
//如果我们发现当前这颗二叉排序树只有一个节点
//即tagernode就是root
if (root.left == null && root.right == null) {
root = null;
return;
}
//找到targetnode的父节点
Node parent = searchParent(value);
//如果要删除的是叶子节点
if (targetNode.left == null && targetNode.right == null) {
//判断targetnode是左子节点还是右子节点
if (parent.left != null && parent.left.value == value) {
parent.left = null;
} else if (parent.right != null && parent.right.value == value) {
parent.right = null;
}
}else if (targetNode.left!=null&&targetNode.right!=null){//targetnode有两个子节点
int minVal=delRightTreeMin(targetNode.right);
targetNode.value=minVal;
}else {//删除只有一棵子树的节点
if (targetNode.left!=null) {
//如果targetnode是parent的左子节点
if (parent!=null) {
if (parent.left.value == value) {
parent.left = targetNode.left;
} else {//targetnode是parent的左子节点
parent.right = targetNode.left;
}
}else{
root=targetNode.left;
}
} else {
//如果要删除的节点有右子节点
if (parent != null) {
//如果targetnode是parent的左子节点
if (parent.left.value == value) {
parent.left = targetNode.right;
} else {
//如果targetnode是parent的左子节点
parent.right = targetNode.right;
}
} else {
root = targetNode.left;
}
}
}
}
}