当前位置: 首页 > 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.jsqmd.com/news/593382/

相关文章:

  • GiD 从入门到精通:几何建模与网格划分实战指南
  • 失业期PHP程序员玻璃心,伪勤奋,固守旧认知的庖丁解牛
  • Halcon局部可变形匹配实战:用‘垫片’案例手把手教你搞定弹性物体定位与缺陷检测
  • 原来不是只有X86和macOS能安装OpenClaw,ARM小盒子居然也能吃上
  • 手把手教你用JoyAgent-JDGenie搭建自己的第一个AI智能体(附天气查询Agent代码)
  • 人生苦难的本质的庖丁解牛
  • LeetCode 530. Minimum Absolute Difference in BST 题解
  • 2025届最火的十大降重复率助手推荐
  • N1盒子刷OpenWRT软路由全流程:从降级到内网穿透,小白也能轻松搞定
  • PX4开发实战:uORB通信机制详解与代码实操(附避坑指南)
  • 2026最权威的五大降重复率网站横评
  • 从Google Spanner到阿里OceanBase:拆解Paxos在万亿级数据库中的实战配置与调优
  • 《碳硅“虫洞”解:跨认知区域的可穿越通道》(修订版)
  • 快马平台十分钟速建:基于gstack的现代博客原型开发全指南
  • ParseDXF 功能说明文档
  • 光芯片技术突破与AI算力应用解析
  • 告别subfloat!LaTeX中minipage+subfigure排版多图的最佳实践
  • Python 中的日志系统:从基础到高级应用
  • 基于SVC和PSS的电力系统暂态稳定性研究:Matlab/Simulink仿真与结果分析
  • 实战应用:基于快马平台构建带版本管理与评论系统的软件下载站
  • 异地多活架构
  • LeetCode 653. Two Sum IV - Input is a BST 题解
  • 模糊PID控制主动悬架模型:基于2自由度1/4模型的效果对比与Matlab实现
  • 深度学习中的语义分割:从原理到实践
  • 电动汽车充放电最优调度MATLAB源代码:全局与局部调度策略复现
  • 从源码到实践:拆解PX4飞控如何处理Mavros的GPS/ENU坐标指令(附精准转换代码)
  • Java 接入外汇数据 API 完整教程:实时报价、历史 K 线与 WebSocket 推送
  • 智能电网中多时段多公司需求响应管理的博弈理论框架 利用博弈论建立了一个考虑公司和消费者之间相互...
  • LeetCode 113. Path Sum II 题解
  • GORM实战避坑指南:从官方文档到高效开发