二叉搜索树 (BST) 删除节点 3 种情况详解:从递归到迭代,附 5 个 LeetCode 实战
二叉搜索树删除节点的3种情况与实战应用从递归到迭代的深度解析二叉搜索树Binary Search Tree, BST作为计算机科学中最基础且实用的数据结构之一其删除操作一直是算法面试中的高频考点。本文将系统性地剖析BST删除节点的三种经典情况对比递归与迭代两种实现范式并通过5道LeetCode真题强化实战能力。1. 二叉搜索树核心特性回顾在深入删除操作之前我们需要明确BST的三个基本性质有序性对于任意节点左子树所有节点值 当前节点值 右子树所有节点值结构性空树是BST单个节点也是BST递归性左右子树都是BST递归定义class TreeNode: def __init__(self, val0, leftNone, rightNone): self.val val self.left left self.right rightBST的平均时间复杂度为O(log n)但在最坏情况下退化成链表会恶化到O(n)。这就是为什么实际应用中更多使用平衡二叉搜索树如AVL树、红黑树。关键认知删除操作必须维护BST的有序性这是所有实现方案的核心约束条件2. 删除节点的三种情况分解根据待删除节点的子节点数量我们可以将问题划分为三类每种情况需要不同的处理策略2.1 情况一删除叶子节点0个子节点这是最简单的情况直接移除节点即可不会影响树的结构性质。操作步骤定位到待删除节点将其父节点对应的指针置为null释放节点内存可视化示例删除前 41 / \ 20 65 / 50 删除50后 41 / \ 20 652.2 情况二删除只有一个子节点的节点需要将被删除节点的子节点提升到其原有位置。操作步骤定位到待删除节点用其唯一子节点替换自身释放节点内存可视化示例删除前 41 / \ 20 65 / 50 删除65后 41 / \ 20 502.3 情况三删除有两个子节点的节点最复杂的情况需要找到合适的替代节点来保持BST性质。通常有两种策略后继替换法用右子树的最小节点中序后继替换前驱替换法用左子树的最大节点中序前驱替换标准操作流程以后继替换为例找到待删除节点在其右子树中找到最小值节点最左节点用该最小值替换待删除节点的值递归删除右子树中的那个最小值节点可视化示例删除前 41 / \ 20 65 / \ 50 72 / \ 45 55 删除65后用72替换 41 / \ 20 72 / \ 50 72 / \ 45 553. 递归实现方案详解递归实现更直观地反映了BST的递归性质代码通常更简洁。以下是Python实现def deleteNode(root: TreeNode, key: int) - TreeNode: if not root: return None if key root.val: root.left deleteNode(root.left, key) elif key root.val: root.right deleteNode(root.right, key) else: # 情况1叶子节点或单子节点 if not root.left: return root.right if not root.right: return root.left # 情况2双子节点找后继 successor findMin(root.right) root.val successor.val root.right deleteNode(root.right, successor.val) return root def findMin(node): while node.left: node node.left return node时间复杂度分析最好/平均情况O(log n)最坏情况O(n)树退化为链表空间复杂度递归栈空间O(h)h为树高4. 迭代实现方案剖析迭代实现避免了递归调用栈的开销更适合深度较大的树。以下是迭代版本的Python实现def deleteNodeIterative(root: TreeNode, key: int) - TreeNode: curr root parent None # 第一阶段搜索节点 while curr and curr.val ! key: parent curr curr curr.left if key curr.val else curr.right if not curr: # 未找到 return root # 第二阶段删除节点 if not curr.left or not curr.right: child curr.left if curr.left else curr.right if not parent: # 删除的是根节点 return child if parent.left curr: parent.left child else: parent.right child else: # 两个子节点 successor_parent curr successor curr.right while successor.left: successor_parent successor successor successor.left curr.val successor.val if successor_parent.left successor: successor_parent.left successor.right else: successor_parent.right successor.right return root关键区别点需要显式维护parent指针删除操作分为搜索和修改两个独立阶段处理后继节点时需考虑其是否为右子树的直接根节点5. 边界条件与易错点分析在实际编码面试中以下边界条件经常被忽视删除根节点需要特殊处理parent为None的情况重复值标准BST通常不允许重复值但某些变体允许内存管理C等语言需要手动释放节点内存空树处理删除操作在空树上应安全返回节点不存在应保持树结构不变常见错误模式# 错误示例未正确处理parent指针 def deleteNodeWrong(root, key): if not root: return None # ...找到节点后直接修改... node.val successor.val # 只修改了值未更新树结构 return root6. LeetCode实战精讲6.1 LeetCode 450. 删除二叉搜索树中的节点这是最标准的BST删除问题直接应用前述算法即可。注意题目要求返回修改后的根节点。优化点可以提前判断当找到节点时如果它是叶子节点就直接返回None减少递归深度。6.2 LeetCode 701. 二叉搜索树中的插入操作虽然题目是插入操作但理解插入有助于反向理解删除。插入总是发生在叶子节点位置而删除可能发生在任何位置。6.3 LeetCode 669. 修剪二叉搜索树这个问题可以看作是多节点删除的变种。解题关键在于if root.val low: return trimBST(root.right, low, high) if root.val high: return trimBST(root.left, low, high)6.4 LeetCode 230. 二叉搜索树中第K小的元素展示了BST中序遍历的有序性。删除操作中寻找后继节点的过程与此相关。6.5 LeetCode 538. 把二叉搜索树转换为累加树虽然是关于修改节点值的问题但遍历顺序右-根-左与删除时寻找前驱节点的路径一致。7. 性能对比与工程实践建议实现方式优点缺点适用场景递归实现代码简洁逻辑直观栈空间开销深度大时可能溢出树平衡较好的场景迭代实现无栈溢出风险空间效率高代码复杂需维护parent指针深度不可预测的大树工程实践建议在内存受限环境优先选择迭代实现递归实现更易于维护和调试考虑使用线索二叉树优化中序后继查找对于频繁删除的场景建议使用平衡二叉搜索树8. 高级变种与扩展思考带父指针的BST简化了迭代实现中parent的维护懒惰删除标记节点为已删除而非立即移除适合频繁更新的场景线程二叉树通过线索化加速中序前驱/后继查找支持重复值的BST通常将count存储在节点中// 支持重复值的节点结构 struct TreeNode { int val; int count; // 重复计数 TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), count(1), left(nullptr), right(nullptr) {} };删除这类节点时先减少count只有当count为0时才实际移除节点。

