1123. 最深叶节点的最近公共祖先【中等】
1. 📝 题目描述
给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先。
回想一下:
- 叶节点 是二叉树中没有子节点的节点
- 树的根节点的 深度 为
0,如果某一节点的深度为d,那它的子节点的深度就是d+1 - 如果我们假定
A是一组节点S的 最近公共祖先,S中的每个节点都在以A为根节点的子树中,且A的深度达到此条件下可能的最大值。
示例 1:

txt
输入:root = [3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:我们返回值为 2 的节点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的节点。
注意,节点 6、0 和 8 也是叶节点,但是它们的深度是 2,而节点 7 和 4 的深度是 3。1
2
3
4
5
2
3
4
5
示例 2:
txt
输入:root = [1]
输出:[1]
解释:根节点是树中最深的节点,它是它本身的最近公共祖先。1
2
3
2
3
示例 3:
txt
输入:root = [0,1,3,null,2]
输出:[2]
解释:树中最深的叶节点是 2,最近公共祖先是它自己。1
2
3
2
3
提示:
- 树中的节点数将在
[1, 1000]的范围内。 0 <= Node.val <= 1000- 每个节点的值都是 独一无二 的。
注意:本题与力扣 865. 具有所有最深节点的最小子树 重复。
2. 🎯 s.1 - DFS
js
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var lcaDeepestLeaves = function (root) {
function dfs(node) {
if (!node) return [null, 0]
const [left, ld] = dfs(node.left)
const [right, rd] = dfs(node.right)
if (ld > rd) return [left, ld + 1]
if (rd > ld) return [right, rd + 1]
return [node, ld + 1]
}
return dfs(root)[0]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 时间复杂度:
,其中 是树的节点数 - 空间复杂度:
,其中 是树的高度
算法思路:
- DFS 后序遍历,每个节点返回其子树的最深叶节点的 LCA 和深度
- 若左右子树深度相同,当前节点即为 LCA
- 若深度不同,返回更深一侧的结果