235. Lowest Common Ancestor of a Binary Search Tree

Given two nodes, p and q, we’re asked to find the lowest common ancestor of each node in a binary search tree. The nodes themselves can also be the lowest common ancestor. Given that this is a binary search tree, we can use the values of p and q to direct our search either left or right. But, if the values of p and q are not greater than the current node or less than the current node, we know that we’ve found the lowest common ancestor.

The solution is as follows:

class Solution:
    def lowestCommonAncestor(self, root: Optional[TreeNode], p: TreeNode, q: TreeNode) -> Optional[TreeNode]:
        if not root:
            return
 
        if p.val < root.val and q.val < root.val:
            return self.lowestCommonAncestor(root.left, p, q)
        if p.val > root.val and q.val > root.val:
            return self.lowestCommonAncestor(root.right, p, q)
        else:
            return root

_ Time Complexity:

O(n) - Where n is the number of nodes in the binary search tree.

_ Space Complexity:

O(n) - Our recursive function can be called n times.