删除二分搜索树的最大值和最小值
最小值在最左的,递归直到某个节点的左子树为空,就是找到了最小值,删除该节点,有可能这个节点的右子树还有值,所以这个时候将右子树节点暂存,然后将这个节点的右子树赋值为空,然后返回右子树
二分搜索树删除任意节点
删除有右孩子没有左孩子的节点,同删除最大值节点一样
删除有左孩子没有右孩子的节点,同删除最小值节点一样
删除左右都有孩子的节点 d
找到d的右子树中的最小值(或左子树中的最大值),将该节点从与要删除的节点交换,然后删除已经交换的节点
代码如下:
找到二叉树的最大值节点和最小值节点
//寻找二分搜索树的最大元素
public E maximum() {
if (size == 0)
throw new IllegalArgumentException("BST is empty");
return maximum(root).e;
}
public Node maximum(Node node) {
if (node.right == null)
return node;
return maximum(node.right);
}
//寻找二分搜索树的最小元素
public E minimum() {
if (size == 0)
throw new IllegalArgumentException("BST is empty");
return minimum(root).e;
}
public Node minimum(Node node) {
if (node.left == null)
return node;
return minimum(node.left);
}
删除最大值节点和最小值节点
//从二分搜索树中删除最小值所在节点,返回最小值
public E removeMin() {
E ret = minimum();
removeMin(root);
return ret;
}
//删除以node为根的二分搜索树的最小节点
//返回删除节点后新的二分搜索树的根
public Node removeMin(Node node) {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}
node.left = removeMin(node.left);
return node;
}
public E deleteMax() {
E e = searchMaxNum();
root = deleteMax(root);
return e;
}
public Node deleteMax(Node node) {
if (node == null)
return null;
if (node.right == null) {
Node left = node.left;
node.left = null;
size--;
return left;
}
node.right = deleteMax(node.right);
return node;
}
删除二叉树中的任意元素
public void remove(E e) {
remove(root, e);
}
public 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 {
if (node.left == null) {
Node right = node.right;
node.right = null;
size--;
return right;
}
if (node.right == null) {
Node left = node.left;
node.left = null;
size--;
return left;
}
Node successor = searchMinNum(node.right);
successor.right = deleteMin(successor);
size++;
successor.left = node.left;
node.right = node.left = null;
return successor;
}
}