515.在每个树行中找最大值(二叉树算法题)
515.在每个树行中找最大值
力扣题目链接
给定一棵二叉树的根节点 root
,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9] 输出: [1,3,9]
示例2:
输入: root = [1,2,3] 输出: [1,3]
提示:
- 二叉树的节点个数的范围是
[0,104]
-231 <= Node.val <= 231 - 1
/*** Definition for a binary tree node.* public class TreeNode {* int val; // 节点的整数值* TreeNode left; // 指向左子节点的引用(指针)* TreeNode right; // 指向右子节点的引用(指针)* * // 默认构造函数:创建一个空节点(val 默认为 0)* TreeNode() {}* * // 构造函数:根据给定的值创建一个节点,左右子节点默认为 null* TreeNode(int val) { this.val = val; }* * // 构造函数:根据给定的值和左右子节点创建一个完整节点* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {/*** 找出二叉树每一层的最大值。* * 使用层序遍历(广度优先搜索,BFS)的方式,逐层访问二叉树的所有节点,* 对每一层的所有节点值求最大值,并将结果存入列表返回。* * 示例:* 1* / \* 3 2* / \ \* 5 3 9* 输出: [1, 3, 9]* 解释: 第0层最大值是1,第1层是3,第2层是9。* * @param root 二叉树的根节点* @return 返回一个列表,包含每一层节点值的最大值(从上到下)*/public List<Integer> largestValues(TreeNode root) {// 存储每一层最大值的结果列表List<Integer> resList = new ArrayList<>();// 使用双端队列实现层序遍历(BFS),这里当作普通队列使用(FIFO)Deque<TreeNode> deque = new LinkedList<>();// 如果根节点为空,直接返回空列表if (root == null) return resList;// 将根节点加入队列,作为遍历的起点deque.offer(root);// 当队列不为空时,说明还有节点未处理,继续循环while (!deque.isEmpty()) {// 记录当前层的节点数量,用于控制内层循环只处理当前层的节点int len = deque.size();// 初始化当前层的最大值为整数的最小值(确保任何节点值都能更新它)int max = Integer.MIN_VALUE;// 遍历当前层的所有节点(共 len 个)for (int i = 0; i < len; i++) {// 从队列头部取出一个节点TreeNode temp = deque.poll(); // 注意:原代码中拼写错误 tmep → temp// 更新当前层的最大值max = Math.max(max, temp.val);// 如果当前节点有左子节点,则将其加入队列,供下一层处理if (temp.left != null) {deque.offer(temp.left);}// 如果当前节点有右子节点,则将其加入队列,供下一层处理if (temp.right != null) {deque.offer(temp.right);}}// 当前层遍历结束,将该层的最大值加入结果列表resList.add(max);}// 返回每一层最大值的列表return resList;}
}