LeetCode236-二叉树的最近公共祖先

题目链接

英文链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/

中文链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

题目详述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

img

示例 1:

1
2
3
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:

1
2
3
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

题目详解

LCA 问题。

  • 如果 root 为 null,直接返回 null即可。
  • 如果 root == p ,说明 root 就是 p 和 q 的最近公共祖先,返回 root 即可。
  • 同理 root == q ,说明 root 就是 p 和 q 的最近公共祖先,返回 root 即可。
  • 然后问题转化为两个子问题,在 root 的左子树和右子树中查找 p 和 q 的最近公共祖先。
  • 由于 p、q 为不同结点且均存在于给定的二叉树中,不存在两者返回值均为 null 的情况。
  • 若在左子树中查找返回值为 null,在右子树中查找返回值不为 null,说明左子树中不存在 p 或 q 结点,最近公共祖先在右子树中。
  • 若在右子树中查找返回值为 null,在左子树中查找返回值不为 null,说明右子树中不存在 p 或 q 结点,最近公共祖先在左子树中。
  • 若在左右子树中查找返回值均不为 null,说明 p 和 q 两个结点交叉分布在左右子树中,最近公共祖先为 root。
1
2
3
4
5
6
7
8
9
10
11
public class LeetCode_00236 {

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);
return left == null ? right : right == null ? left : root;
}
}