Related Articles

# Lowest Common Ancestor in Parent Array Representation

• Difficulty Level : Easy
• Last Updated : 16 Jun, 2021

Given a binary tree represented as parent array, find Lowest Common Ancestor between two nodes ‘m’ and ‘n’. In the above diagram, LCA of 10 and 14 is 12 and LCA of 10 and 12 is 12.

(1) Make a parent array and store the parent of ith node in it. Parent of root node should be -1.
(2) Now, access all the nodes from the desired node ‘m’ till root node and mark them visited.
(3) Lastly, access all the nodes from the desired node ‘n’ till first visited node comes.
(4) This node is the lowest common ancestor

## C++

 `// CPP program to find LCA in a tree represented``// as parent array.``#include ``using` `namespace` `std;` `// Maximum value in a node``const` `int` `MAX = 1000;` `// Function to find the Lowest common ancestor``int` `findLCA(``int` `n1, ``int` `n2, ``int` `parent[])``{``    ``// Create a visited vector and mark``    ``// all nodes as not visited.``    ``vector<``bool``> visited(MAX, ``false``);` `    ``visited[n1] = ``true``;` `    ``// Moving from n1 node till root and``    ``// mark every accessed node as visited``    ``while` `(parent[n1] != -1) {``        ``visited[n1] = ``true``;` `        ``// Move to the parent of node n1``        ``n1 = parent[n1];``    ``}` `    ``visited[n1] = ``true``;` `    ``// For second node finding the first``    ``// node common``    ``while` `(!visited[n2])``        ``n2 = parent[n2];` `    ``return` `n2;``}` `// Insert function for Binary tree``void` `insertAdj(``int` `parent[], ``int` `i, ``int` `j)``{``    ``parent[i] = j;``}` `// Driver Function``int` `main()``{``    ``// Maximum capacity of binary tree``    ``int` `parent[MAX];` `    ``// Root marked``    ``parent = -1;``    ``insertAdj(parent, 8, 20);``    ``insertAdj(parent, 22, 20);``    ``insertAdj(parent, 4, 8);``    ``insertAdj(parent, 12, 8);``    ``insertAdj(parent, 10, 12);``    ``insertAdj(parent, 14, 12);` `    ``cout << findLCA(10, 14, parent);` `    ``return` `0;``}`

## Java

 `// Java program to find LCA in a tree represented``// as parent array.``import` `java.util.*;` `class` `GFG``{` `// Maximum value in a node``static` `int` `MAX = ``1000``;` `// Function to find the Lowest common ancestor``static` `int` `findLCA(``int` `n1, ``int` `n2, ``int` `parent[])``{``    ``// Create a visited vector and mark``    ``// all nodes as not visited.``    ``boolean` `[]visited = ``new` `boolean``[MAX];` `    ``visited[n1] = ``true``;` `    ``// Moving from n1 node till root and``    ``// mark every accessed node as visited``    ``while` `(parent[n1] != -``1``)``    ``{``        ``visited[n1] = ``true``;` `        ``// Move to the parent of node n1``        ``n1 = parent[n1];``    ``}` `    ``visited[n1] = ``true``;` `    ``// For second node finding the first``    ``// node common``    ``while` `(!visited[n2])``        ``n2 = parent[n2];` `    ``return` `n2;``}` `// Insert function for Binary tree``static` `void` `insertAdj(``int` `parent[], ``int` `i, ``int` `j)``{``    ``parent[i] = j;``}` `// Driver Function``public` `static` `void` `main(String[] args)``{``    ``// Maximum capacity of binary tree``    ``int` `[]parent = ``new` `int``[MAX];` `    ``// Root marked``    ``parent[``20``] = -``1``;``    ``insertAdj(parent, ``8``, ``20``);``    ``insertAdj(parent, ``22``, ``20``);``    ``insertAdj(parent, ``4``, ``8``);``    ``insertAdj(parent, ``12``, ``8``);``    ``insertAdj(parent, ``10``, ``12``);``    ``insertAdj(parent, ``14``, ``12``);` `    ``System.out.println(findLCA(``10``, ``14``, parent));``}``}` `// This code is contributed by 29AjayKumar`

## Python3

 `# Python 3 program to find LCA in a``# tree represented as parent array.` `# Maximum value in a node``MAX` `=` `1000` `# Function to find the Lowest``# common ancestor``def` `findLCA(n1, n2, parent):``    ` `    ``# Create a visited vector and mark``    ``# all nodes as not visited.``    ``visited ``=` `[``False` `for` `i ``in` `range``(``MAX``)]` `    ``visited[n1] ``=` `True` `    ``# Moving from n1 node till root and``    ``# mark every accessed node as visited``    ``while` `(parent[n1] !``=` `-``1``):``        ``visited[n1] ``=` `True` `        ``# Move to the parent of node n1``        ``n1 ``=` `parent[n1]` `    ``visited[n1] ``=` `True` `    ``# For second node finding the``    ``# first node common``    ``while` `(visited[n2] ``=``=` `False``):``        ``n2 ``=` `parent[n2]` `    ``return` `n2` `# Insert function for Binary tree``def` `insertAdj(parent, i, j):``    ``parent[i] ``=` `j` `# Driver Code``if` `__name__ ``=``=``'__main__'``:``    ` `    ``# Maximum capacity of binary tree``    ``parent ``=` `[``0` `for` `i ``in` `range``(``MAX``)]` `    ``# Root marked``    ``parent[``20``] ``=` `-``1``    ``insertAdj(parent, ``8``, ``20``)``    ``insertAdj(parent, ``22``, ``20``)``    ``insertAdj(parent, ``4``, ``8``)``    ``insertAdj(parent, ``12``, ``8``)``    ``insertAdj(parent, ``10``, ``12``)``    ``insertAdj(parent, ``14``, ``12``)` `    ``print``(findLCA(``10``, ``14``, parent))``    ` `# This code is contributed by``# Surendra_Gangwar`

## C#

 `// C# program to find LCA in a tree represented``// as parent array.``using` `System;` `class` `GFG``{` `// Maximum value in a node``static` `int` `MAX = 1000;` `// Function to find the Lowest common ancestor``static` `int` `findLCA(``int` `n1, ``int` `n2, ``int` `[]parent)``{``    ``// Create a visited vector and mark``    ``// all nodes as not visited.``    ``Boolean []visited = ``new` `Boolean[MAX];` `    ``visited[n1] = ``true``;` `    ``// Moving from n1 node till root and``    ``// mark every accessed node as visited``    ``while` `(parent[n1] != -1)``    ``{``        ``visited[n1] = ``true``;` `        ``// Move to the parent of node n1``        ``n1 = parent[n1];``    ``}` `    ``visited[n1] = ``true``;` `    ``// For second node finding the first``    ``// node common``    ``while` `(!visited[n2])``        ``n2 = parent[n2];` `    ``return` `n2;``}` `// Insert function for Binary tree``static` `void` `insertAdj(``int` `[]parent, ``int` `i, ``int` `j)``{``    ``parent[i] = j;``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``    ``// Maximum capacity of binary tree``    ``int` `[]parent = ``new` `int``[MAX];` `    ``// Root marked``    ``parent = -1;``    ``insertAdj(parent, 8, 20);``    ``insertAdj(parent, 22, 20);``    ``insertAdj(parent, 4, 8);``    ``insertAdj(parent, 12, 8);``    ``insertAdj(parent, 10, 12);``    ``insertAdj(parent, 14, 12);` `    ``Console.WriteLine(findLCA(10, 14, parent));``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Time Complexity – The time complexity of the above algorithm is O(log n) as it requires O(log n) time in searching.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up