1. 二叉树最近公共祖先问题解析
最近公共祖先(Lowest Common Ancestor,简称LCA)是二叉树中的经典问题。给定一棵二叉树和两个节点p和q,找到这两个节点在树中的最近公共祖先。这个"最近"指的是深度最大的公共祖先节点。
举个例子,假设我们有以下二叉树:
code复制 3
/ \
5 1
/ \ / \
6 2 0 8
/ \
7 4
- 节点5和1的LCA是3
- 节点5和4的LCA是5
- 节点7和8的LCA是3
理解这个问题对于掌握树结构和递归算法非常重要,也是许多大厂面试的常见题目。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归解法思路详解
2.1 基础情况处理
递归算法的关键在于明确基础情况和递归情况。对于LCA问题,基础情况有三种:
- 当前节点为null:直接返回null,表示这条路径上没有找到p或q
- 当前节点就是p:返回p,表示找到了其中一个目标节点
- 当前节点就是q:返回q,表示找到了另一个目标节点
这三种情况可以统一处理:
java复制if(root == null || root == p || root == q) {
return root;
}
2.2 递归搜索左右子树
对于非基础情况,我们需要分别在左右子树中搜索p和q:
java复制TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
这里递归调用的含义是:分别在左子树和右子树中寻找p和q的LCA。注意这个定义是递归的,即子问题与原问题形式相同但规模更小。
2.3 结果分析与合并
得到左右子树的结果后,我们需要分析四种可能的情况:
- 左右子树都返回非null:说明当前节点就是LCA
- 左子树返回null,右子树非null:说明p和q都在右子树中
- 右子树返回null,左子树非null:说明p和q都在左子树中
- 左右子树都返回null:说明当前子树中不包含p或q
对应的代码实现:
java复制if(left != nul
