Woodstock Blog

a tech blog for general algorithmic interview questions

[LeetCode Plus] Lowest Common Ancestor of BST

Question

link

Given a binary search tree (BST), find the lowest common ancestor of two given nodes in the BST.


        _______6______
       /              \
    ___2__          ___8__
   /      \        /      \
   0      _4       7       9
         /  \
         3   5

Using the above tree as an example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. But how about LCA of nodes 2 and 4? Should it be 6 or 2?

According to the definition of LCA on Wikipedia: "The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself)." Since a node can be a descendant of itself, the LCA of 2 and 4 should be 2, according to this definition.

Hint:
A top-down walk from the root of the tree is enough.

Analysis

This question is the easiest of this series of questions. I will quote the solution analysis.

There’s only three cases you need to consider.

1. Both nodes are to the left of the tree.
2. Both nodes are to the right of the tree.
3. One node is on the left while the other is on the right. This node must be LCA. 
4. Current node equals to one of the two nodes, this node must be the LCA. 

The run time complexity is O(h), where h is the height of the BST.

Code

The code is not written by me.

Node *LCA(Node *root, Node *p, Node *q) {
  if (!root || !p || !q) return NULL;
  if (max(p->data, q->data) < root->data)
    return LCA(root->left, p, q);
  else if (min(p->data, q->data) > root->data)
    return LCA(root->right, p, q);
  else
    return root;
}