二叉搜索树(Binary Search Tree)是一个二叉树,其中左子树中的节点值小于根节点值,右子树中的节点值大于根节点值。
我们可以实现二叉搜索树的插入和删除操作如下:
public class BST {
public void insert(int val) {
root = insert(root, val);
}
private TreeNode insert(TreeNode root, int val) {
if (root == null) return new TreeNode(val);
if (val < root.val) root.left = insert(root.left, val);
else root.right = insert(root.right, val);
return root;
}
public void delete(int val) {
root = delete(root, val);
}
private TreeNode delete(TreeNode root, int val) {
if (root == null) return null;
if (val < root.val) root.left = delete(root.left, val);
else if (val > root.val) root.right = delete(root.right, val);
else {
// 节点只有一个子节点或无子节点
if (root.left == null) return root.right;
if (root.right == null) return root.left;
// 节点有两个子节点,找右子树的最小节点代替
TreeNode minNode = findMin(root.right);
root.val = minNode.val;
root.right = delete(root.right, minNode.val);
}
return root;
}
private TreeNode findMin(TreeNode root) {
if (root.left == null) return root;
return findMin(root.left);
}
}
算法流程:
- insert():递归插入,当root为空时创建新节点,否则比较大小插入左子树或右子树。
- delete():递归删除,当节点只有一个子节点或无子节点时直接返回子节点或null。当有两个子节点时,找到右子树最小节点代替当前节点,再删除最小节点。
- findMin():辅助方法,用于找到右子树最小节点。
- 重复以上过程,构建二叉搜索树。
时间复杂度O(n),空间复杂度O(1)。
所以,二叉搜索树的插入和删除的关键是:
- insert():递归插入,比较大小插入左子树或右子树,当root为空时创建新节点。
- delete():递归删除,情况1:节点只有一个子节点或无子节点,直接返回子节点或null。情况2:有两个子节点,找到右子树最小节点代替当前节点,再删除最小节点。
- 找到右子树最小节点用findMin()辅助方法。
- 重复以上过程,构建二叉搜索树。