代码
// 移除 指定 key 的节点操作
public void remove(Key key){
root = remove(root, key);
}
// 删除掉以node为根的二分搜索树中键值为key的节点, 递归算法
// 返回删除节点后新的二分搜索树的根
private Node remove(Node node, Key key){
if (node == null)
return null;
if (key.compareTo(node.key) < 0){
node.left = remove(node.left, key);
return node;
}else if (key.compareTo(node.key) > 0){
node.right = remove(node.right, key);
return node;
}else { // key = node.key
// 待删除节点 左子树 为空
if (node.left == null){
// 存储 右子树
Node rightNode = node.right;
// 删除节点
node.right = null;
count--;
// 返回右子树
return rightNode;
}
// 待删除节点 右子树 为空
if (node.right == null){
// 存储 左子树
Node leftNode = node.left;
// 删除节点
node.left = null;
count--;
// 返回左子树
return leftNode;
}
// 待删除节点 左右子树 都不为空
// 找到比 待删除节点大 的最小节点,即待删除节点 右子树 的最小节点
// 使用此节点顶替 待删除节点的位置
// 找到 右子树 的最小节点
Node successor = new Node(minimum(node.right));
count++;
// successor 的 右子树 为被删除节点的 右子树(删除了最小节点)
successor.right = removeMin(node.right);
// successor 的 左子树 为被删除节点的 左子树
successor.left = node.left;
// 删除节点
node.left = node.right = null;
count--;
return successor;
}
}