513. 找树左下角的值
513. 找树左下角的值
题目来源
题目分析
在这道题目中,我们需要找到给定二叉树的最底层最左边的节点值。具体题目描述如下:
题目: 给定一个二叉树的根节点
root
,请找出该二叉树的最底层最左边的节点的值。假设二叉树中至少有一个节点。
题目难度
- 难度:中等
题目标签
- 标签:树、深度优先搜索、二叉树
题目限制
- 树中节点数目在范围
[1, 10^4]
内 -2^31 <= Node.val <= 2^31 - 1
解题思路
我们可以使用广度优先搜索 (BFS) 和深度优先搜索 (DFS) 两种方式来解决这个问题。
方法一:广度优先搜索 (BFS)
BFS 通过逐层遍历树的节点,可以很容易地找到最底层的节点。在每一层的遍历中,我们先从右到左处理节点,这样在遍历到最底层时,最后一个处理的节点就是最左边的节点。
核心思想:逐层遍历二叉树,每一层从右到左遍历,记录最后一层的最后一个节点的值。
BFS 算法步骤
- 初始化队列:将根节点加入队列。
- 遍历每一层:对于队列中的每一层,从右到左遍历节点,将当前节点值保存在变量中。
- 加入子节点:将当前节点的右子节点和左子节点(如果存在)按顺序加入队列。
- 返回结果:遍历完成后,返回保存的最后一个节点的值。
方法二:深度优先搜索 (DFS)
DFS 可以通过递归的方式实现,可以参考199. 二叉树的右视图,最底层 最左边 节点可以理解为二叉树的左视图的最底层的节点,所以建立一个二叉树的左视图,返回最后的节点就是最底层最左边的节点了。在递归过程中,我们会记录当前的深度,并在每一层找到第一个节点值。最终返回最深层的第一个节点的值。
核心思想:使用递归遍历树,记录每一层第一个节点的值,并在递归完成后返回最深层的第一个节点。
DFS 算法步骤
- 初始化结果列表:用于存储每层的第一个节点值。
- 递归遍历:从根节点开始,按照左子树、右子树的顺序递归遍历二叉树,同时记录当前层的深度。
- 更新结果:如果当前层数等于结果列表的长度,则将当前节点的值加入结果列表中。
- 返回结果:遍历完成后,返回结果列表中最后一个值,即最底层最左边的节点值。
代码实现
以下是 BFS 和 DFS 两种方法实现找树左下角节点值的 Java 代码。
BFS 实现
public int findBottomLeftValue(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<>();
TreeNode node = null;
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
node = queue.removeFirst();
// 先入队右子树,再入队左子树
if (node.right != null) {
queue.add(node.right);
}
if (node.left != null) {
queue.add(node.left);
}
}
}
// 最后一层的最后一个节点就是最底层最左边的节点
return node.val;
}
DFS 实现
public int findBottomLeftValue2(TreeNode root) {
// ans 保存每层第一个遍历到的节点的值
List<Integer> ans = new ArrayList<>();
leftReview(root, 0, ans);
return ans.get(ans.size() - 1);
}
private void leftReview(TreeNode root, int deep, List<Integer> ans) {
if (root == null) {
return;
}
// 当前层数等于结果集的长度,则将当前节点的值加入结果集
if (deep == ans.size()) {
ans.add(root.val);
}
leftReview(root.left, deep + 1, ans);
leftReview(root.right, deep + 1, ans);
}
代码解读
- BFS:通过从右到左遍历每一层,最终队列中的最后一个节点值就是最底层最左边的节点值。
- DFS:通过递归遍历树的每一层,记录每层第一个节点的值,最终返回最后一层的第一个节点值。
性能分析
BFS
- 时间复杂度:
O(n)
,其中n
是树中节点的总数,因为我们需要遍历所有节点。 - 空间复杂度:
O(n)
,在最坏情况下,队列中可能需要存储一整层的节点。
DFS
- 时间复杂度:
O(n)
,其中n
是树中节点的总数,因为我们需要访问树中的每个节点一次。 - 空间复杂度:
O(h)
,其中h
是树的高度,递归调用栈的最大深度。
总结
这道题提供了使用 BFS 和 DFS 两种方式来寻找二叉树中最底层最左边的节点值的机会。BFS 和 DFS 各有优势,在不同场景中可以选择不同的算法来解决问题。