1. 二叉树最近公共祖先问题解析
最近在刷LeetCode热题100时遇到了"二叉树的最近公共祖先"这道经典题目,作为树类问题的典型代表,它在面试中出现频率极高。今天我就结合自己的解题经历,详细拆解这个问题,分享从问题理解到代码实现的全过程。
所谓最近公共祖先(Lowest Common Ancestor),是指在一个树结构中,两个节点的共同祖先中深度最大的那个节点。这个概念在计算机科学中有着广泛的应用场景,比如在版本控制系统中寻找两个分支的合并点,或者在家谱分析中查找两个人的最近共同祖先。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题理解与示例分析
2.1 题目要求详解
题目给定一个二叉树和该树中的两个节点p和q,要求找到它们的最近公共祖先。根据定义,我们需要明确几个关键点:
- 祖先节点的定义:一个节点可以是它自己的祖先
- 公共祖先:既是p的祖先,又是q的祖先的节点
- 最近:在所有公共祖先中深度最大的那个
2.2 示例场景解析
让我们仔细分析题目给出的三个示例:
示例1中,节点5和1的LCA是3。这是因为:
- 5的祖先路径:5→3
- 1的祖先路径:1→3
- 共同祖先只有3
示例2展示了节点可以是自身祖先的情况:
- 5的祖先路径:5→3
- 4的祖先路径:4→2→5→3
- 共同祖先有5和3,其中5深度更大
示例3是最简单的情况:
- 1的祖先就是它自己
- 2的祖先路径:2→1
- 共同祖先是1
3. 解题思路与算法设计
3.1 递归思路解析
解决这个问题最直观的方法是递归遍历。基本思路是:
- 从根节点开始遍历整棵树
- 如果当前节点是p或q,则返回当前节点
- 分别在左右子树中递归查找p和q
- 根据左右子树的查找结果决定返回值:
- 如果左右都找到节点,说明当前节点就是LCA
- 如果只有一边找到,返回找到的结果
- 如果两边都没找到,返回nullptr
这种方法的精妙之处在于它利用了递归的后序遍历特性,自底向上地寻找LCA。
3.2 时间复杂度分析
该算法的时间复杂度是O(n),其中n是树中的节点数。这是因为在最坏情况下(比如p和q位于树的最右侧),我们需要访问每个节点一次。
空间复杂度取决于递归栈的深度,最坏情况下(树退化为链表)是
