---
# System prepended metadata

title: 'LeetCode #236 [Lowest Common Ancestor of a Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/)'
tags: [Recursion, LeetCode, Medium, Tree]

---

###### tags: `LeetCode` `Tree` `Medium` `Recursion`
# LeetCode #236 [Lowest Common Ancestor of a Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/)
### (Medium)
給定一個二元樹, 找到該樹中兩個指定節點的最近公共祖先。

最近公共祖先的定義為：“對於有根樹 T 的兩個節點 p、q，最近公共祖先表示為一個節點 x，滿足 x 是 p、q 的祖先且 x 的深度盡可能大（一個節點也可以是它自己的祖先）。”


---

```
if (!root || root == p || root == q) return root;
確保了回傳值只有三種情況, 找到p, 找到q, 都沒找到(nullptr)。
```
接下來定義TreeNode* left, right, 且這兩個節點只有可能是p, q, nullptr。

若left, right皆存在, 代表一個在左子樹一個在右子樹, 此時共同祖先為根節點;

若left, right一個存在, 一個不存在, 代表兩個節點都在存在的那一邊的子樹, 此時共同祖先就是存在的那個節點(left or right), 因為它先被找到, 代表它會在較上層。

而若left, right皆不存在, 那可能是整個樹裡面都找不到p, q, 此時回傳nullptr。


---
```
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (!root || root == p || root == q) return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if(!left&&!right)return nullptr;
        else if(left&&right)return root;
        return left==nullptr?right:left;
    }
};
```