LeetCode 236. Lowest Common Ancestor of a Binary Tree

Question

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Example 1:

img

1
2
3
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.

Example 2:

img

1
2
3
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

Example 3:

1
2
Input: root = [1,2], p = 1, q = 2
Output: 1

Constraints:

  • The number of nodes in the tree is in the range [2, 105].
  • -109 <= Node.val <= 109
  • All Node.val are unique.
  • p != q
  • p and q will exist in the tree.

Source: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/

Solution

DFS. Use the return value of recursive function to reflect the existence of p, q and their lowest common ancestor. The following implementation is feasible but no recommended, because the return value has multiple meanings.

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
38
static class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

// one important prerequisite is that p and q must be in the whole tree
// the return value has multiple meanings (NOT a good design):
// if null, neither p nor q exists in the tree of root;
// if not null, at least one of p and q exists in the tree of root,
// if p and q exist in the left and right subtree of root respectively, return root itself.
// because in this case, root is the lowest common ancestor
private TreeNode dfs(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || root == p || root == q) {
return root;
}

TreeNode leftResult = dfs(root.left, p, q);
TreeNode rightResult = dfs(root.right, p, q);

if (leftResult != null && rightResult != null) { // root is the lowest common ancestor
return root;
} else if (leftResult != null) {
return leftResult;
} else if (rightResult != null) {
return rightResult;
} else {
return null;
}
}

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return dfs(root, p, q);
}
Author

Weihao Ye

Posted on

2022-03-08

Updated on

2022-03-09

Licensed under