LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
📌 题目链接
💡 解题思路
一、BST 的核心性质
二叉搜索树满足:
左子树所有节点 < root.val < 右子树所有节点
因此:
- 若
p和q都小于当前节点 → LCA 在左子树 - 若
p和q都大于当前节点 → LCA 在右子树 - 否则,当前节点就是 最近公共祖先
二、解法一:迭代(推荐)
思路
- 从根节点开始向下移动
- 每次只走一条路径
- 不需要回溯,效率高
代码
java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root != null) {
if (root.val > p.val && root.val > q.val) {
root = root.left;
} else if (root.val < p.val && root.val < q.val) {
root = root.right;
} else {
return root;
}
}
return null;
}
}
复杂度分析
| 指标 | 复杂度 |
|---|---|
| 时间复杂度 | O(h) |
| 空间复杂度 | O(1) |
- 平衡 BST:
O(log n) - 链状 BST:
O(n)
三、解法二:递归(后序思想)
思路
- 利用 BST 性质递归搜索
- 若当前节点值大于
p、q,向左递归 - 若小于
p、q,向右递归 - 否则返回当前节点
代码
java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
if (root.val > p.val && root.val > q.val) {
TreeNode left = lowestCommonAncestor(root.left, p, q);
if (left != null) return left;
}
if (root.val < p.val && root.val < q.val) {
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (right != null) return right;
}
return root;
}
}
复杂度分析
| 指标 | 复杂度 |
|---|---|
| 时间复杂度 | O(h) |
| 空间复杂度 | O(h)(递归栈) |
🔍 两种解法对比
| 维度 | 迭代解法 | 递归解法 |
|---|---|---|
| 思路 | 向下搜索 | 自顶向下 |
| 是否回溯 | ❌ 否 | ✅ 是 |
| 空间复杂度 | O(1) | O(h) |
| 面试推荐 | ✅✅✅ | ✅✅ |
| 易错点 | 循环条件 | 递归终止 |
✅ 总结
- BST 的最大优势:剪枝
- 迭代写法是最优解,空间复杂度 O(1)
- 递归写法更符合"分治 / DFS 思维"
- 本题是 236 普通二叉树 LCA 的简化版
一句话总结:
BST 中,LCA 是第一个值介于 p 和 q 之间的节点。