力扣 - 512. 找树左下角的值
题目
思路1(BFS 广度优先搜索)
- 本题用BFS好做,因为求得是最后一行的最左边的值
- BFS广度优先搜索其实就是层序遍历
- 层序遍历是一层一层的遍历,我们只需要在每层遍历开始将最左边的数记录下来即可
- 遍历结束那个值就是结果了
代码
class Solution {
public int findBottomLeftValue(TreeNode root) {
Deque<TreeNode> q1 = new LinkedList<>();
q1.offer(root);
int res = 0;
while (!q1.isEmpty()) {
int size = q1.size();
res = q1.peek().val;
while (size > 0) {
TreeNode node = q1.poll();
if (node.left != null) {
q1.offer(node.left);
}
if (node.right != null) {
q1.offer(node.right);
}
size--;
}
}
return res;
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为树的结点数量
- 空间复杂度:\(O(N)\),其中 N 为树的结点数量
思路2(DFS 深度优先搜索)
- 使用 DFS + 回溯 来获取结果
- 由于我们是要获取最后一行的最左边的值,所以我们只需要一步一步找到最后一行即可
- 搜索的叶子结点,那么就判断叶子结点是不是最深的,如果是的话,就更新当前最深深度和最左边的值
代码
class Solution {
int maxLength = Integer.MIN_VALUE;
int leftValue = 0;
public int findBottomLeftValue(TreeNode root) {
backTrack(root, 0);
return leftValue;
}
public void backTrack(TreeNode node, int length) {
if (node.left == null && node.right == null) {
if (length > maxLength) {
maxLength = length;
leftValue = node.val;
}
return;
}
// 选择路径:left和right
if (node.left != null) {
// 添加选择
length++;
// 进入下一层决策树
backTrack(node.left, length);
// 删除选择
length--;
}
if (node.right != null) {
length++;
backTrack(node.right, length);
length--;
}
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为树的结点数量
- 空间复杂度:\(O(H)\),其中 H 为树的高度,即 logN
我走得很慢,但我从不后退!

浙公网安备 33010602011771号