// --------------------------------------------------------------------
// 搜索 最小节点操作
// 寻找二叉搜索树的最小 key
public Key minimum(){
Node minNode = minimum(root);
return minNode.key;
}
// 返回以node为根的二叉搜索树的最小键值所在的节点
private Node minimum(Node node){
if (node.left == null) return node;
return minimum(node.left);
}
// --------------------------------------------------------------------
// 移除 最小节点操作
// 移除二叉搜索树中最小 key 节点
public void removeMin(){
if (root != null)
root = removeMin(root);
}
// 删除掉以node为根的二叉搜索树中的最小节点
// 返回删除节点后新的二叉搜索树的根
private Node removeMin(Node node){
// 递归到底,获取到二叉搜索树 key 最小的节点
if (node.left == null){
// 保存此节点的 右子节点
Node rightNode = node.right;
// 移除此节点
node.right = null;
count--;
// 返回 右子节点
return rightNode;
}
// 将被删除的节点替换为该节点的 右子节点
node.left = removeMin(node.left);
return node;
}
// --------------------------------------------------------------------
// 搜索 最大节点操作
// 寻找二叉搜索树的最大 key
public Key maximum(){
Node maxNode = maximum(root);
return maxNode.key;
}
// 返回以node为根的二叉搜索树的最大键值所在的节点
private Node maximum(Node node){
if (node.right == null) return node;
return maximum(node.right);
}
// --------------------------------------------------------------------
// 移除 最大节点操作
// 从二分搜索树中删除最大值所在节点
public void removeMax(){
if (root != null)
root = removeMax(root);
}
// 删除掉以node为根的二叉搜索树中的最大节点
// 返回删除节点后新的二叉搜索树的根
private Node removeMax(Node node){
// 递归到底,获取到二叉搜索树 key 最大的节点
if (node.right == null){
// 保存该节点的 左子节点
Node leftNode = node.left;
// 删除该节点
node.left = null;
count--;
// 返回该节点的 左子节点
return leftNode;
}
node.right = removeMax(node.right);
return node;
}