450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
图片说明
解题思路
先找到节点,然后根据该节点的位置来进行删除
如果为叶节点则直接删除
如果只有一个孩子节点,则孩子节点代替它
否则,需要用右子树的最左节点来替代它(或者左子树的最右节点),这里简单用改变节点值来实现,实际情况可以更改指针
运行结果
图片说明
java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return null;
        if(root.val == key){
            //对应无孩子节点或只有一个孩子节点
            if(root.left == null) return root.right;
            if(root.right == null) return root.left;
            //寻找右子树的最左节点来进行替代
            int minval=getMin(root.right);
            root.val=minval;
            root.right=deleteNode(root.right,minval);
        }else if(root.val > key){
            root.left=deleteNode(root.left,key);
        }else if(root.val < key){
            root.right=deleteNode(root.right,key);
        }
        return root;
    }

    public int getMin(TreeNode node){
        while(node.left != null){
            node=node.left;
        }
        return node.val;
    }
}