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

LeetCode 235. 二叉搜索树的最近公共祖先:利用特性优化查找

LeetCode 235. 二叉搜索树的最近公共祖先:利用特性优化查找

问题描述

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

示例 1:

输入:root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出:6

示例 2:

输入:root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出:2

示例 3:

输入:root = [2,1], p = 2, q = 1 输出:2

算法原理

核心思路

二叉搜索树的最近公共祖先问题可以利用二叉搜索树的特性来优化查找过程。二叉搜索树的特性是:

  • 左子树中的所有节点值都小于根节点的值
  • 右子树中的所有节点值都大于根节点的值
  • 左右子树也都是二叉搜索树

基于这个特性,我们可以通过以下方法找到最近公共祖先:

  1. 从根节点开始遍历
  2. 如果当前节点的值大于 p 和 q 的值,说明 p 和 q 都在左子树中,递归遍历左子树
  3. 如果当前节点的值小于 p 和 q 的值,说明 p 和 q 都在右子树中,递归遍历右子树
  4. 否则,当前节点就是 p 和 q 的最近公共祖先

复杂度分析

  • 时间复杂度:O(h),其中 h 是二叉搜索树的高度。在最坏情况下,需要遍历到树的叶子节点。
  • 空间复杂度:O(h),其中 h 是二叉搜索树的高度。递归调用栈的深度最大为 h。

代码实现

递归实现

# Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 如果当前节点的值大于 p 和 q 的值,递归遍历左子树 if root.val > p.val and root.val > q.val: return self.lowestCommonAncestor(root.left, p, q) # 如果当前节点的值小于 p 和 q 的值,递归遍历右子树 if root.val < p.val and root.val < q.val: return self.lowestCommonAncestor(root.right, p, q) # 否则,当前节点就是最近公共祖先 return root

迭代实现

# Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': # 迭代遍历 while root: # 如果当前节点的值大于 p 和 q 的值,遍历左子树 if root.val > p.val and root.val > q.val: root = root.left # 如果当前节点的值小于 p 和 q 的值,遍历右子树 elif root.val < p.val and root.val < q.val: root = root.right # 否则,当前节点就是最近公共祖先 else: return root return None

代码解析

递归实现

  1. 比较节点值:如果当前节点的值大于 p 和 q 的值,说明 p 和 q 都在左子树中,递归遍历左子树。
  2. 比较节点值:如果当前节点的值小于 p 和 q 的值,说明 p 和 q 都在右子树中,递归遍历右子树。
  3. 返回结果:否则,当前节点就是 p 和 q 的最近公共祖先。

迭代实现

  1. 初始化:从根节点开始遍历。
  2. 循环遍历
    • 如果当前节点的值大于 p 和 q 的值,遍历左子树。
    • 如果当前节点的值小于 p 和 q 的值,遍历右子树。
    • 否则,当前节点就是最近公共祖先,返回当前节点。
  3. 返回结果:如果循环结束,返回None

实战技巧

利用二叉搜索树的特性

  • 有序性:二叉搜索树的中序遍历是有序的,利用这一特性可以快速定位节点的位置。
  • 递归与迭代:递归实现代码简洁,迭代实现避免了递归栈溢出的问题。

边界条件处理

  • 空树:如果树为空,返回None
  • 节点在根节点:如果其中一个节点是根节点,那么根节点就是最近公共祖先。

错误分析

常见错误

  1. 递归终止条件错误:忘记处理递归的终止条件,导致递归无法终止。
  2. 节点值比较错误:在比较节点值时,逻辑判断错误。
  3. 迭代循环条件错误:在迭代实现中,循环条件设置错误,导致无限循环。

扩展思考

变种问题

  1. 二叉树的最近公共祖先:不利用二叉搜索树的特性,查找二叉树的最近公共祖先。
  2. N 叉树的最近公共祖先:将二叉树扩展为 N 叉树,查找最近公共祖先。
  3. 多个节点的最近公共祖先:查找多个节点的最近公共祖先。

应用场景

最近公共祖先问题在以下场景中有着广泛的应用:

  • 树的操作:在树结构中查找节点之间的关系。
  • 基因alogy:在家族树中查找共同祖先。
  • 网络分析:在网络拓扑中查找节点之间的关系。

个人实践感悟

最近在准备转正答辩,每天被各种算法题和合并冲突吓醒,救命!今天刷到这个经典的二叉搜索树的最近公共祖先问题,突然想到刚实习时第一次写这个题的场景。当时我还不知道利用二叉搜索树的特性,直接用了二叉树的最近公共祖先的解法,被mentor嘲笑了一整天,麻了!

