450. 删除二叉搜索树中的节点-----递归

题目表述

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

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

首先找到需要删除的节点;
如果找到了,删除它。

示例:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。

递归

根据二叉搜索树的性质

  • 如果目标节点大于当前节点值,则去右子树中删除;

  • 如果目标节点小于当前节点值,则去左子树中删除;

  • 如果目标节点就是当前节点,分为以下三种情况:

    • 其无左子:其右子顶替其位置,删除了该节点;
    • 其无右子:其左子顶替其位置,删除了该节点;
    • 其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点。
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        return delete(root,key);
    }
    public TreeNode delete(TreeNode root, int key){
        if(root == null){
            return null;
        }
        if(root.val < key){
            root.right = delete(root.right, key);
        }else if(root.val > key){
            root.left = delete(root.left, key);
        }else{
            if(root.right == null) return root.left;
            else if(root.left == null) return root.right;
            else if(root.left != null && root.right != null){
                TreeNode right = root.right;
                while(right.left != null){
                    right = right.left;
                }
                right.left = root.left;
                root = root.right;
            }
        }
        return root;
    }
   
}
posted @ 2022-06-05 14:38  YoungerWb  阅读(36)  评论(0编辑  收藏  举报