LeetCode450.删除二叉搜索树中的节点

题目描述

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

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

首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O ( h ) O(h) O(h),h 为树的高度。

示例

image

学习的东西

1 目标节点左右为空,直接删除
2 左右节点有一个为空一个不为空,就让不为空的做目标节点父节点的子树
3 左右节点都不为空(*)我自己的代码就是在这个地方变得又臭又长的,学习了大佬的方法,真没想到啊。。。
3.1 将目标节点的左子树移到目标节点中序遍历后继节点的左子树上
3.2 将目标节点的右子树移到目标节点中序遍历前驱节点的右子树上
我这里用的是3.1的方法。代码如下:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
            if(root==null){
                //代表当前树没有搜索到目标值,直接返回根节点即可
                return root;
            }
            if(key==root.val){
                if(root.left==null&&root.right==null){
                    return null;
                }else if(root.left!=null&&root.right==null){
                    return root.left;
                }else if(root.left==null&&root.right!=null){
                    return root.right;
                }else{
                    TreeNode next= root.right;
                    while(next.left!=null){
                        next=next.left;
                    }
                    next.left=root.left;
                    root=root.right;
                    return root;
                }
            }
            if(root.val>key){
                root.left=deleteNode(root.left,key);
            }else{
                root.right=deleteNode(root.right,key);
            }
            return root;          
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值