【忍者算法】从家族树到二叉树:深入解析最近公共祖先问题|LeetCode 236 二叉树的最近公共祖先
从生活场景理解LCA
想象你在整理家族族谱时,需要找到两位家族成员的最近共同祖先。比如小明和小红,他们的最近共同祖父可能不是年龄最大的祖先,而是离他们最近的共同长辈。在计算机科学中,二叉树中的最近公共祖先(LCA)问题与此如出一辙。
问题解析
LeetCode第236题要求:给定一个二叉树和两个节点p、q,找到这两个节点在树中的最近公共祖先。注意:
- 节点可以是自身的祖先
- p和q都存在于二叉树中
- 所有节点值唯一
递归法:优雅的分治策略
递归思路分解
我们可以把问题分解为三个层次来思考:
- 当前节点是否是p或q?
- 目标节点是否在左子树?
- 目标节点是否在右子树?
当出现以下情况之一时,当前节点就是LCA:
- p和q分别位于左右子树(即左右递归都返回非空)
- 当前节点是p/q,且另一个