Skip to main content

Least Common Ancestor (LCA) of a BST & Binary Tree

The least Common Ancestor is one of those problems which appear quite complicated, but is pretty straightforward and can be solved easily.
 So in this blog, we're going to understand how to find LCA in a BST & a Binary Tree.


Given a binary tree and two nodes n1=1 & n2=4, so the first common node for n1 & n2 with the minimum difference in their heights is 3, therefore 3 is the LCA for n1 & n2.

Let's discuss where cases to make you understand LCA better:
For n1 = 2, n2 = 3  LCA=> 3
For n1 = 4, n2 = 8  LCA=> 5
For n1 = 7, n2 = 9  LCA=> 8


So now let's try to find LCA in a Binary Search Tree:
In a binary search tree, the elements to the left of the root are smaller than the root, and elements to the right of the root are greater than the root.
We can find the LCA according to the following conditions :
Both n1 & n2 are smaller than the root so, LCA will be in the left sub-tree.
Both n1 & n2 are greater than the root so, LCA will be in the right sub-tree.
Otherwise, the root will be the LCA.

Implementation :
Node *lca_bst(Node *root,int n1,int n2)
{
    while(root!=NULL)
    {
        if(root->data>n1 && root->data>n2)
            root=root->left;
        else
        if(root->data<n1 && root->data<n2)
            root=root->right;
        else
            break;
    }
return root;
}
Similarly for Binary Trees also we can have the following conditions:
If n1 == root or n2 == root then LCA => root
We'll look for n1/n2 recursively in Left Subtree & Right Subtree.
If we get a not null value from left subtree's node & right subtree's node then we'll return root as LCA.
Otherwise, if left subtree's node is not null then return left subtree as LCA else return right subtree's node.
Implementation :
// Lca for Binary Tree
Node * lca(Node* root,int n1,int n2)
{
    // base case
  if(root==NULL)
    return NULL;

  // If either n1 or n2 matches with root's key, report 
  // the presence by returning root (Note that if a key is 
  // ancestor of other, then the ancestor key becomes LCA 
  if(root->data==n1 or root->data==n2)
    return root;
    
  // Look for keys in left and right subtrees
  Node *l = lca(root->left,n1,n2);
  Node *r = lca(root->right,n1,n2);
  
  // If both of the above calls return Non-NULL, then one key
  // is present in once subtree and other is present in other, 
  // So this node is the LCA 
  if (l and r)
    return root;

  // Otherwise check if left subtree or right subtree is LCA
  return (l!=NULL)?l:r;
}

I hope this tutorial helped you!
Happy Coding!

Comments

Most Popular Posts

Coding and Mathematics ( Importance Of Maths In Programming )

Everyone wants to become a good coder but only a few manage to achieve this you know why? BECAUSE everyone wants to code and no one really wants to be a good mathematician which is the basic requirement to be a coder, yet very few know this fact and try to be a  mathematician first than a coder. What exactly is coding? It is the process of solving different technical problems using a programming language. The technical problems can vary from printing a  simple "Hello World" program to solving "2 SAT Problem" using mathematics. You might today be able to solve a few problems using your technical skills but it would help you in the long run only if you're fundamentals of mathematics are also clear. By mathematics, I don't mean the whole of it but some important topics such as Discrete Math, Algebra, Number Theory, etc. Here are some concepts of mathematics that you will use mostly in solving the technical problems : Fundamentals B...

On Which Coding Platform Should I Practice?

Which is the best online platform to practice, how to improve my coding skills? This post is all about giving answers to all such questions. If you're a beginner who has got no idea what programming is then I would recommend you step by step practice any programming language on Hackerrank. Hackerrank has modules that are self-explanatory and would slowly make you understand all the terminologies which are generally used and with practice, you'll be better at it. Moreover, if you're still not able to understand anything you can always search for your answers on GeekForGeeks or HackerEarth both of them provide one of the best tutorials on any topic. If you're an intermediate who's comfortable with any programming language then you can always improve your problem-solving skills studying Data Structures and Algorithms and practicing it. You can also improve by competitive coding. The best place to start with competitive programming according to me would be ...

How to Invert A Binary Tree (Iteratively + Recursively)?

Inverting a binary is one of the most common questions being asked these days. Often, seen many times in the ad of AlgoExpert as well. So, what is an inverted binary tree? Inverted binary tree is a simply a mirror image of given binary tree. Example : So, all we need to do is " Swapping left children with right children of a binary tree at every level." Implementation Recursively TreeNode* invertTree(TreeNode* root) { if(root==NULL) return NULL; swap(root->left,root->right); invertTree(root->left); invertTree(root->right); return root; } Iteratively TreeNode* invertTree(TreeNode* root) { if(root==NULL) return NULL; queue<TreeNode*> q; q.push(root); while(!q.empty()) { TreeNode* c= q.front(); q.pop(); swap(c->left,c->right); if(c->left!=NULL) q.push(c->left); if(c->right!=NULL) q.push(c->right); } return root; } I hope this tutorial hel...