Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Interview Problems on DP
  • Practice DP
  • MCQs on DP
  • Tutorial on Dynamic Programming
  • Optimal Substructure
  • Overlapping Subproblem
  • Memoization
  • Tabulation
  • Tabulation vs Memoization
  • 0/1 Knapsack
  • Unbounded Knapsack
  • Subset Sum
  • LCS
  • LIS
  • Coin Change
  • Word Break
  • Egg Dropping Puzzle
  • Matrix Chain Multiplication
  • Palindrome Partitioning
  • DP on Arrays
  • DP with Bitmasking
  • Digit DP
  • DP on Trees
  • DP on Graph
Open In App
Next Article:
Left View of a Binary Tree Using Stack
Next article icon

LCA in a tree using Binary Lifting Technique

Last Updated : 16 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a binary tree, the task is to find the Lowest Common Ancestor of the given two nodes in the tree. 
Let G be a tree then the LCA of two nodes u and v is defined as the node w in the tree which is an ancestor of both u and v and is farthest from the root node. If one node is the ancestor of another one then that particular node is the LCA of those two nodes. In particular, if we want to find the LCA of u and v, and if u is a parent of v, then u is their lowest common ancestor.

Example: 

Input: 

Output: 
The LCA of 6 and 9 is 1. 
The LCA of 5 and 9 is 1. 
The LCA of 6 and 8 is 3. 
The LCA of 6 and 1 is 1. 

Approach: The article describes an approach known as Binary Lifting to find the Lowest Common Ancestor of two nodes in a tree. There can be many approaches to solve the LCA problem. We are discussing the Binary Lifting Technique, the others can be read from here and here. 
Binary Lifting is a dynamic programming approach where we pre-compute an array memo[1, n][1, log(n)] where memo[i][j] contains 2^j-th ancestor of node i. For computing the values of memo[][], the following recursion may be used:

memo state:       memo[i][j] = i-th node's 2^(j)th ancestor in the path    memo initialization:       memo[i][j] = memo[i][0] (first parent (2^0) of each node is given)  memo trans:     memo[i][j] = memo[memo[i][j-1]][j-1]  meaning: A(i,2^j)=A( A(i , 2^(j-1) ) , 2^(j-1) )   To find the (2^j)-th ancestor of i, recursively find i-th node's 2^(j-1)th ancestor's 2^(j-1)th ancestor. (2^(j) = 2^(j-1) + 2^(j-1))  So:  memo[i][j] = parent[i] if j = 0 and  memo[i][j] = memo[memo[i][j - 1]][j - 1] if j > 0. 

We first check whether a node is an ancestor of another or not and if one node is ancestor of another then it is the LCA of these two nodes otherwise we find a node that is not the common ancestor of both u and v and is the highest(i.e. a node x such that x is not the common ancestor of u and v but memo[x][0] is) in the tree. After finding such a node (let it be x), we print the first ancestor of x i.e. memo[x][0] which will be the required LCA.

Below is the implementation of the above approach: 

