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:
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:
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:
Input: root = [1,2], p = 1, q = 2 Output: 1
Constraints:
- The number of nodes in the tree is in the range
[2, 10^5]
. -10^9 <= Node.val <= 10^9
- All
Node.val
are unique. p != q
p
andq
will exist in the tree.
Solution:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return root;
}
//If the current node is either `p` or `q`, return the current node (`root`) because
//one of the nodes to be found is encountered,
//**** baaki doosra node toh kisi na kisi sub-tree mei hoga hi.. Jo pehle mila woh King.
if(root.val == p.val || root.val == q.val){
return root;
}
TreeNode lA = lowestCommonAncestor(root.left, p, q);
TreeNode rA = lowestCommonAncestor(root.right, p, q);
//If both left and right recursive calls return non-null values,
//it means `p` and `q` are found in different subtrees of the current
//node (`root`). Hence, the current node is their lowest common ancestor.
if(lA != null && rA != null) return root;
//If only one of the left or right recursive calls returns a non-null value,
//it means both `p` and `q` are located in that subtree.
//Therefore, return the non-null value.
return lA == null ? rA : lA;
}
}