# [LeetCode 235. Lowest Common Ancestor of a Binary Search Tree ](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/610/week-3-july-15th-july-21st/3819/) ### Daily challenge Jul 19, 2021 (EASY) >Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. > >According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in `T` that has both `p` and `q` as descendants (where we allow **a node to be a descendant of itself**).” ![](https://i.imgur.com/wzbtEsk.png) :::info **Example 1:** **Input:** root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 **Output:** 6 vExplanation:** The LCA of nodes 2 and 8 is 6. ::: :::info **Example 2:** **Input:** root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 **Output:** 2 **Explanation:** The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition. ::: :::info **Example 3:** **Input:** root = [2,1], p = 2, q = 1 **Output:** 2 ::: :::warning **Constraints:** * The number of nodes in the tree is in the range [2, 105]. * -109 <= Node.val <= 109 * All Node.val are unique. * p != q * `p and q will exist in the BST`. ::: ![](https://i.imgur.com/RHFUjbL.png) ### Approach 1 : Recursion **`28 ms ( 79.85% )`** **`O(N)`** 、 **`O(N) space`** * node 皆小於 root ---> **`Left Subtree`**. * node 皆大於 root ---> **`Right Subtree`**. * If both are not true, we have found the answer. ```cpp=1 class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { //recursion if(root == NULL) return NULL; if(p->val < root->val && q->val < root->val) return lowestCommonAncestor(root->left, p, q); else if(p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q); else return root; } }; ``` ### Approach 2 : Iterative **`28 ms ( 79.85% )`** **`O(N)`** 、 **`O(1) space`** ```cpp=1 class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { // iterator while(root != NULL){ if(p->val < root->val && q->val < root->val) root = root->left; else if(p->val > root->val && q->val > root->val) root = root->right; else return root; } return NULL; } }; ```