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. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { // Both nodes are greater than root: Search in right sub tree if(root->val < p->val && root->val < q->val) return lowestCommonAncestor(root->right,p,q); // Both nodes are smaller than root: Search in left sub tree 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.