当前位置: 首页 > news >正文

LeetCode 450. Delete Node in a BST 题解

LeetCode 450. Delete Node in a BST 题解

题目描述

给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回删除后的二叉搜索树的根节点。

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

解题思路

方法:递归

思路

  • 利用二叉搜索树的性质:左子树的所有节点值小于根节点的值,右子树的所有节点值大于根节点的值
  • 递归地删除目标节点:
    • 如果当前节点为空,返回null
    • 如果当前节点的值大于目标值,递归删除左子树中的目标节点
    • 如果当前节点的值小于目标值,递归删除右子树中的目标节点
    • 如果当前节点的值等于目标值:
      • 如果当前节点没有左子节点,返回右子节点
      • 如果当前节点没有右子节点,返回左子节点
      • 否则,找到右子树中的最小节点(即右子树的最左节点),将其值赋给当前节点,然后递归删除右子树中的最小节点

复杂度分析

  • 时间复杂度:O(h),其中 h 是二叉搜索树的高度。在最坏情况下,二叉搜索树退化为链表,时间复杂度为 O(n)。
  • 空间复杂度:O(h),递归调用的栈空间取决于二叉搜索树的高度。

代码实现

方法:递归

# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: # 递归终止条件:如果当前节点为空,返回 null if not root: return None # 如果当前节点的值大于目标值,递归删除左子树中的目标节点 if root.val > key: root.left = self.deleteNode(root.left, key) # 如果当前节点的值小于目标值,递归删除右子树中的目标节点 elif root.val < key: root.right = self.deleteNode(root.right, key) # 如果当前节点的值等于目标值 else: # 如果当前节点没有左子节点,返回右子节点 if not root.left: return root.right # 如果当前节点没有右子节点,返回左子节点 elif not root.right: return root.left # 否则,找到右子树中的最小节点(即右子树的最左节点) else: # 找到右子树的最左节点 min_node = self.find_min(root.right) # 将最小节点的值赋给当前节点 root.val = min_node.val # 递归删除右子树中的最小节点 root.right = self.deleteNode(root.right, min_node.val) return root # 找到以 node 为根的子树中的最小节点(即最左节点) def find_min(self, node): while node.left: node = node.left return node

测试用例

测试用例 1:

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]

测试用例 2:

输入:root = [5,3,6,2,4,null,7], key = 0
输出:[5,3,6,2,4,null,7]

测试用例 3:

输入:root = [], key = 0
输出:[]

总结

本题是二叉搜索树的经典问题,主要考察对二叉搜索树性质的理解和应用。通过使用递归,我们可以高效地在二叉搜索树中删除目标节点。

递归的核心思想是:利用二叉搜索树的性质,递归地删除目标节点。当找到目标节点时,根据其是否有子节点的情况进行处理,确保删除后

http://www.cnnetsun.cn/news/1711011.html

相关文章:

  • 实战应用:基于快马平台构建带版本管理与评论系统的软件下载站
  • 如何运用AI技术有效破解企业视觉检测难题
  • 光芯片技术突破与AI算力应用解析
  • YOLOv8多任务配置文件对比:5分钟搞懂detect/seg/cls/pose的.yaml差异
  • 位运算基础应用
  • 第28课:Qt 读系统时钟并响应中断,让时间界面和板级事件同时在线
  • 告别B站资源无法保存的烦恼:BiliTools跨平台工具箱完整使用指南
  • 如何用OpCore-Simplify在30分钟内完成黑苹果配置:自动化OpenCore EFI工具终极指南
  • FUXA SVG编辑器元素管理功能优化:从问题发现到价值验证
  • 第6章 数据类型转换-6.8 转换为集合
  • 样本收集的致命误区:为什么你的AI模型“一上产线就拉胯”?
  • 深入理解 Firebase onSnapshot 的监听机制
  • 模电实战-比较器正反馈接法的窗口电压设计
  • 告别繁琐下载:File Browser极简方案实现20+格式文件在线预览
  • 基于Logisim与Verilog HDL的运动码表计时电路设计与DE2-70开发板验证
  • 别再用手机思维做TV App了!Android TV开发必知的模拟器操作与UI焦点设计实战
  • 别只盯着stkInit!用这个STK MATLAB互联测试脚本,一键验证你的环境是否真的配好了
  • 魔兽争霸3 Windows 11兼容性终极解决方案:让你的经典游戏重获新生
  • 终极Limbus Company自动化助手:5大功能彻底解放你的双手
  • 终极指南:如何快速上手ALOHA开源双臂机器人系统,开启你的机器人开发之旅
  • 基于元模型优化的虚拟电厂主从博弈动态定价与能量管理双层调度策略
  • ai辅助开发新体验:让快马ai帮你打造智能win10安装准备助手
  • AI辅助开发性能代码:让快马平台AI成为你的高性能并发任务调度顾问
  • Windows 批量文件夹图标设置工具(支持.ico.exe 图标提取与替换)自动扫描每个文件夹中的ICO和EXE图标文件
  • 智能自动化任务管理器是专业 Windows 自动化工具,零代码可视化配置,支持全类型任务与多模式执行,内置键鼠编辑器
  • 全面掌握HSTracker:从炉石传说套牌追踪到高级数据分析的实战指南
  • 深入剖析Golang HTTP/2客户端连接池与多路复用机制
  • TCP Keep-Alive、HTTP Keep-Alive、应用层心跳,傻傻分不清?一张图讲透网络‘保活’全家桶
  • U盘启动盘制作全攻略:从Rufus到Ventoy的深度对比
  • 3步精通UndertaleModTool:解锁GameMaker游戏修改全流程