Lowest Common Ancestor in Parent Array Representation
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.
- Make a parent array and store the parent of ith node in it. Parent of root node should be -1.
- Now, access all the nodes from the desired node ‘m’ till root node and mark them visited.
- Lastly, access all the nodes from the desired node ‘n’ till first visited node comes.
- This node is the lowest common ancestor
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
int findLCA( int n1, int n2, int parent[])
{
vector< bool > visited(MAX, false );
visited[n1] = true ;
while (parent[n1] != -1) {
visited[n1] = true ;
n1 = parent[n1];
}
visited[n1] = true ;
while (!visited[n2])
n2 = parent[n2];
return n2;
}
void insertAdj( int parent[], int i, int j)
{
parent[i] = j;
}
int main()
{
int parent[MAX];
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);
cout << findLCA(10, 14, parent);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX = 1000 ;
static int findLCA( int n1, int n2, int parent[])
{
boolean []visited = new boolean [MAX];
visited[n1] = true ;
while (parent[n1] != - 1 )
{
visited[n1] = true ;
n1 = parent[n1];
}
visited[n1] = true ;
while (!visited[n2])
n2 = parent[n2];
return n2;
}
static void insertAdj( int parent[], int i, int j)
{
parent[i] = j;
}
public static void main(String[] args)
{
int []parent = new int [MAX];
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));
}
}
|
Python3
MAX = 1000
def findLCA(n1, n2, parent):
visited = [ False for i in range ( MAX )]
visited[n1] = True
while (parent[n1] ! = - 1 ):
visited[n1] = True
n1 = parent[n1]
visited[n1] = True
while (visited[n2] = = False ):
n2 = parent[n2]
return n2
def insertAdj(parent, i, j):
parent[i] = j
if __name__ = = '__main__' :
parent = [ 0 for i in range ( MAX )]
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))
|
C#
using System;
class GFG
{
static int MAX = 1000;
static int findLCA( int n1, int n2, int []parent)
{
Boolean []visited = new Boolean[MAX];
visited[n1] = true ;
while (parent[n1] != -1)
{
visited[n1] = true ;
n1 = parent[n1];
}
visited[n1] = true ;
while (!visited[n2])
n2 = parent[n2];
return n2;
}
static void insertAdj( int []parent, int i, int j)
{
parent[i] = j;
}
public static void Main(String[] args)
{
int []parent = new int [MAX];
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);
Console.WriteLine(findLCA(10, 14, parent));
}
}
|
Javascript
<script>
const MAX = 1000;
function findLCA(n1, n2, parent) {
let visited = new Array(MAX).fill( false );
visited[n1] = true ;
while (parent[n1] != -1) {
visited[n1] = true ;
n1 = parent[n1];
}
visited[n1] = true ;
while (!visited[n2])
n2 = parent[n2];
return n2;
}
function insertAdj(parent, i, j) {
parent[i] = j;
}
let parent = new Array(MAX);
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);
document.write(findLCA(10, 14, parent));
</script>
|
Time Complexity: The time complexity of the above algorithm is O(log n) as it requires O(log n) time in searching.
Space Complexity: O(n),We create a boolean visited array of length n. Hence, the space complexity is O(n).
Last Updated :
01 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...