Microsoft Interview Question Software Engineer in Tests
0of 0 votesGiven an n-ary tree, find the closest common ancestor ? Discuss the time complexity and write testcases.
Country: United States
class FindClosestCommonAncestorNaryTree
{
public Node Solve(Node tree, Node node1, Node node2)
{
List<Node> ancestors1 = new List<Node>();
List<Node> ancestors2 = new List<Node>();
tree.GetAncestorsOf(node1, ref ancestors1);
tree.GetAncestorsOf(node2, ref ancestors2);
foreach (Node n1 in ancestors1)
{
foreach (Node n2 in ancestors2)
{
if (n1 == n2)
{
return n1;
}
}
}
return null;
}
}
public class Node
{
public int data;
public List<Node> children = null;
public Node(int _data, List<Node> _children)
{
data = _data;
children = _children;
}
internal bool GetAncestorsOf(Node node, ref List<Node> ancestors)
{
if (this == node)
{
return true;
}
if (children != null)
{
foreach (Node child in children)
{
if (child.GetAncestorsOf(node, ref ancestors))
{
ancestors.Add(this);
return true;
}
}
}
return false;
}
}
get ancestor list of both nodes n1 and n2.
compare top ancestor of n1 with top ancestor of n2.
if equal, got to the a level below of ancestor for n1 & n2 and compare in iterative manner.
at some point, either they will not be equal or one of the ancestor will be null.
return the previous compared ancestor.
Pretty much the same as LCA of a BST, we just need to traverse all children.
Node LCA(Node a, Node b, Node root)
{
if(a == root || b == root)
return root;
int count = 0;
Node temp = null;
for(Node iter : root.children)
{
Node res = LCA(a, b, iter);
if(res != null)
{
count++;
temp = res;
}
}
if(count == 2)
return root;
return temp;
}

http{://}community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor
- dabbcomputers on April 24, 2012 Edit | Flag Reply