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

二叉查找树 —— 最近公共祖先问题解析(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.lqws.cn/news/73369.html

相关文章:

  • SCAU8642--快速排序
  • 计算机视觉---深度学习框架(Backbone、Neck、Head)
  • 每日算法-250602
  • Windows+VSCode搭建小智(xiaozhi)开发环境
  • 开源的JT1078转GB28181服务器
  • PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)
  • 【Spring】RAG 知识库基础
  • Axure 基础入门
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
  • 自主设计一个DDS信号发生器
  • 每天掌握一个Linux命令 - hping3
  • 工作流引擎-16-开源审批流项目之 整合Flowable官方的Rest包
  • NiceGUI 是一个基于 Python 的现代 Web 应用框架
  • Windows10-ltsc-2019 使用 PowerShell 安装安装TranslucentTB教程(不通过微软商店安装)
  • Qt概述:基础组件的使用
  • 动态类型语言和静态类型语言
  • 【MySQL基础】库的操作:创建、删除与管理数据库
  • [ Qt ] | 与系统相关的操作(一):鼠标相关事件
  • 分布式锁优化:使用Lua脚本保证释放锁的原子性问题
  • 网络安全的学习路线是怎么样的?
  • 【C语言】C语言经典小游戏:贪吃蛇(下)
  • 用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?
  • 【iOS】YYModel源码解析
  • Git GitHub Gitee
  • ISBN书号查询接口如何用PHP实现调用?
  • 房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块
  • Python训练营打卡 Day26
  • JavaScript性能优化:实战技巧提升10倍速度
  • 2025年—Comfy UI 和 Stable Diffusion底层原理
  • docker可视化工具