public TreeNode searchBST(TreeNode root, int val) {
if(root == null) return null;
if(root.val > val) return searchBST(root.left, val);
else if(root.val < val) return searchBST(root.right, val);
return root;
}
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
// 如果目标节点大于当前节点值,则去右子树中删除
if(key > root.val) root.right = deleteNode(root.right, key);
// 如果目标节点小于当前节点值,则去左子树中删除
else if(key < root.val) root.left = deleteNode(root.left, key);
else {
// 其无左子: 其右子顶替其位置,删除了该节点
if(root.left == null) return root.right;
// 其无右子: 其左子顶替其位置,删除了该节点
if(root.right == null) return root.left;
// 否则:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置由此删除了该节点。
TreeNode cur = root.right;
while(cur.left != null) {
cur = cur.left;
}
cur.left = root.left;
return root.right;
}
return root;
}