0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

删除二叉搜索树中的节点

算法与数据结构 来源:五分钟学算法 2020-06-23 10:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天分享的题目来源于 LeetCode 第 450 号问题:删除二叉搜索树中的节点。虽然它的难度是中等,但实际上很好理解,请往下看!

题目描述

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

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

首先找到需要删除的节点;

如果找到了,删除它。

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

示例:

root=[5,3,6,2,4,null,7] key=3 5 / 36 / 247 给定需要删除的节点值是3,所以我们首先找到3这个节点,然后删除它。 一个正确的答案是[5,4,6,2,null,null,7], 如下图所示。 5 / 46 / 27 另一个正确答案是[5,2,6,null,4,null,7]。 5 / 26 47

题目解析

在二叉搜索树上删除一个节点,这道题目有一个隐含的条件,就是树上节点的值不重复。

另外题目还要求时间复杂度需要保证 O(h) 这里的 h 表示的是二叉树的高度。

其实这个题目是分成两个步骤的,第一个是找到对应的节点,第二个是删除节点。

因为是二叉搜索树,对于树上每个节点来说,其右子树的节点都要大于其左子树的节点,那么要找对应节点,我们可以从根节点开始,一路比较,大的话就去右边找,小的话就去左边找,这样每次我们都往下,可以保证时间复杂度是 O(h)。

当我们找到了要删除的节点,在删除这一步就会有很多的细节,主要是因为我们需要调整余下的结构,以维持二叉搜索树的性质。

针对这个问题,我们可以分情况讨论:

5 / 36 / 247 / 18

情况 1:当删除的节点没有左右子树,比如上图的 4、8、1
这时直接删除即可,树依旧可以保持二叉搜索树的性质

情况 2:当删除的节点有左子树没有右子树,比如上图的 2
这时我们只需要将整个左子树移到当前位置即可
也就是将左子树的根节点放到删除节点的位置,其余不变

情况 3:当删除的节点没有左子树有右子树,比如上图的 6、7
这时我们只需要将整个右子树移到当前位置即可
也就是将右子树的根节点放到删除节点的位置,其余不变

情况 4:当删除的节点既有左子树又有右子树,比如上图的 5、3
这时就有两种方法供选择:
去到左子树中,找到值最大节点,将右子树全部移到这个节点下
去到右子树中,找到值最小节点,将左子树全部移到这个节点下

通过上面的讨论分析,我们有了大致的思路。在实现方面,我们可以借助递归来巧妙地达到删除对应节点的目的。

图片描述

参考代码

//五分钟学算法 publicTreeNodedeleteNode(TreeNoderoot,intkey){ if(root==null){ returnnull; } //当前遍历到的节点大于要找的节点,去左边继续找 if(root.val>key){ root.left=deleteNode(root.left,key); } //当前遍历到的节点小于要找的节点,去右边继续找 elseif(root.val< key) {         root.right = deleteNode(root.right, key);     }      // 找到要删除的节点,进行删除操作     else {         // 情况 1 & 2         if (root.right == null) {             return root.left;         }          // 情况 3         if (root.left == null) {             return root.right;         }         // 去到删除节点的右子树,找到值最小的节点         TreeNode rightSmallest = root.right;         while (rightSmallest.left != null) {             rightSmallest = rightSmallest.left;         }         // 将删除节点的左子树全部移到这个节点下         rightSmallest.left = root.left;         // 返回右子树的根节点,放到当前删除节点的位置         return root.right;     }     return root; }

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4760

    浏览量

    97136
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12861

