在每个树行中找最大值
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 29 ms, 内存: 18.1 MB
/*
* 思路:
* 使用广度优先搜索(BFS)和Java Stream来遍历二叉树的每一层。
* 在遍历每一层时,记录该层的最大值。
* 将每一层的最大值存入结果列表并返回。
*/
import java.util.*;
import java.util.stream.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<TreeNode> levelNodes = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
levelNodes.add(node);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
int max = levelNodes.stream().mapToInt(n -> n.val).max().orElse(Integer.MIN_VALUE);
result.add(max);
}
return result;
}
}
解释
方法:
这个题解使用了广度优先搜索(BFS)的方法来遍历二叉树。首先,创建一个队列来保存待处理的节点,以及一个列表来保存每一层的最大值。对于树中的每一层,我们从队列中移除当前层的所有节点,并在此过程中找到这一层的最大值。然后将该层的最大值添加到结果列表中。同时,如果当前节点有子节点,就将这些子节点添加到队列中,以便在下一轮中处理。重复这个过程直到队列为空,即所有层都被处理完毕。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到使用了广度优先搜索(BFS),这种方法与深度优先搜索(DFS)相比在这种问题中有哪些优势和劣势?
▷🦆
题解中使用了 `-float('inf')` 作为每层最大值的初始化,这种方式是否适用于所有节点值都是正数的情况?有没有更优或者更通用的方法?
▷🦆
如果二叉树节点的值可以是非常大或者非常小的整数,是否需要考虑整数溢出的问题?
▷