★【删除二叉搜索数节点】【递归】Leetcode 450. 删除二叉搜索树中的节点

【删除二叉搜索数节点】【递归】Leetcode 450. 删除二叉搜索树中的节点

---------------🎈🎈450. 删除二叉搜索树中的节点 题目链接🎈🎈-------------------
在这里插入图片描述

解法1 递归

有以下五种情况:

第一种情况:没找到删除的节点,遍历到空节点直接返回了
找到删除的节点
第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
第五种情况示意图:代码随想录

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        // 删除操作分为五种情况(找到待删除元素即停止递归)
        // 1、删除节点不存在————return null
        // 2、删除的是叶子结点,左为空 右为空 ———— return null
        // 3、删除的节点 左为空 右不为空 ———— return root.right
        // 4、删除的节点,左不为空 右为空 ———— return root.left
        // 5、删除的节点,左不为空 右不为空
        //   ———— 找到需要删除节点的右子树的最左下角就是比他大一丢丢的元素temp,
        //   ———— 之后把删除节点的左子树移动到这个大一丢丢元素下面,temo.left=root.left
        //   ———— 最后删除节点:此时也就是左为空 右不为空,即return root.right

        // 停止条件(找到待删除的元素)
        if(root == null) return null;
        if(root.val == key){
            if(root.left == null && root.right ==null) return null;
            else if(root.left == null && root.right != null) return root.right;
            else if(root.left != null && root.right == null) return root.left;
            else{
                // 寻找这个待删除节点的右子树的最左边(就是比其大一丢丢的元素)
                TreeNode temp = root.right;
                while(temp.left != null){
                    temp = temp.left; 
                }
                // 将待删除的节点的左子树 转移到 temp的左子树位置
                temp.left = root.left;
                // 删除节点
                return root.right;
            }
        }
        
        // 递归思想:key大于当前root 就向右,key小于当前root 就向左。
        // 每一层接之后的返回
        root.left = deleteNode(root.left,key);
        root.right = deleteNode(root.right,key);
        return root;
    }
}    
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值