🏠个人主页:尘觉主页
文章目录
- 普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
- 🧠 问题理解
- 普通二叉树与 BST 的区别:
- 💡 解题思路
- 关键思想:
- 📌 举个例子:
- 🔍 图示解析
- ✅ Java 实现
- 🛠️ 核心判断逻辑:
- 🚀 时间复杂度分析
- 📝 总结
普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
在上一节中我们学习了如何在二叉查找树(BST)中寻找两个节点的最近公共祖先(Lowest Common Ancestor,简称 LCA)。
本节我们将进一步拓展到普通二叉树的场景,即无序结构的树,这就不能再依赖节点的大小关系进行剪枝优化了。
本文将结合 Leetcode 第 236 题 Lowest Common Ancestor of a Binary Tree,分析如何在任意二叉树中寻找两个节点的最近公共祖先。
🧠 问题理解
题目描述:
给定一棵二叉树的根节点 root
和两个节点 p
和 q
,请找出它们的最近公共祖先。
普通二叉树与 BST 的区别:
- 普通二叉树不具备节点值的有序性。
- 所以不能通过节点值大小来判断节点在左子树还是右子树,只能遍历整个结构。
💡 解题思路
我们可以采用后序遍历(Post-order Traversal)+ 递归回溯的方法来解决这个问题。
关键思想:
-
如果当前节点是空,直接返回 null;
-
如果当前节点就是
p
或q
,说明找到了目标节点之一,直接返回当前节点; -
否则分别递归左右子树查找
p
和q
;- 如果左右子树递归结果都非空,说明当前节点是最近公共祖先;
- 如果有一个子树非空,返回非空子树的结果;
- 如果两个子树都为空,返回 null。
📌 举个例子:
- 左子树找到
p
,右子树找到q
,那么当前节点就是最近公共祖先; - 左右子树只有一个有结果,说明两个节点都位于那一侧;
🔍 图示解析

如图所示,若我们查找节点 5 和 1 的最近公共祖先,从根节点 3 出发,左子树返回 5,右子树返回 1,两个都非空,因此节点 3 就是 LCA。
✅ Java 实现
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q)
return root;
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
return left == null ? right : right == null ? left : root;
}
🛠️ 核心判断逻辑:
return left == null ? right : right == null ? left : root;
这行代码的含义是:
- 若左为空,说明 p 和 q 都在右子树;
- 若右为空,说明 p 和 q 都在左子树;
- 若左右都不为空,说明当前节点为最近公共祖先。
🚀 时间复杂度分析
- 时间复杂度:O(n),需要遍历整棵树;
- 空间复杂度:O(h),递归栈深度,
h
为树的高度,最坏为 O(n)。
📝 总结
普通二叉树中寻找最近公共祖先,不再依赖节点值的有序性,而是完全依靠递归回溯地查找两个目标节点的位置,再根据左右子树的返回值来判断 LCA。
🌱 思考建议:本题的核心思想——“在左右子树分别查找目标节点”是树结构常见的递归套路,掌握后可以类比解决其他二叉树相关的问题。
欢迎点赞 👍、收藏 ⭐、评论 💬 支持,后续我将持续分享更多高频面试题与 Leetcode 解题技巧!
如果你需要该文章的 Markdown 格式或想继续深入如 N 个节点的最近公共祖先问题,也欢迎留言讨论!
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
手写机制
微服务组件
spring_尘觉
springMVC
mybits
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