相关新闻

【Bug已解决】openclaw API key invalid / 401 Unauthorized — OpenClaw API 密钥无效解决方案

【Bug已解决】openclaw API key invalid / 401 Unauthorized — OpenClaw API 密钥无效解决方案

【Bug已解决】openclaw: "API key invalid" / 401 Unauthorized — OpenClaw API 密钥无效解决方案 1. 问题描述 OpenClaw 使用时 API 密钥无效或认证失败: # API Key 无效 $ openclaw "task" Error: 401 Unauthorized Invalid API key. Ple…

2026/7/10 2:55:55阅读更多 →
CTF 密码学入门|ASCII 编码转换

CTF 密码学入门|ASCII 编码转换

文章前言刚接触 CTF 的新手,第一道密码类题目基本都会遇到ASCII 编码转换题型。这类题目没有复杂加密算法,仅考察最基础的计算机字符编码知识与 Python 简单脚本编写,是入门练手、熟悉 CTF 解题流程的绝佳例题。 今天以平台经典入门 5 分 ASC…

2026/7/10 2:50:55阅读更多 →
【计算机大数据毕业设计案例】智能网页爬取的新闻分类聚合展示系统的设计与实现 基于 SpringBoot 的新闻舆情数据抓取与聚合平台(程序+文档+讲解+定制)

