问题描述

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1

示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1

核心思路

在树的最后一行找到最左边的值

深度最大的叶子节点一定在最后一行。

使用前序遍历(中序,后序均可,只要左优先就行),保证优先左边搜索,然后深度更新时更新结果值,遍历完得到的就是树的最后一行最左边的值。

层序遍历比较好理解,每次遍历到新的一层,记录上第一个,也就是最左边的值,到最后一层即可。

code

深度优先搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool isLeafNode(TreeNode* node) {
return !node->left && !node->right;
}

int dfs(TreeNode* node) {
int ans = 0;
if (node->left) {
ans += isLeafNode(node->left) ? node->left->val : dfs(node->left);
}
if (node->right && !isLeafNode(node->right)) {
ans += dfs(node->right);
}
return ans;
}

int sumOfLeftLeaves(TreeNode* root) {
return root ? dfs(root) : 0;
}
};
  • 时间复杂度:O(n)O(n),其中 n 是树中的节点个数。

  • 空间复杂度:O(n)O(n)。空间复杂度与深度优先搜索使用的栈的最大深度相关。在最坏的情况下,树呈现链式结构,深度为 O(n)O(n),对应的空间复杂度也为 O(n)O(n)

广度优先搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public:
bool isLeafNode(TreeNode* node) {
return !node->left && !node->right;
}

int sumOfLeftLeaves(TreeNode* root) {
if (!root) {
return 0;
}

queue<TreeNode*> q;
q.push(root);
int ans = 0;
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
if (node->left) {
if (isLeafNode(node->left)) {
ans += node->left->val;
}
else {
q.push(node->left);
}
}
if (node->right) {
if (!isLeafNode(node->right)) {
q.push(node->right);
}
}
}
return ans;
}
};
  • 时间复杂度:O(n)O(n),其中 n 是树中的节点个数。

  • 空间复杂度:O(n)O(n)。空间复杂度与广度优先搜索使用的队列需要的容量相关,为 O(n)O(n)