news 2026/6/25 13:19:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 450 - 删除二叉搜索树中的节点


文章目录

    • 摘要
    • 描述
    • 题解答案(整体思路)
      • 第一步:找到要删除的节点
      • 第二步:根据节点的结构分类处理
    • 题解代码(Swift 可运行 Demo)
    • 题解代码分析
      • 1. 为什么删除一定要分类讨论?
      • 2. 叶子节点的删除
      • 3. 只有一个子节点的情况
      • 4. 左右子树都存在时怎么处理?
      • 5. 为什么时间复杂度是 O(h)?
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在所有二叉搜索树(BST)的操作里,删除节点算是最容易让人写崩的一道题。

插入很好写,查找也没什么难度,但一到删除,就会遇到各种情况:

  • 要删的节点是叶子节点怎么办
  • 只有一个子节点怎么办
  • 左右子树都存在又该怎么办

而这道 LeetCode 450,几乎把 BST 删除能遇到的所有坑都覆盖到了。

这篇文章会一步一步拆解 BST 删除节点的完整思路,用「分类讨论」的方式,把每一种情况都讲清楚,再给出一份可运行、好理解、好维护的 Swift 实现。

描述

题目要求我们:

  • 给定一棵合法的二叉搜索树
  • 给定一个要删除的值key
  • 删除对应节点,并保持 BST 的性质不变
  • 返回更新后的根节点

BST 的基本规则还是那一条:

  • 左子树所有节点值 < 当前节点
  • 右子树所有节点值 > 当前节点

同时题目还强调了一点:

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

这其实在暗示我们:
不能把整棵树拍平重建,只能沿着搜索路径递归处理。

题解答案(整体思路)

删除 BST 节点,本质上可以拆成两步:

第一步:找到要删除的节点

这一点和普通 BST 查找完全一样:

  • key < root.val→ 去左子树找
  • key > root.val→ 去右子树找
  • key == root.val→ 找到了,开始处理删除逻辑

第二步:根据节点的结构分类处理

找到目标节点后,分三种情况:

  1. 叶子节点(没有子节点)

    • 直接删除,返回nil
  2. 只有一个子节点

    • 用它的子节点顶替它的位置
  3. 左右子节点都存在

    • 找到右子树中的最小节点(或左子树中的最大节点)
    • 用这个值替换当前节点
    • 再递归删除被“借用”的那个节点

这三种情况,是整个题目的核心。

题解代码(Swift 可运行 Demo)

下面是完整的 Swift 实现,包括TreeNode定义和删除逻辑。

