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

二叉查找树 —— 最近公共祖先问题解析(Leetcode 235)

🏠个人主页:尘觉主页

文章目录

  • 二叉查找树 —— 最近公共祖先问题解析(Leetcode 235)
    • 🧠 问题理解
      • 二叉查找树(BST)特点回顾:
    • 💡 解题思路
    • 🔍 图示解析
    • ✅ Java 实现
      • 🚀 时间复杂度分析:
    • 📝 总结

二叉查找树 —— 最近公共祖先问题解析(Leetcode 235)

在树结构中,寻找**两个节点的最近公共祖先(Lowest Common Ancestor, LCA)是一个常见的面试题目。而当这道题目出现在二叉查找树(BST)**中时,问题便可以更加高效地解决。

本文将结合 Leetcode 第 235 题 Lowest Common Ancestor of a Binary Search Tree,讲解 BST 中如何快速找出两个节点的最近公共祖先,并配以图示和代码解析。


🧠 问题理解

题目要求:
给定一棵二叉查找树(BST)和树中的两个节点 pq,找出它们的最近公共祖先节点。

二叉查找树(BST)特点回顾:

  • 对于任意一个节点 root

    • 左子树上所有节点的值都小于 root.val
    • 右子树上所有节点的值都大于 root.val

💡 解题思路

因为是 二叉查找树,我们可以利用其有序性来减少不必要的搜索,找到一个“分叉点”,这个点正是两个节点 pq 的最近公共祖先。

具体判断逻辑如下:

  • 如果当前节点 root.val 大于 p.valq.val,说明 pq 都在左子树中,继续在左子树递归查找;
  • 如果当前节点 root.val 小于 p.valq.val,说明 pq 都在右子树中,继续在右子树递归查找;
  • 如果 root.val 介于 p.valq.val 之间(即一个在左子树、一个在右子树,或者其中一个就是 root),那么 root 就是最近公共祖先。

📌 注意:为了避免顺序混乱,我们通常在判断前使用 pq 中的较小值、较大值进行比较。


🔍 图示解析

如图所示,在一个典型的 BST 中,若 p = 2q = 8,那么 6 是它们的最近公共祖先,因为从根节点 6 出发,p 在左子树,q 在右子树。


✅ Java 实现

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) return root;if (root.val > p.val && root.val > q.val)return lowestCommonAncestor(root.left, p, q);if (root.val < p.val && root.val < q.val)return lowestCommonAncestor(root.right, p, q);return root;
}

🚀 时间复杂度分析:

  • 最坏情况:树退化为链表时,时间复杂度为 O(n)
  • 最好情况:树为平衡 BST,时间复杂度为 O(log n)

📝 总结

在 BST 中找最近公共祖先问题,可以通过比较当前节点值与目标节点值之间的关系来快速定位“分叉点”,无需像普通二叉树那样回溯整棵树,提高了效率。

🌱 刷题建议:这道题不仅能帮助你掌握 BST 的基本性质,也能训练你在递归中灵活地做出剪枝判断。建议多次复盘本题,尝试手动画图分析。


如果你觉得这篇文章有帮助,欢迎点赞、收藏并分享给身边的小伙伴,也可以关注我获取更多刷题技巧与面试经验分享!🌟


😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

http://www.xdnf.cn/news/10670.html

相关文章:

  • 什么是绿电直连
  • ESP32之Linux编译环境搭建流程
  • 电脑wifi显示已禁用怎么点都无法启用
  • 浅谈量子计算:从实验室突破到产业落地的中国实践
  • Java详解LeetCode 热题 100(23):LeetCode 206. 反转链表(Reverse Linked List)详解
  • 使用pdm+uv替换poetry
  • 20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s
  • 安装 Hugo
  • Flask + Celery 应用
  • 【C++】23. unordered_map和unordered_set的使用
  • Qt OpenGL 光照实现
  • JAVA-springboot整合Mybatis
  • Linux 系统 Docker Compose 安装
  • Spring Cloud 2025 正式发布啦
  • Vue基础(12)_Vue.js循环语句用法:列表渲染
  • 超声波测距三大算法实测对比
  • 字节跳动开源图标库:2000+图标一键换肤的魔法
  • 深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
  • 5.RV1126-OPENCV 图形计算面积
  • Ubuntu22.04 安装 CUDA12.8
  • SQL Transactions(事务)、隔离机制
  • Python发送天气预报到企业微信解决方案
  • A. We Need the Zero
  • LangGraph framework
  • 《Linux 包管理实战手册:RPM 精准操作与 YUM 自动化部署从入门到精通》
  • 软件测评师 第9章 基于质量特性的测试与评价 笔记
  • SQL 中的 `CASE WHEN` 如何使用?
  • CUDA与OpenGL混合编程图形渲染
  • 【Python 算法零基础 4.排序 ⑦ 桶排序】
  • 【算法训练营Day05】哈希表part1