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