【LeetCode】Day117-删除二叉搜索树中的节点

题目

450. 删除二叉搜索树中的节点【中等】

题解

重新复习一下二叉搜索树的性质:

  • 左子树的所有节点(如果有)的值均小于当前节点的值;
  • 右子树的所有节点(如果有)的值均大于当前节点的值;
  • 左子树和右子树均为二叉搜索树。

二叉搜索树的题目往往可以用递归来解决。 查找结点比较容易,左小右大即可,问题是如何删除结点并保持有序性呢?根据结点的位置不同可以分为以下几种情况:

  1. root为,直接删除
  2. root有左无右,左子树作为新的子树
  3. root有右无左,右子树作为新的子树
  4. root左右双全,这时可以将root的后继结点successor(即右子树中的最小结点)作为新的根节点,并将successor从右子树中删除,之后合并左右子树。

递归

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root==null)
            return null;
        if(root.val>key)    root.left=deleteNode(root.left,key);
        else if(root.val<key)   root.right=deleteNode(root.right,key);
        //找到要删除的结点
        else{
            if(root.right==null&&root.left==null)
                return null;
            if(root.right==null)
                return root.left;
            if(root.left==null)
                return root.right;
            //左右都不空
            else{
                TreeNode successor=root.right;
                //找到根节点的后继结点
                while(successor.left!=null)
                    successor=successor.left;
                root.right=deleteNode(root.right,successor.val);//删除后继结点
                successor.left=root.left;
                successor.right=root.right;
                return successor;
            }
        }
        return root;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n),递归所需的空间复杂度

p.s 现在觉得最麻烦的题就是树的题了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值