C++
// C++ implementation of the approach  #include <bits/stdc++.h>  using namespace std;   // Pre-processing to calculate values of memo[][]  void dfs(int u, int p, int **memo, vector<int> &lev, int log, vector<int> *g)  {      // Using recursion formula to calculate      // the values of memo[][]      memo[u][0] = p;      for (int i = 1; i <= log; i++)          memo[u][i] = memo[memo[u][i - 1]][i - 1];      for (int v : g[u])      {          if (v != p)          {              lev[v] = lev[u] + 1;              dfs(v, u, memo, lev, log, g);          }      }  }   // Function to return the LCA of nodes u and v  int lca(int u, int v, int log, vector<int> &lev, int **memo)  {      // The node which is present farthest      // from the root node is taken as u      // If v is farther from root node      // then swap the two      if (lev[u] < lev[v])          swap(u, v);       // Finding the ancestor of u      // which is at same level as v      for (int i = log; i >= 0; i--)          if ((lev[u] - pow(2, i)) >= lev[v])              u = memo[u][i];       // If v is the ancestor of u      // then v is the LCA of u and v      if (u == v)          return u;       // Finding the node closest to the root which is      // not the common ancestor of u and v i.e. a node      // x such that x is not the common ancestor of u      // and v but memo[x][0] is      for (int i = log; i >= 0; i--)      {          if (memo[u][i] != memo[v][i])          {              u = memo[u][i];              v = memo[v][i];          }      }       // Returning the first ancestor      // of above found node      return memo[u][0];  }   // Driver Code  int main()  {      // Number of nodes      int n = 9;       // vector to store tree      vector<int> g[n + 1];       int log = (int)ceil(log2(n));      int **memo = new int *[n + 1];      for (int i = 0; i < n + 1; i++)          memo[i] = new int[log + 1];       // Stores the level of each node      vector<int> lev(n + 1);       // Initialising memo values with -1      for (int i = 0; i <= n; i++)          memset(memo[i], -1, sizeof memo[i]);       // Add edges      g[1].push_back(2);      g[2].push_back(1);      g[1].push_back(3);      g[3].push_back(1);      g[1].push_back(4);      g[4].push_back(1);      g[2].push_back(5);      g[5].push_back(2);      g[3].push_back(6);      g[6].push_back(3);      g[3].push_back(7);      g[7].push_back(3);      g[3].push_back(8);      g[8].push_back(3);      g[4].push_back(9);      g[9].push_back(4);      dfs(1, 1, memo, lev, log, g);      cout << "The LCA of 6 and 9 is " << lca(6, 9, log, lev, memo) << endl;      cout << "The LCA of 5 and 9 is " << lca(5, 9, log, lev, memo) << endl;      cout << "The LCA of 6 and 8 is " << lca(6, 8, log, lev, memo) << endl;      cout << "The LCA of 6 and 1 is " << lca(6, 1, log, lev, memo) << endl;       return 0;  }   // This code is contributed by  // sanjeev2552  
Java
// Java implementation of the approach  import java.util.*;  public class GFG {       // ArrayList to store tree      static ArrayList<Integer> g[];      static int memo[][], lev[], log;       // Pre-processing to calculate values of memo[][]      static void dfs(int u, int p)      {           // Using recursion formula to calculate          // the values of memo[][]          memo[u][0] = p;          for (int i = 1; i <= log; i++)              memo[u][i] = memo[memo[u][i - 1]][i - 1];          for (int v : g[u]) {              if (v != p) {                   // Calculating the level of each node                  lev[v] = lev[u] + 1;                  dfs(v, u);              }          }      }       // Function to return the LCA of nodes u and v      static int lca(int u, int v)      {          // The node which is present farthest          // from the root node is taken as u          // If v is farther from root node          // then swap the two          if (lev[u] < lev[v]) {              int temp = u;              u = v;              v = temp;          }           // Finding the ancestor of u          // which is at same level as v          for (int i = log; i >= 0; i--) {              if ((lev[u] - (int)Math.pow(2, i)) >= lev[v])                  u = memo[u][i];          }           // If v is the ancestor of u          // then v is the LCA of u and v          if (u == v)              return u;           // Finding the node closest to the root which is          // not the common ancestor of u and v i.e. a node          // x such that x is not the common ancestor of u          // and v but memo[x][0] is          for (int i = log; i >= 0; i--) {              if (memo[u][i] != memo[v][i]) {                  u = memo[u][i];                  v = memo[v][i];              }          }           // Returning the first ancestor          // of above found node          return memo[u][0];      }       // Driver code      public static void main(String args[])      {           // Number of nodes          int n = 9;          g = new ArrayList[n + 1];           // log(n) with base 2          log = (int)Math.ceil(Math.log(n) / Math.log(2));          memo = new int[n + 1][log + 1];           // Stores the level of each node          lev = new int[n + 1];           // Initialising memo values with -1          for (int i = 0; i <= n; i++)              Arrays.fill(memo[i], -1);          for (int i = 0; i <= n; i++)              g[i] = new ArrayList<>();           // Add edges          g[1].add(2);          g[2].add(1);          g[1].add(3);          g[3].add(1);          g[1].add(4);          g[4].add(1);          g[2].add(5);          g[5].add(2);          g[3].add(6);          g[6].add(3);          g[3].add(7);          g[7].add(3);          g[3].add(8);          g[8].add(3);          g[4].add(9);          g[9].add(4);          dfs(1, 1);          System.out.println("The LCA of 6 and 9 is " + lca(6, 9));          System.out.println("The LCA of 5 and 9 is " + lca(5, 9));          System.out.println("The LCA of 6 and 8 is " + lca(6, 8));          System.out.println("The LCA of 6 and 1 is " + lca(6, 1));      }  }  
Python
# Python3 implementation of the above approach  import math  # Pre-processing to calculate values of memo[][] def dfs(u, p, memo, lev, log, g):          # Using recursion formula to calculate      # the values of memo[][]      memo[u][0] = p     for i in range(1, log + 1):         memo[u][i] = memo[memo[u][i - 1]][i - 1]              for v in g[u]:         if v != p:             lev[v] = lev[u] + 1             dfs(v, u, memo, lev, log, g)  # Function to return the LCA of nodes u and v  def lca(u, v, log, lev, memo):          # The node which is present farthest      # from the root node is taken as u      # If v is farther from root node      # then swap the two      if lev[u] < lev[v]:         swap(u, v)              # Finding the ancestor of u      # which is at same level as v      for i in range(log, -1, -1):         if (lev[u] - pow(2, i)) >= lev[v]:             u = memo[u][i]                  # If v is the ancestor of u      # then v is the LCA of u and v              if u == v:         return v              # Finding the node closest to the      # root which is not the common ancestor     # of u and v i.e. a node x such that x     # is not the common ancestor of u      # and v but memo[x][0] is      for i in range(log, -1, -1):         if memo[u][i] != memo[v][i]:             u = memo[u][i]             v = memo[v][i]          # Returning the first ancestor      # of above found node              return memo[u][0]  # Driver code   # Number of nodes  n = 9  log = math.ceil(math.log(n, 2)) g = [[] for i in range(n + 1)]  memo = [[-1 for i in range(log + 1)]              for j in range(n + 1)]  # Stores the level of each node              lev = [0 for i in range(n + 1)]  # Add edges  g[1].append(2) g[2].append(1) g[1].append(3) g[3].append(1) g[1].append(4) g[4].append(1) g[2].append(5) g[5].append(2) g[3].append(6) g[6].append(3) g[3].append(7) g[7].append(3) g[3].append(8) g[8].append(3) g[4].append(9) g[9].append(4)  dfs(1, 1, memo, lev, log, g)  print("The LCA of 6 and 9 is", lca(6, 9, log, lev, memo)) print("The LCA of 5 and 9 is", lca(5, 9, log, lev, memo)) print("The LCA of 6 and 8 is", lca(6, 8, log, lev, memo)) print("The LCA of 6 and 1 is", lca(6, 1, log, lev, memo))  # This code is contributed by Bhaskar 
C#
// C# implementation of the approach  using System;  using System.Collections.Generic;   class GFG  {       // List to store tree      static List<int> []g;      static int [,]memo;      static int []lev;      static int log;       // Pre-processing to calculate      // values of memo[,]      static void dfs(int u, int p)      {           // Using recursion formula to          // calculate the values of memo[,]          memo[u, 0] = p;          for (int i = 1; i <= log; i++)              memo[u, i] = memo[memo[u, i - 1],                                      i - 1];          foreach (int v in g[u])          {              if (v != p)              {                   // Calculating the level of each node                  lev[v] = lev[u] + 1;                  dfs(v, u);              }          }      }       // Function to return the LCA of      // nodes u and v      static int lca(int u, int v)      {          // The node which is present farthest          // from the root node is taken as u          // If v is farther from root node          // then swap the two          if (lev[u] < lev[v])          {              int temp = u;              u = v;              v = temp;          }           // Finding the ancestor of u          // which is at same level as v          for (int i = log; i >= 0; i--)          {              if ((lev[u] - (int)Math.Pow(2, i)) >= lev[v])                  u = memo[u, i];          }           // If v is the ancestor of u          // then v is the LCA of u and v          if (u == v)              return u;           // Finding the node closest to the root          // which is not the common ancestor of          // u and v i.e. a node x such that          // x is not the common ancestor of u          // and v but memo[x,0] is          for (int i = log; i >= 0; i--)          {              if (memo[u, i] != memo[v, i])              {                  u = memo[u, i];                  v = memo[v, i];              }          }           // Returning the first ancestor          // of above found node          return memo[u, 0];      }       // Driver code      public static void Main(String []args)      {           // Number of nodes          int n = 9;          g = new List<int>[n + 1];           // log(n) with base 2          log = (int)Math.Ceiling(Math.Log(n) / Math.Log(2));          memo = new int[n + 1, log + 1];           // Stores the level of each node          lev = new int[n + 1];           // Initialising memo values with -1          for (int i = 0; i <= n; i++)              for (int j = 0; j <= log; j++)                  memo[i, j] = -1;          for (int i = 0; i <= n; i++)              g[i] = new List<int>();           // Add edges          g[1].Add(2);          g[2].Add(1);          g[1].Add(3);          g[3].Add(1);          g[1].Add(4);          g[4].Add(1);          g[2].Add(5);          g[5].Add(2);          g[3].Add(6);          g[6].Add(3);          g[3].Add(7);          g[7].Add(3);          g[3].Add(8);          g[8].Add(3);          g[4].Add(9);          g[9].Add(4);          dfs(1, 1);          Console.WriteLine("The LCA of 6 and 9 is " +                                          lca(6, 9));          Console.WriteLine("The LCA of 5 and 9 is " +                                          lca(5, 9));          Console.WriteLine("The LCA of 6 and 8 is " +                                          lca(6, 8));          Console.WriteLine("The LCA of 6 and 1 is " +                                          lca(6, 1));      }  }   // This code is contributed by PrinciRaj1992  
JavaScript
<script>      // JavaScript implementation of the approach          // ArrayList to store tree     let g;     let memo, lev, log;       // Pre-processing to calculate values of memo[][]     function dfs(u, p)     {           // Using recursion formula to calculate         // the values of memo[][]         memo[u][0] = p;         for (let i = 1; i <= log; i++)             memo[u][i] = memo[memo[u][i - 1]][i - 1];         for (let v = 0; v < g[u].length; v++) {             if (g[u][v] != p) {                   // Calculating the level of each node                 lev[g[u][v]] = lev[u] + 1;                 dfs(g[u][v], u);             }         }     }       // Function to return the LCA of nodes u and v     function lca(u, v)     {         // The node which is present farthest         // from the root node is taken as u         // If v is farther from root node         // then swap the two         if (lev[u] < lev[v]) {             let temp = u;             u = v;             v = temp;         }           // Finding the ancestor of u         // which is at same level as v         for (let i = log; i >= 0; i--) {             if ((lev[u] - Math.pow(2, i)) >= lev[v])                 u = memo[u][i];         }           // If v is the ancestor of u         // then v is the LCA of u and v         if (u == v)             return u;           // Finding the node closest to the root which is         // not the common ancestor of u and v i.e. a node         // x such that x is not the common ancestor of u         // and v but memo[x][0] is         for (let i = log; i >= 0; i--) {             if (memo[u][i] != memo[v][i]) {                 u = memo[u][i];                 v = memo[v][i];             }         }           // Returning the first ancestor         // of above found node         return memo[u][0];     }          // Number of nodes     let n = 9;     g = new Array(n + 1);      // log(n) with base 2     log = Math.ceil(Math.log(n) / Math.log(2));     memo = new Array(n + 1);      // Stores the level of each node     lev = new Array(n + 1);     lev.fill(0);      // Initialising memo values with -1     for (let i = 0; i <= n; i++)     {         memo[i] = new Array(log+1);         for (let j = 0; j < log+1; j++)         {             memo[i][j] = -1;         }     }     for (let i = 0; i <= n; i++)       g[i] = [];      // Add edges     g[1].push(2);     g[2].push(1);     g[1].push(3);     g[3].push(1);     g[1].push(4);     g[4].push(1);     g[2].push(5);     g[5].push(2);     g[3].push(6);     g[6].push(3);     g[3].push(7);     g[7].push(3);     g[3].push(8);     g[8].push(3);     g[4].push(9);     g[9].push(4);     dfs(1, 1);     document.write("The LCA of 6 and 9 is " + lca(6, 9) + "</br>");     document.write("The LCA of 5 and 9 is " + lca(5, 9) + "</br>");     document.write("The LCA of 6 and 8 is " + lca(6, 8) + "</br>");     document.write("The LCA of 6 and 1 is " + lca(6, 1));      </script> 

