---
# System prepended metadata

title: '[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/)'

---

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