236_二叉树的最近公共祖先[MEDIUM]
约 311 字大约 1 分钟
2026-03-22
给定一个二叉树, 找到该树中两个指定节点(p、q)的最近公共祖先。
示例 1: 
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2: 
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。解题思路
利用 后续遍历+深度优先搜索,在遍历过程中自底向上地向父节点汇报:“我在我的子树里找到了 p 吗?找到了 q 吗?”
- 如果左右都找到了,说明当前节点就是要找的
- 如果左边没有找到,那肯定在右边,反之亦然
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);
if (left != null && right != null){
return root;
}
return (left != null) ? left : right;
}