Output
The LCA of 6 and 9 is 1 The LCA of 5 and 9 is 1 The LCA of 6 and 8 is 3 The LCA of 6 and 1 is 1

Time Complexity: The time taken in pre-processing is O(NlogN) and every query takes O(logN) time. So the overall time complexity of the solution is O(NlogN)
Auxiliary Space: O(NlogN) 


Next Article
Left View of a Binary Tree Using Stack

A

Amol_Pratap
Improve
Article Tags :
  • Tree
  • Algorithms
  • Dynamic Programming
  • Competitive Programming
  • Data Structures
  • DSA
Practice Tags :
  • Algorithms
  • Data Structures
  • Dynamic Programming
  • Tree

Similar Reads

  • Searching in Binary Indexed Tree using Binary Lifting in O(LogN)
    Binary Indexed Tree (BIT) is a data structure that allows efficient queries of a range of elements in an array and updates on individual elements in O(log n) time complexity, where n is the number of elements in the array. Binary Lifting:One of the efficient techniques used to perform search operati
    9 min read
  • Left View of a Binary Tree Using Stack
    Given a Binary Tree, the task is to print the left view of the Binary Tree. The left view of a Binary Tree is a set of leftmost nodes for every level. Examples: Example 1 : The Green colored nodes represents the left view in the below Binary tree. Example 2: The Green colored nodes represents the le
    8 min read
  • Deepest left leaf node in a binary tree
    Given a Binary Tree, find the deepest leaf node that is left child of its parent. For example, consider the following tree. The deepest left leaf node is the node with value 9. 1 / \ 2 3 / / \ 4 5 6 \ \ 7 8 / \ 9 10 The idea is to recursively traverse the given binary tree and while traversing, main
    13 min read
  • Delete the last leaf node in a Binary Tree
    Given a Binary Tree, the task is to find and DELETE the last leaf node.The leaf node is a node with no children. The last leaf node would be the node that is traversed last in sequence during Level Order Traversal. The problem statement is to identify this last visited node and delete this particula
    15+ min read
  • Binary Tree to Binary Search Tree Conversion using STL set
    Given a Binary Tree, the task is to convert it to a Binary Search Tree. The conversion must be done in such a way that keeps the original structure of the Binary Tree. Example: Input: Output: Explanation: The above Binary tree is converted to Binary Search tree by keeping the original structure of B
    7 min read
  • Search a node in Binary Tree
    Given a Binary tree and a key. The task is to search and check if the given key exists in the binary tree or not. Examples: Input: Output: TrueInput: Output: False Approach:The idea is to use any of the tree traversals to traverse the tree and while traversing check if the current node matches with
    7 min read
  • Maintain subtree information using link/cut trees
    Link/Cut Trees is a data structure used in computer science that efficiently maintains a forest of trees under the operations of link (joining two trees into one) and cut (removing an edge to split a tree into two). The Link/Cut Trees data structure is useful in a variety of applications such as in-
    12 min read
  • Number of Isosceles triangles in a binary tree
    Pre-Requisites: Depth First Search | Parent Array RepresentationGiven a parent array representation of a binary tree, we need to find the number of Isosceles triangles in the binary tree. Consider a parent array representing a binary tree: Parent Array: Given below is the tree representation of the
    13 min read
  • Print Binary Tree levels in sorted order | Set 2 (Using set)
    Given a tree, print the level order traversal in sorted order. Examples : Input : 7 / \ 6 5 / \ / \ 4 3 2 1 Output : 7 5 6 1 2 3 4 Input : 7 / \ 16 1 / \ 4 13 Output : 7 1 16 4 13 We have discussed a priority queue based solution in below post.Print Binary Tree levels in sorted order | Set 1 (Using
    5 min read
  • Find the closest leaf in a Binary Tree
    Given a Binary Tree and a key 'k', find distance of the closest leaf from 'k'. Examples: A / \ B C / \ E F / \ G H / \ / I J K Closest leaf to 'H' is 'K', so distance is 1 for 'H' Closest leaf to 'C' is 'B', so distance is 2 for 'C' Closest leaf to 'E' is either 'I' or 'J', so distance is 2 for 'E'
    14 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences