LeetCode题练习与总结:删除二叉搜索树中的节点--450

一、题目描述

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

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

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

示例 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 <= Node.val <= 10^5
  • 节点值唯一
  • root 是合法的二叉搜索树
  • -10^5 <= key <= 10^5

二、解题思路

  • 查找节点:由于是二叉搜索树,我们可以利用其性质来快速定位要删除的节点。二叉搜索树的性质是:对于任意节点,其左子树的所有节点值都小于该节点值,其右子树的所有节点值都大于该节点值。因此,我们可以从根节点开始,比较当前节点值与key的大小,决定向左还是向右搜索。

  • 删除节点:找到要删除的节点后,根据节点的情况进行删除:

    • 节点是叶子节点:直接删除,即返回null。
    • 节点只有一个子节点:用子节点替代当前节点,返回子节点。
    • 节点有两个子节点:找到右子树中的最小节点(或左子树中的最大节点),用它来替代要删除的节点,然后删除该最小(或最大)节点。

三、具体代码

class Solution {public TreeNode deleteNode(TreeNode root, int key) {if (root == null) {return null;}// 查找要删除的节点if (key < root.val) {root.left = deleteNode(root.left, key);} else if (key > root.val) {root.right = deleteNode(root.right, key);} else {// 找到要删除的节点,进行删除操作if (root.left == null) {return root.right; // 只有一个右子节点或没有子节点} else if (root.right == null) {return root.left; // 只有一个左子节点} else {// 找到右子树中的最小节点TreeNode minNode = findMin(root.right);// 用最小节点替代当前节点root.val = minNode.val;// 删除右子树中的最小节点root.right = deleteNode(root.right, minNode.val);}}return root;}// 辅助函数,找到以node为根的树中的最小节点private TreeNode findMin(TreeNode node) {while (node.left != null) {node = node.left;}return node;}
}

这段代码首先递归地查找要删除的节点,然后根据节点的情况进行相应的删除操作。如果节点有两个子节点,我们通过findMin函数找到右子树中的最小节点,用它来替代要删除的节点,然后递归地删除右子树中的最小节点。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 查找节点:在二叉搜索树中查找一个节点的时间复杂度是 O(h),其中 h 是树的高度。在平衡的二叉搜索树中,h = log(n),其中 n 是树中节点的数量。在最坏的情况下(树完全倾斜),h = n。

  • 删除节点

    • 节点是叶子节点:直接删除,时间复杂度为 O(1)。
    • 节点只有一个子节点:直接用子节点替代,时间复杂度为 O(1)。
    • 节点有两个子节点:需要找到右子树中的最小节点,这需要 O(h) 的时间,然后删除该最小节点,这同样需要 O(h) 的时间。

综上所述,删除操作的时间复杂度是 O(h)。

因此,整体的时间复杂度是 O(h),在平衡树中是 O(log(n)),在最坏情况下是 O(n)。

2. 空间复杂度
  • 递归栈空间:由于使用递归,在最坏情况下,如果树完全倾斜,递归的深度将达到 n,因此递归栈的空间复杂度是 O(n)。

  • 辅助空间:在删除节点时,除了递归栈外,我们只使用了常数个额外空间(例如用于存储最小节点的变量),因此辅助空间复杂度是 O(1)。

综合以上两点,整体的空间复杂度是 O(n),其中 n 是树中节点的数量。在平衡树中,空间复杂度可以降低到 O(log(n))。

五、总结知识点

  • 二叉搜索树(BST)的性质

    • 对于任意节点,其左子树的所有节点值都小于该节点值。
    • 对于任意节点,其右子树的所有节点值都大于该节点值。
  • 递归

    • 递归是一种常用的算法设计方法,用于在树形结构中进行遍历或修改。
    • 在此代码中,递归用于在二叉搜索树中查找和删除指定的节点。
  • 递归的基本情况与递归步骤

    • 基本情况(Base Case):递归的终止条件,如 if (root == null)
    • 递归步骤(Recursive Step):递归调用的部分,如 root.left = deleteNode(root.left, key)
  • 指针操作

    • 代码中使用了指针(在Java中称为引用)来修改二叉树的结构,如在删除节点时将父节点的引用指向子节点。
  • 节点删除的三种情况

    • 叶子节点:直接删除,返回null。
    • 只有一个子节点的节点:用子节点替代当前节点。
    • 有两个子节点的节点:找到右子树中的最小节点(或左子树中的最大节点)来替代当前节点,然后删除该最小(或最大)节点。
  • 辅助函数

