# [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**).”

:::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`.
:::

### 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;
}
};
```