题目地址

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目概述

isBalanceTree

题目分析

  1. 递归结束条件:返回节点为空时结束递归
  2. 根据题目可以得知p、q节点分布存在三种情况:
    1. p q 一个在左子树 一个在右子树 那么当前节点即是最近公共祖先(即根节点root)
    2. p q 都在左子树 (先被找到的即为最近父节点)
    3. p q 都在右子树
  3. 递归返回:无返回

题目解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
/**
* 二叉树的最近公共祖先
* 思路:
* 三种情况:
* 1、p q 一个在左子树 一个在右子树 那么当前节点即是最近公共祖先
* 2、p q 都在左子树
* 3、p q 都在右子树
* @param root
* @param p
* @param q
* @return
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return null;
}
if (root.val == p.val || root.val == q.val) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
if (left != null && right != null) {
// p q 一个在左,一个在右
return root;
}
if (left != null) {
// p q 都在左子树
return left;
}
if (right != null) {
// p q 都在右子树
return right;
}
return null;
}
}