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

代码随想录算法训练营第二十天 |235、二叉搜索树的最近巩固祖先 701、二叉搜索树中的插入操作 450、删除二叉搜索树中的节点

目录

235. 二叉搜索树的最近公共祖先

题目描述

解题思路

701. 二叉搜索树中的插入操作

题目描述

解题思路

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

题目描述

解题思路


235. 二叉搜索树的最近公共祖先

题目描述

  • 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

  • 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路

  • 和236. 二叉树的最近公共祖先类似,二叉搜索树可以对其进行优化
  • 当pq值都小于根节点时,说明在左子树;当pq值都大于根节点时,说明在右子树;特殊的是,当p,q分别在左右子树时,此时的根节点为最近公共祖先。不可能存在次近公共祖先,所谓的该次近公共祖先一定是在某个根节点下的左子树或者右子树
class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if not root:return root #p,q都小于根节点 if root.val > p.val and root.val > q.val: left = self.lowestCommonAncestor(root.left,p,q) if left:return left #p,q都大于根节点 if root.val < p.val and root.val < q.val: right = self.lowestCommonAncestor(root.right,p,q) if right:return right #最近公共祖先 return root

701. 二叉搜索树中的插入操作

题目描述

  • 给定二叉搜索树(BST)的根节点root和要插入树中的值value,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。

  • 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果

解题思路

  • 三部曲
    • 递归类型:不涉及处理中间节点操作
    • 参数:根节点,插入值
    • 递归终止条件:当前节点为叶子节点,可以插入,否则就继续向下执行
class Solution: def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]: if not root: return TreeNode(val) #小于根节点,在根节点的左子树 if root.val > val: root.left = self.insertIntoBST(root.left,val) #大于根节点,在根节点的右子树 if root.val < val: root.right = self.insertIntoBST(root.right,val) return root

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

题目描述

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

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

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

解题思路

  • 三部曲
    • 递归类型:不单独涉及中间节点,前中后序都可以
    • 参数:根节点和目标删除节点
    • 递归终止条件:分五种情况,如下
  • 难点在当删除节点为根节点时,并且左右子树不为空时需要改变树的结构,此时将右子树的根节点设为树的根节点时,就将左子树挂在右子树的最左侧;将左子树的根节点设为树的根节点时,就将右子树挂在左子树的最右侧
class Solution: def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]: #1.树为空,没有找到删除节点 if not root: return None #2.找到删除节点 if root.val == key: #2.1叶子节点 if not root.left and not root.right: return None #2.2左为空右不为空 if not root.left and root.right: return root.right #2.3左不为空右为空 if root.left and not root.right: return root.left #2.4左右都不为空(改变树的结构) else: #将右节点作为根节点 #由于左子树严格小于右子树,故将左子树的根节点放在右子树的最左侧 cur = root.right while cur.left:cur = cur.left #此时cur.left为空 cur.left = root.left #返回右子树的根节点作为新树的根节点 return root.right #3.在左右子树中寻找 if key < root.val: root.left = self.deleteNode(root.left,key) if key > root.val: root.right = self.deleteNode(root.right,key) return root
http://www.jsqmd.com/news/621025/

相关文章:

  • OpenClaw Windows 部署全程图文教程 | 免代码
  • 从架构到Agent能力的技术演进分析
  • 2026奇点智能技术大会闭门报告(仅限首批1,863名架构师获取的AI-DB决策矩阵)
  • Docker 环境下快速部署 Dify 中文版的完整指南
  • 今天不重构协作模式,明天就失去AI交付权:一份来自17个AI原生项目的紧急协同诊断报告
  • Diablo16串口库:Arduino驱动4D Systems图形屏实战指南
  • 深入解析JWT令牌与角色认证
  • Spring Boot 3.2 集成 Shiro 2.0.1 踩坑实录:从 javax.servlet 到 jakarta.servlet 的完整迁移指南
  • **局部路径规划-teb算法**
  • HTML函数运行时内存泄漏是硬件故障吗_软硬件问题区分【解答】
  • 3天重构传统微服务为AI Agent系统?网易伏羲团队实录:低代码AI工作流平台上线全过程(含架构图与SLA保障清单)
  • 8大网盘直链解析工具技术解析:本地化安全下载的终极解决方案
  • OpenClaw 长记忆增强:基于 Hologres + Mem0 的企业级方案
  • AI赋能柔性生产:视频化SOP数智化平台落地
  • 2026年6月PMP考试:最后的60天,最关键的其实是这两个字
  • 基于 mzt-biz-log 构建可观测的微服务接口日志体系
  • 微信数据解密实战指南:4步掌握专业级聊天记录恢复技术
  • 2026年广东高弹性TPE复合牛津布优质公司推荐
  • 使用 SciPy 实现 NumPy 数组的重叠拼接与加权融合
  • 企业查询怎么查?避坑指南+实操步骤(附免费工具推荐)
  • CVPR 2024 3D技术全景:从高斯泼溅到动态场景重建的突破与应用
  • 千问3.5-2B辅助C++项目开发:代码审查与漏洞检测实践
  • SQL如何处理包含NULL分组的聚合计算_NULLS LAST排序技巧
  • **Vulkan实战进阶:从零构建高性能图形渲染管线(附完整代码流程)**在现代游
  • 别再踩坑!OpenClaw Windows 超详细安装教程(附避坑)
  • NRA系列伺服扭转作动器
  • 推荐一些可以用于论文降重的软件(硕博防挂科必看指南)
  • 前端常用规范
  • 【实战指南】利用TestCenter精准验证组播流转发性能
  • 【数据库原理 实验报告7】视图和存储过程的应用