The problem requires finding the lowest common ancestor (LCA) of two nodes in a Binary
Search Tree (BST).
The key property of a BST is that for any node, all values in the
left subtree are smaller
,
and all values in the
right subtree are larger
.
We use this property to determine the LCA.
If both nodes are greater than the current root, we
search in the right subtree
.
If both nodes are smaller, we
search in the left subtree
.
Otherwise, the current root is the LCA.
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right,p,q); else if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left,p,q); else return root; } }
The algorithm traverses the height of the tree, making it O(h), where 'h'
is the height of
the
BST. In the worst case, this is O(n) for a skewed tree.
The algorithm uses recursion, which consumes stack space proportional to the height of the tree. In the worst case, this is O(n) for a skewed tree.