    • findMin 函数用于找到以某个节点为根的树中的最小节点,这是通过不断向左遍历直到找到最左边的节点实现的。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485249.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作&#xff0c;无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…

我国基本比例尺地形图介绍

目录 1.前言2.大中小比例尺划分3.使用的投影4.使用3度带6度带&#xff1f;5.详细介绍1:100万地形图1:50万地形图1:25万地形图1:10万地形图1:5万地形图1:2.5万地形图1:1万地形图1:5000地形图 6.总结 1.前言 本文搜集整理了我国国家基本比例尺地形图的情况&#xff0c;共11种&…

离线安装ollama到服务器

搜了很多教程不满意,弄了半天才弄好&#xff0c;这里记录下&#xff0c;方便以后的人用&#xff0c;那个在线下载太慢&#xff0c;怕不是得下载到明年。 一.从官网下在liunx版的tgz安装包 Releases ollama/ollama (github.com) 查看自己的服务器信息&#xff08;参考 https:/…

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR&#xff0c;可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像&#xff08;第一行&#xff09;和二维码图像&#xff08;第二行&#xff09;。生成的二维码不仅忠实地保留…

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后&#xff0c;响应较慢&#xff0c;通用的问题排查方法: 从多个角度来排查问题 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评…

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…

如何利用Java爬虫获得商品类目

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言&#xff0c;获取商品类目数据尤为重要&#xff0c;因为这些数据可以帮助他们更好地理解市场…

筑起厂区安全--叉车安全防护装置全解析

在繁忙的工业生产领域中&#xff0c;叉车作为搬运工&#xff0c;穿梭于仓储与生产线之间。然而&#xff0c;叉车的高效运作背后&#xff0c;也隐藏着诸多安全风险&#xff0c;尤其是在那些空间狭小、物流繁忙的环境中。为了降低这些潜在的危险&#xff0c;叉车安全防护装置便成…

AI新动向:豆包文生图升级,文心一言领先市场

在今日的AI资讯中&#xff0c;我们关注到了几个重要的行业动态&#xff0c;其中包括字节跳动AI助手豆包的功能升级&#xff0c;以及百度文心一言在生成式AI市场的领先地位。 字节跳动旗下的智能AI助手豆包近期对其文生图能力进行了显著提升&#xff0c;用户现在可以通过一键操…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件&#xff0c;通过连接SIM卡与手机主板的方式&#xff0c;允许设备访问移动网络&#xff0c;用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良&#xff0c;造成信号中断&…

PDF文件打开之后不能打印,怎么解决?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

JUC:读写锁和邮戳锁

1. 面试题 你知道Java里面有那些锁你说说你用过的锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁StampedLock知道吗&#xff1f;&#xff08;邮戳锁/票据锁&#xff09;ReentrantReadWriteLock有锁降级机制&#xff0c;你知道吗&#xff1f; 2. 读写锁&a…

「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果

本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色&#xff0c;用户可以在视觉上感受到按钮的闪烁效果&#xff0c;提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能&#xf…

MongoDB的简单使用

MongoDB(文档数据库)的简单使用 MongoDB最好的学习资料就是他的官方文档&#xff1a;SQL 到 MongoDB 的映射图表 - MongoDB 手册 v8.0 1.MongoDB CRUD操作 1.1Insert操作 基本方法&#xff1a; db.collection.insertOne() 将单个文档(document)插入集合中 db.collectio…

chromedriver.exe编译

使用例子参考官网 ChromeDriver 使用入门 | Chrome for Developers Chrome for Testing availability 注意&#xff1a;chromedriver版本要与chromium版本号对应。 如何编译chromedriver chrome\test\chromedriver\BUILD.gn 1、ninja -C out/debug chromedriver_server…

基于MinIO打造高可靠分布式“本地”文件系统

MinIO是一款高性能的对象存储服务&#xff0c;而S3协议是由亚马逊Web服务&#xff08;AWS&#xff09;制定的一种标准协议&#xff0c;用于云存储服务之间的数据交换。MinIO与S3协议的关系在于&#xff0c;MinIO实现了S3协议的接口&#xff0c;这意味着用户可以使用与AWS S3相同…

Python_Flask02

所有人都不许学Java了&#xff0c;都来学Python&#xff01; 如果不来学的话请网爆我的老师 连接前的准备 安装pymysql 和 flask_sqlalchemy&#xff0c;安装第三下面两个所需要的包才能连接上数据库 pip install pymysql pip install flask_sqlalchemy pymysql是一个Pyth…

python学opencv|读取图像(四)imshow()函数尝试

【1】引言 前述已经学习了opencv读取图像的基本操作&#xff0c;包括下述链接&#xff1a; python学opencv|读取图像-CSDN博客 python学opencv|读取图像&#xff08;二&#xff09;保存彩色图像-CSDN博客 python学opencv|读取图像&#xff08;三&#xff09;放大和缩小图像…

AC高可靠

在真实网络中&#xff0c;一台AC可能要管理上百台AP&#xff0c;因此对与AC的可靠性要求目前有4种解决方案 分别是VRRP双机热备&#xff0c;双链路冷备&#xff0c;双链路热备&#xff0c;N1备份 简述 VRRP双机热备份 主备AC两个独立的IP地址&#xff0c;通过VRRP对外虚拟为同…