原文标题:五分钟看懂一道中等难度的算法题

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    线性搜索搜索介绍

    线性搜索(Linear Search):从数组的第一个元素开始,依次将当前元素与目标值进行比较,直到找到目标值或搜索完整个数组。 搜索(Binary Search):在有序数组
    发表于 12-01 07:36

    `lv_obj_tree.h` 在 **LVGL v9** 的位置和作用

    /core/lv_obj_tree.h 核心作用 这个文件是 LVGL 核心模块的一部分,主要负责 UI 对象的管理,包括: 对象的父子关系维护(添加、删除子对象); 对象的遍历(例如查找子对象、祖先
    发表于 11-13 15:49

    通过优化代码来提高MCU运行效率

    选择时间复杂度低的算法。 根据访问模式选择数据结构。频繁查找用哈希表,有序数据用二叉树等。 查表法:对于复杂的数学计算(如sin, log),或者协议解析,预先计算好结果存于数组,用空间换时间
    发表于 11-12 08:21

    请问rtt studio 的文件夹打红什么意思?

    rtt studio 的文件夹打红什么意思?而且文件夹里面实际是有文件的,但是浏览不出来。
    发表于 09-18 06:34

    产品搜索与过滤API接口

    ​ 在现代化电子商务和应用程序开发,高效的产品搜索与过滤功能至关重要。它能帮助用户快速找到所需商品,提升用户体验和转化率。产品搜索与过滤API接口作为后端服务的核心组件,允许开发者通过编程方式实现
    的头像 发表于 07-24 14:35 354次阅读
    产品<b class='flag-5'>搜索</b>与过滤API接口

    删除工作空间中的工程项目

    首先我们先删除刚刚新建的工程模板。
    的头像 发表于 05-06 09:27 1158次阅读
    <b class='flag-5'>删除</b>工作空间中的工程项目

    电机温度监测系统低功耗无线节点模块设计

    完整资料~~~*附件:电机温度监测系统低功耗无线节点模块设计.pdf 【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 04-30 00:42

    使用AD2428时,通过主节点发现从节点的过程遇到的问题求解

    在使用AD2428时,通过主节点发现从节点的过程,遇到以下问题: 按照手册中将0x9寄存器配置成0x1,读回0x17寄存器的值为0x29,且主节点未发现从
    发表于 04-15 07:14

    百度搜索全量上线DeepSeek满血版,开启AI搜索新体验

    近日,百度搜索迎来了重大更新,全量上线了DeepSeek满血版。这一更新意味着用户现在可以在百度App中体验到更加智能、高效的搜索服务。 用户只需在百度App输入任意搜索词,完成一轮
    的头像 发表于 02-18 15:15 1952次阅读

    Kaggle知识点:7种超参数搜索方法

    问题。一些常见的超参数例子包括梯度基算法的学习率,或者决策算法的深度,这些可以直接影响模型准确拟合训练数据的能力。超参数调优涉及在复杂的、高维的超参数空间中
    的头像 发表于 02-08 14:28 1693次阅读
    Kaggle知识点:7种超参数<b class='flag-5'>搜索</b>方法

    hyper v 删除,怎么样删除hyper-v的虚拟机?

    步骤进行操作:    1.打开Hyper-V管理器:    在Windows桌面上,点击“开始”按钮。    在搜索输入“Hyper-V管理器”并打开它。    2.停止虚拟机:    在Hyper-V管理器,找到要
    的头像 发表于 02-05 13:39 1506次阅读
    hyper v <b class='flag-5'>删除</b>,怎么样<b class='flag-5'>删除</b>hyper-v<b class='flag-5'>中</b>的虚拟机?

    科技在物联网方面

    科技在物联网领域有多方面的涉及和发展,以下是一些具体信息: 传感器技术合作 与传感器公司合作:宇科技与一些传感器技术公司有合作,例如奥比光为宇机器狗提供激光雷达及结构光传感
    发表于 02-04 06:48

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组织架构

    下图是一个设备文件的基本架构示例:简单概括一下有这几个部分:节点节点的命名方式一般为node-name@unit-address:其中node-name为节点名称,unit-addr
    发表于 01-08 09:01

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-08 08:32

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的name和value。在设备,可描述的信息包括:一、CPU的数量和类别;、内存基地址和大小;三、总线和桥;四、外设连接;五、中断控制器和中断使用情况;六、GPIO控制器和GPIO使用情况;七
    发表于 01-07 09:16