---
# System prepended metadata

title: 0236. Lowest Common Ancestor of a Binary Tree
tags: [Leetcode, DFS, Lowest Common Ancestor, Medium]

---

# 0236. Lowest Common Ancestor of a Binary Tree
###### tags: `Leetcode` `Medium` `DFS` `Lowest Common Ancestor`
Link: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/
## 思路
和下面两题思路很像，建议复习的时候把所有LCA的题目一起看
[1676. Lowest Common Ancestor of a Binary Tree IV](https://hackmd.io/rfFxWl_vSpmNuuDBZnDChQ)
[1644. Lowest Common Ancestor of a Binary Tree II](https://hackmd.io/ZQcxIr0ATdGsU7OHP3NTdg)
### 思路一
递归
如果一个node 左右两边的subtree都有target node那么就返回他本身 否则就返回左边subtree或者右边subtree的LCA
### 思路二
记录父节点

**总结：做完所有LCA的题就会发现，如果是所有node都会出现，那么就正常写，也就是碰到一个targetnode，就返回不需要遍历它的child；如果有的node不会出现，那么要先dfs left和right，再写如果root=targetnode，就返回，让left和right继续跑，才能记下来一共经历了多少targetnode**
## Code
### 思路一
```python=
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root in (None, p, q): return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if left and right: return root
        if left: return left
        return right
```
```java=
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null || root==p || root==q) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left!=null&right!=null) return root;
        if(left!=null) return left;
        return right;
    }
}
```
### 思路二
```java=
class Solution {
    Map<Integer, TreeNode> parents = new HashMap<>();
    Set<Integer> visited = new HashSet<>();
    boolean foundP = false, foundQ = false;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        dfs(root,p,q);
        while(p!=null){
            visited.add(p.val);
            p = parents.get(p.val);
        }
        while(q!=null){
            if(visited.contains(q.val)){
                return q;
            }
            q = parents.get(q.val);
        }
        return null;
    }
    public void dfs(TreeNode root, TreeNode p, TreeNode q){
        if(foundP && foundQ) return;
        if(root == null){
            return;
        }
        if(root.left != null){
            parents.put(root.left.val, root);
            dfs(root.left,p,q);
        }
        if(root.right != null){
            parents.put(root.right.val, root);
            dfs(root.right,p,q);
        }
        if(root==p) foundP = true;
        if(root==q) foundQ = true;
    }
}
```