二叉树算法题(22)删除二叉搜索树中的节点

本文介绍了一种从二叉搜索树中删除指定节点的方法,通过递归算法实现,保持树的特性不变。示例展示了不同情况下的操作流程。

目录

删除二叉搜索树中的节点

描述

示例 1

示例 2

示例 3

提示

方法:递归


删除二叉搜索树中的节点

描述

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

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

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

示例 1

输入: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]。

示例 2

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3

输入: root = [], key = 0
输出: []

提示

  • 节点数的范围 [0, 10^4]
  • -10^5 \le Node.val \le 10^5
  • 节点值唯一
  • root 是合法的二叉搜索树
  • -10^5 \le key \le 10^5

进阶: 要求算法时间复杂度为 O(h),h 为树的高度。

方法:递归

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;//如果该节点左子树为空,那么就让右子树赋值给root
            else if (root.right==null) return root.left;//如果该节点右子树为空,就将左子树赋值给root
            else{//如果左右子树都不为空,则找该节点的后缀节点赋值给该节点
                TreeNode cur=root.right,pre=root;
                while (cur.left!=null) {
                    pre=cur;//更新pre的值
                    cur=cur.left;//查找右子树中最左的节点
                }
                if (pre==root){//如果该节点右边没有左子树了
                    pre.right=cur.right;//就将右边的右子树往上提
                }else pre.left=cur.right;//否则就将最左的节点右子树往上提,覆盖最左节点
                root.val=cur.val;//删除当前节点
            }
            return root;
        }else if (root.val<key) root.right=deleteNode(root.right,key);//在右子树查找节点
        else root.left=deleteNode(root.left,key);//在左子树查找节点
        return root;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值