现在再看这个问题,其实关键在于利用二叉搜索树的特性。通过比较节点值的大小,可以快速定位 p 和 q 的位置,从而找到最近公共祖先。这让我意识到,算法的学习真的是一个循序渐进的过程,从一无所知到熟练掌握,需要不断地练习和总结。

最后,分享一个小技巧:在面试中遇到二叉搜索树的问题,首先要想到利用其特性进行优化。二叉搜索树的有序性可以帮助我们快速定位节点的位置,从而提高算法的效率。这就是大佬吗?我也要成为这样的人!

输入输出示例

输入输出示例 1

输入:

root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8

输出:

6
输入输出示例 2

输入:

root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4

输出:

2
输入输出示例 3

输入:

root = [2,1], p = 2, q = 1

输出:

2

结语:二叉搜索树的最近公共祖先问题是树算法中的经典问题,掌握它不仅有助于解决相关的LeetCode问题,也能帮助我们更好地理解二叉搜索树的特性。希望这篇文章对大家有所帮助,祝大家刷题愉快!

http://www.jsqmd.com/news/544998/

相关文章:

  • 导师不管、方向太多、不知道做什么?计算机毕设选题全攻略
  • 告别眼疲劳:3步打造专业夜间浏览护眼工具
  • 【图像加密解密】基于Halton 序列图像加密解密位置扰乱和像素扰乱(含相关性分析)附Matlab代码
  • 2026年热熔胶膜厂家推荐:石狮佳南热熔胶有限公司,鞋材/箱包/服装/汽车等多领域胶膜供应 - 品牌推荐官
  • 焕新B站体验:BewlyBewly如何通过界面重构颠覆你的浏览习惯
  • FindSomething:革新性网页智能信息提取工具完全指南
  • OpenSC智能卡工具实战指南:从架构解析到高级配置
  • 2026全球AI康养产业高峰论坛圆满举办 吉姆罗杰斯领衔众企业家出席 - 行业深度观察
  • RTX 4090D 24G部署PyTorch 2.8镜像实操手册:/workspace与/data盘高效协同指南
  • 2026年现浇水渠成型机厂家推荐:郑州玉元机械设备渠道衬砌机/水渠滑模机/护坡整平机全系解决方案 - 品牌推荐官
  • 在Linux服务器上配置IPv6 SSH远程访问:从环境准备到连接验证
  • 3大创新让你的设备静如耳语:智能风扇控制技术全解析
  • 2026年土工膜厂家实力推荐:德州悦润新材料复合/糙面/光面/HDPE/LLDPE土工膜全系供应 - 品牌推荐官
  • 2026年兽用DR设备厂家推荐:河南佳信电子科技,牛马/犬猫/畜牧兽医DR系统全覆盖 - 品牌推荐官
  • 用ADS2023手把手仿真SKYWORKS SMA1234变容二极管:从Datasheet到S参数结果全流程
  • 3步实现DBeaver驱动管理效率提升方案:从混乱到统一的数据库连接革命
  • OpenClaw技能开发:为Qwen3.5-4B-Claude定制技术面试题库
  • UReport2实战:如何优雅地导出多Sheet页报表(动态/静态分页全解析)
  • 中医主治备考:机构怎么选更靠谱 - 医考机构品牌测评专家
  • 2026年冷库/流利式/模具/穿梭车/阁楼/密集柜/线棒/重型仓储货架厂家推荐:诺力货架制造有限公司 - 品牌推荐官
  • 2026年工业/工程/建筑钢格板厂家推荐:寅融丝网制品有限公司全系产品供应 - 品牌推荐官
  • 开源生态贡献:将优化后的BERT文本分割模型提交至Hugging Face
  • 如何理解高内聚、低耦合(附C#代码案例)
  • 如何快速掌握Windows系统权限管理:NSudo终极指南
  • Windows系统权限管理的终极解决方案:NSudo完全指南
  • 主管药师真题,哪家解析更通透? - 医考机构品牌测评专家
  • 告别PS!用WPS宏批量改图片尺寸的隐藏技巧(附JSA API避坑指南)
  • 终极AutoGen多智能体框架实战指南:5步构建企业级AI协作系统
  • GLM-OCR开发者实操手册:Gradio client调用+批量图片识别脚本示例
  • 2026年自动焊接机厂家推荐:上海锐巨机电设备有限公司,管管/管板/黄铜焊接机全系覆盖 - 品牌推荐官