[特殊字符] LeetCode 1123. 最深叶节点的最近公共祖先 | DFS后序遍历题解
LeetCode 1123. 最深叶节点的最近公共祖先
📌 题目描述
给你一棵二叉树,返回最深的所有叶子节点的最近公共祖先(LCA)。
例如,以下树:
3
/
5 1
/| |
6 2 0 8
/
7 4
python
复制
编辑
最深叶子节点是 7 和 4,它们的最近公共祖先是节点 2。
🧠 解题思路
这是一道非常经典的树的后序遍历问题。
我们需要做两件事:
- 找最深的叶子节点
- 找这些最深叶子节点的最近公共祖先
🔁 DFS后序遍历策略:
- 对每个节点递归获取其左子树、右子树的最大深度
- 如果左右子树深度相等,当前节点就是 LCA
- 如果某一边更深,就往那边继续找
🧪 代码实现(Python)
class Solution:
def lcaDeepestLeaves(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def dfs(node: Optional[TreeNode]) -> (int, Optional[TreeNode]):
if not node:
return 0, None
left_depth, left_node = dfs(node.left)
right_depth, right_node = dfs(node.right)
if left_depth > right_depth:
return left_depth + 1, left_node
elif left_depth < right_depth:
return right_depth + 1, right_node
else:
return left_depth + 1, node
return dfs(root)[1]
✅ 复杂度分析
时间复杂度:O(n),遍历整棵树一次
空间复杂度:O(h),h 是树的高度(递归栈)
🌟 总结
这题和「865.具有所有最深节点的最小子树」是同一道题。
利用后序遍历(自底向上)结合深度信息,可以一次性得到结果。非常经典的一道树形 DFS 题目!