【计算机大数据毕业设计案例】智能网页爬取的新闻分类聚合展示系统的设计与实现 基于 SpringBoot 的新闻舆情数据抓取与聚合平台(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/10 2:50:55阅读更多 →
获取服务器证书的命令

获取服务器证书的命令

获取网址的根证书 openssl s_client -connect github.com:443 -servername github.com < /dev/null 2>/dev/null | openssl x509 -text -noout 获取ip的根证书 openssl s_client -connect ip:443 < /dev/null 2>/dev/null | openssl x509 -text -noout

2026/7/10 4:06:01阅读更多 →
华芯微特 Synwit UI Creator 1.0 图形上位机实战:3步完成按钮控件与串口通信事件绑定

华芯微特 Synwit UI Creator 1.0 图形上位机实战:3步完成按钮控件与串口通信事件绑定

华芯微特 Synwit UI Creator 1.0 深度开发实战&#xff1a;从控件绑定到事件驱动的完整架构解析在嵌入式系统开发中&#xff0c;图形用户界面(GUI)的实现往往是最具挑战性的环节之一。华芯微特推出的Synwit UI Creator 1.0图形上位机工具&#xff0c;为开发者提供了一套完整的解…

2026/7/10 4:06:01阅读更多 →
ANSYS 2025 R2安装深度指南:系统级部署与许可证故障排查

ANSYS 2025 R2安装深度指南:系统级部署与许可证故障排查

1. 项目概述&#xff1a;这不是一个“点下一步就能装好”的普通软件 ANSYS.2025.R2 这个标题背后&#xff0c;藏着的是一整套工业仿真生态的准入门槛。它不是你下载一个exe双击就完事的办公软件&#xff0c;而是一个横跨结构、流体、电磁、热、多物理场耦合的重型工程平台&…

2026/7/10 4:06:01阅读更多 →
无人机,正在成为3D打印的新战场

无人机,正在成为3D打印的新战场

无人机崛起&#xff0c;打开3D打印新机遇。在乌克兰等实战场景中&#xff0c;一排排桌面级3D打印机正在成为无人机快速迭代的新工具。从机身、电池仓到结构件&#xff0c;过去依赖传统供应链生产的零部件&#xff0c;如今可以通过3D打印快速完成设计、制造和优化。这种低成本、…

2026/7/10 4:06:01阅读更多 →
从 Transformer 到 LLaMA:现代 LLM 架构总览

从 Transformer 到 LLaMA:现代 LLM 架构总览

什么是开源模型&#xff1f;# 相比 GPT、Claude 等模型&#xff0c;LLaMA 并不算特别出圈&#xff0c;但它却在社区中往往被认为现代大模型架构的代表&#xff0c;要明白为什么&#xff0c;首先我们需要了解一个基础问题&#xff1a; 什么是开源模型&#xff1f; 先简单概括来说…

2026/7/10 4:06:01阅读更多 →
STM32F103C8T6 PS2手柄SPI通信:时钟周期从50us调至9us解决串口无信号

STM32F103C8T6 PS2手柄SPI通信:时钟周期从50us调至9us解决串口无信号

STM32F103C8T6与PS2手柄SPI通信的时序优化实战从串口无信号到稳定通信的调试历程最近在调试STM32F103C8T6与PS2手柄的SPI通信时&#xff0c;遇到了一个典型问题——串口完全接收不到任何信号。经过一系列排查&#xff0c;最终发现问题的根源在于SPI时钟周期设置不当。本文将详细…

2026/7/10 4:01:01阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析&#xff1a;Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时&#xff0c;背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制&#xff0c;而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述&#xff1a;这不是又一个机器人抓取数据集&#xff0c;而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号&#xff1a;“Robo”直指物理世界中的具身智能体&#xff0c;“Wits”则毫不掩饰地指向人类最核心的认知能力&#xff1a;机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南&#xff1a;如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →