首页 > 其他分享 >30_删除二叉搜索树中的节点

30_删除二叉搜索树中的节点

时间:2024-01-20 13:34:23浏览次数:21  
标签:删除 树中 30 二叉 key null root 节点 left

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

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

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

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

示例 1:

img

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

递归法

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        //当前节点不存在,找不到key,直接返回null
        if (root == null)
            return null;
        if (root.val == key) {  //找到了待删除的节点的值
            //情形一:待删除节点的左右孩子都为null,这一层直接返回null
            if (root.left == null && root.right == null) {
                return null;
            //情形二:待删除节点的左孩子不为null,右孩子为null,这一层直接返回root.left
            } else if (root.left != null && root.right ==null) {
                return root.left;
            //情形三:待删除节点的左孩子为null,右孩子不为null,这一层直接返回root.right
            }  else if (root.left == null && root.right != null) {
                return root.right;
            } else {
                //情形四:待删除节点的左右孩子都不为空,让右孩子作为新的根节点,让右孩子的最左下的节点指向root.left(待删除节点的左子树)
                TreeNode cur = root.right;
                while (cur.left != null) {
                    cur = cur.left;
                }
                cur.left = root.left;
                //这里是返回原来待删除节点的右孩子节点,而不是cur,cur在遍历过程中已经变了
                return root.right;
            }
        }
        if (root.val < key) root.right = deleteNode(root.right, key);
        if (root.val > key) root.left = deleteNode(root.left, key);
        return root;
    }
}

标签:删除,树中,30,二叉,key,null,root,节点,left
From: https://www.cnblogs.com/codingbao/p/17976360

相关文章

  • 30+,怎么保持学习,实现个人成长?
     在繁忙的工作中,如何保持学习?30+的我,最近有一ge体会 我们提到学习时,通常想到的方式是,找一本书,可能在配上讲解视频,找一个专门的、整块的时间去学习,才被我们认为是学习。可是,一天就24小时,而我们每天至少工作8小时(有些朋友还远不止8小时,比如我......
  • shopify URL如何实现301跳转以及验证方法
    需要APP:TinyIMG步骤:1、在shopify后台打开插件“TinyImg”2、点击“改善SEO”,然后再点击“停止因链接断开而失去销售”3、点击“创建URL”重定向在上图中,按照指示分别填写所对应的URL,即可实现URL的重定向了。如何验证301跳转成功当我们设置URL重定向之后,如何验证其是否成......
  • 30 个实例完全解读 TOP 命令
    1.Top命令输出:首先,让我们了解一下输出。top命令会显示系统的很多信息。我们需要理解不同部分输出的意义:默认运行时,top命令会显示如下输出:前几行水平显示了不同系统参数的概括,接下来是进程和它们在列中的属性。1.1系统运行时间和平均负载:top命令的顶部显示与uptime命令相似的输......
  • walmart 2024年的api 更新 订单和退货API更新–必需!)必须在2024年4月30日前更新订单和
    订单和退货API更新–必需! 2023年6月20日沃尔玛推出了一项新功能,使市场卖家能够接收和管理多数量订单,以帮助节省时间和减少订单管理的模糊性。注意:API用户(卖家和渠道合作伙伴)必须在2024年4月30日前更新订单和退货API。未能在2024年4月30日前更新您的API可能会影响您履行和管理多......
  • 30岁了,多少薪资才算平均水平?
    硕士5年,一般而言,年纪可能都已经迈入了30大坎。所谓三十而立,正是成家立业的时候。......
  • 第30节: Vue3 监听事件
    在UniApp中使用Vue3框架时,你可以使用监听事件来响应用户的操作。下面是一个示例,演示了如何在UniApp中使用Vue3框架使用监听事件:<template><view><button@click="handleClick">Clickme</button></view></template><scriptsetup>import{......
  • 二叉树 - 二叉树入门题
    二叉树入门题1.判断两颗树是否相同classSolution{publicbooleanisSameTree(TreeNodep,TreeNodeq){//如何判断两颗树是否相同?根相同+左右子树相同//如何判断根相同?结构+值相同if(p==null&&q!=null||p!=null&&......
  • 半导体基础SECS协议 - GEM300
    GEM(GenericEquipmentModel)定义了Fab中各个场景下设备行为及其所使用SECS消息。GEM300的定义内容是GEM在300mm晶圆Fab的特化内容。本篇将简要介绍GEM300所涉协议、其中重要SEMI协议(E87、E40、E90、E39)、GEM300生产设备类型及其Load操作。 一、SignificanceofGEM3001.3......
  • 代码随想录 day23 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累
    修剪二叉搜索树这道题不能直接写删除代码因为要涉及父子关系的保留如这样是暴力删掉不符合区间的节点但是没有保留父子关系这里我们把不符合区间的节点通过一个临时节点传递出来然后在外面合适方向接住具体怎么接住的呢其实就是对于root来说左边子树抛出的节点就会......
  • AWS-SAA C03 题库 —— PART03 81-130
    81.AsolutionsarchitectisdesigningthecloudarchitectureforanewapplicationbeingdeployedonAWS.Theprocessshouldruninparallelwhileaddingandremovingapplicationnodesasneededbasedonthenumberofjobstobeprocessed.Theprocessor......