importFoundationpublicclassTreeNode{publicvarval:Intpublicvarleft:TreeNode?publicvarright:TreeNode?publicinit(_val:Int){self.val=valself.left=nilself.right=nil}}classSolution{funcdeleteNode(_root:TreeNode?,_key:Int)->TreeNode?{guardletroot=rootelse{returnnil}ifkey<root.val{root.left=deleteNode(root.left,key)}elseifkey>root.val{root.right=deleteNode(root.right,key)}else{// 找到要删除的节点// 情况 1:没有左子树ifroot.left==nil{returnroot.right}// 情况 2:没有右子树ifroot.right==nil{returnroot.left}// 情况 3:左右子树都存在letminNode=findMin(root.right)root.val=minNode.val root.right=deleteNode(root.right,minNode.val)}returnroot}privatefuncfindMin(_node:TreeNode?)->TreeNode{varcurrent=nodewhilecurrent?.left!=nil{current=current?.left}returncurrent!}}

题解代码分析

1. 为什么删除一定要分类讨论?

因为 BST 的结构不统一,删除节点后,必须保证:

  • 中序遍历仍然是有序的
  • 父子关系不能乱

如果不分情况直接暴力删,很容易破坏 BST 的结构。

2. 叶子节点的删除

ifroot.left==nil&&root.right==nil{returnnil}

这是最简单的一种情况,直接删掉即可。

在递归结构中,其实可以合并到:

ifroot.left==nil{returnroot.right}

因为root.right本身就是nil

3. 只有一个子节点的情况

ifroot.left==nil{returnroot.right}ifroot.right==nil{returnroot.left}

这种情况下,用子节点直接“顶上来”,不会破坏 BST 的规则。

4. 左右子树都存在时怎么处理?

这是最关键、也最容易写错的部分。

正确做法是:

  • 找一个能替换当前节点,又不破坏 BST 的值

  • 这个值只能来自:

    • 右子树的最小值(中序遍历的后继)
    • 或左子树的最大值(中序遍历的前驱)

本题中我们选的是:右子树最小节点

letminNode=findMin(root.right)root.val=minNode.val root.right=deleteNode(root.right,minNode.val)

这一步的本质是:

  • 用后继节点的值覆盖当前节点
  • 再把那个后继节点删掉

5. 为什么时间复杂度是 O(h)?

因为:

  • 每次递归只往左或右走
  • 没有遍历整棵树
  • 最坏情况是树退化成链表,高度为h

示例测试及结果

我们用示例 1 来跑一遍:

letroot=TreeNode(5)root.left=TreeNode(3)root.right=TreeNode(6)root.left?.left=TreeNode(2)root.left?.right=TreeNode(4)root.right?.right=TreeNode(7)letsolution=Solution()letnewRoot=solution.deleteNode(root,3)print(newRoot?.val??-1)

删除3后,可能得到:

5 / \ 4 6 / \ 2 7

或另一种等价 BST 结构,都是正确结果。

时间复杂度

  • 查找节点:O(h)
  • 删除节点:O(h)

总体时间复杂度:O(h)
其中h是树的高度。

空间复杂度

  • 递归调用栈占用:O(h)
  • 没有使用额外的数据结构

空间复杂度:O(h)

总结

LeetCode 450 是一道非常典型、也非常值得反复消化的 BST 基础题。

它教会你的不是“怎么写删除”,而是:

  • 如何用递归精确控制结构变化
  • 如何通过分类讨论避免复杂度爆炸
  • 为什么 BST 的性质能帮我们缩小问题范围
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 16:43:25

如何避免MySQL死锁?资深DBA的9条黄金法则

死锁是数据库里很常见的问题&#xff1a;两个或多个事务互相等待对方释放锁&#xff0c;结果谁也动不了。MySQL的InnoDB引擎会自己自动检测死锁&#xff0c;并且回滚其中一个事务来解决&#xff0c;但这种情况如果经常遇到的话&#xff0c;会很影响性能和用户体验。其实&#x…

作者头像 李华
网站建设 2026/6/24 14:10:41

arcpy导出excel表

我们有些时候需要导出excel表进行分析&#xff0c;因而需要熟练掌握导出excel表的技巧。 import arcpy import pandas as pd import os# 输入 shp 文件路径 shp_path r"D:\03A-Archives\博二上\全国土地退化论文\data\boundary\2017省市县行政区划\全国_10k_poly_dr.shp&…

作者头像 李华
网站建设 2026/6/25 0:01:58

视频硬字幕AI去除终极方案:本地化无损修复技术详解

视频硬字幕AI去除终极方案&#xff1a;本地化无损修复技术详解 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based tool for r…

作者头像 李华
网站建设 2026/6/24 16:36:20

BetterNCM插件完整教程:从零开始打造你的专属音乐工作站

BetterNCM插件完整教程&#xff1a;从零开始打造你的专属音乐工作站 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一、界面单调而困扰吗&#xff1f;想要把普…

作者头像 李华
网站建设 2026/6/26 0:45:30

大模型注意力机制全解析:从MHA到MoBA,一文掌握七种核心算法

文章详细解析了大模型中七种注意力机制&#xff08;MHA、MQA、GQA、MLA、NSA、SSA、MoBA&#xff09;的原理、优缺点及应用场景。从密集计算到稀疏化&#xff0c;从静态模式到动态路由&#xff0c;展示了注意力机制在效率与表达能力间的演进历程。文章对比了各机制在工程实现与…

作者头像 李华
网站建设 2026/6/23 19:33:17

LobeChat能否实现AI调酒师?饮品配方创意与口味偏好匹配

LobeChat能否实现AI调酒师&#xff1f;饮品配方创意与口味偏好匹配 在一家未来感十足的酒吧里&#xff0c;顾客刚坐下&#xff0c;轻声对吧台说&#xff1a;“来杯清爽点的&#xff0c;带点柑橘味&#xff0c;不要太烈。” 没有翻菜单&#xff0c;也没有和调酒师寒暄——回应他…

作者头像 李华