Least Common Ancestor
Find the lowest common ancestor in an unordered binary tree given two values in the tree.
Lowest common ancestor : the lowest common ancestor (LCA) of two nodes
v
andw
in a tree or directed acyclic graph (DAG) is the lowest (i.e. deepest) node that has bothv
andw
as descendants.
Example :
_______3______
/ \
___5__ ___1__
/ \ / \
6 _2_ 0 8
/ \
7 4
For the above tree, the LCA of nodes 5
and 1
is 3
.
LCA = Lowest common ancestor
Please note that LCA for nodes 5
and 4
is 5
.
You are given 2 values. Find the lowest common ancestor of the two nodes represented by
val1
andval2
No guarantee that
val1
andval2
exist in the tree. If one value doesn’t exist in the tree then return -1.There are no duplicate values.
You can use extra memory, helper functions, and can modify the node struct but, you can’t add a parent pointer.
class Solution {
boolean foundP = false;
boolean foundQ = false;
public int lowestCommonAncestor(TreeNode root, int p, int q) {
if (root == null)
return -1;
if (root.val == p || root.val == q) {
foundP = root.val == p ? true : foundP;
foundQ = root.val == q ? true : foundQ;
}
int left = lowestCommonAncestor(root.left, p, q);
int right = lowestCommonAncestor(root.right, p, q);
if (root.val == p || root.val == q) {
return root.val;
} else {
if (left != -1 && right != -1)
return root.val;
else if (left != -1)
return left;
else if (right != -1)
return right;
return -1;
}
}
public int lca(TreeNode root, int p, int q) {
foundP = false;
foundQ = false;
int ans = lowestCommonAncestor(root, p, q);
if (foundP && foundQ)
return ans;
return -1;
}
}
Last updated