# 1123. Lowest Common Ancestor of Deepest Leaves
###### tags: `Leetcode` `Medium` `LCA` `DFS`
Link: https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/
## 思路
### 思路一 自己的思路 O(N) O(N)
和下面两题思路很像,建议复习的时候把所有LCA的题目一起看
[0236. Lowest Common Ancestor of a Binary Tree](https://hackmd.io/8Sj0WCYbRFadYo4hDTXcyg)
[1676. Lowest Common Ancestor of a Binary Tree IV](https://hackmd.io/rfFxWl_vSpmNuuDBZnDChQ)
先通过bfs找到最深的所有node里面最左边和最右边的一个,然后找他们的LCA
### 思路二 大神的思路 O(N) O(N) (学习思路)
具体看代码
**比较重要的一点是ta是将递归(line 15-16)前和递归后分开考虑的**
前面由于是从上往下 所以用来计算最深的深度
当执行到16行后面的时候 deepest已经是最深深度了,所以从下往上找LCA
## Code
### 思路一
```java=
class Solution {
public TreeNode lcaDeepestLeaves(TreeNode root) {
if(root == null) return null;
TreeNode leftMost = null, rightMost = null;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()){
int size = q.size();
for(int i = 0;i < size;i++){
TreeNode curr = q.poll();
if(i==0) leftMost = curr;
if(i==size-1) rightMost = curr;
if(curr.left!=null) q.add(curr.left);
if(curr.right!=null) q.add(curr.right);
}
}
return findLCA(root, leftMost, rightMost);
}
public TreeNode findLCA(TreeNode root, TreeNode p, TreeNode q){
if(root==null | root==p | root==q) return root;
TreeNode left = findLCA(root.left, p, q);
TreeNode right = findLCA(root.right, p, q);
if(left!=null && right!=null) return root;
if(left!=null) return left;
else return right;
}
}
```
### 思路二
```java=
class Solution {
int deepest;
TreeNode lca;
public TreeNode lcaDeepestLeaves(TreeNode root) {
deepest = 0;
dfs(root, 0);
return lca;
}
public int dfs(TreeNode root, int deep){
//记录最深的level是第几层
deepest = Math.max(deepest, deep);
if(root == null) return deep;
//recurse function, 先到最left, 再到最right,同时把deepest更新成最下面的值(见上面代码), 然后从下面往上走,如果遇见一个node左右高度相等且到达的最深的level是deepest(见下面代码),就把lca设置成node
int leftDeepest = dfs(root.left, deep+1);
int rightDeepest = dfs(root.right, deep+1);
if(leftDeepest==deepest && rightDeepest==deepest){
lca = root;
}
return Math.max(leftDeepest, rightDeepest);
}
}
```