持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
题目描述
给定一棵二叉树的根节点 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
思路
今天的题目跟前天的题目《leetcode-找树左下角的值》是很类似的,都是二叉树的遍历。
题目要我们求二叉树每一层的最大值,可以使用广度优先遍历和深度优先遍历2种方式。
广度优先遍历
广度优先是二叉树层序遍历的基础方法,定义一个队列Queue来保存某一层的节点。先把根节点加入这个队列,此时队列中就是所有第0层的节点了。我们用queue.size()拿到了这一层节点的数量后,遍历这些节点,然后如果存在左子节点或者右子节点的,把子节点也放入这个queue中。注意,虽然在遍历的过程中继续往queue中增加了下一层的节点,但是我们一开始使用queue.size()拿到了这一层节点的数量,所以可以保证在这一次循环中只是遍历了这一层节点,而不会遍历带下一层的节点。这次循环走完后,queue中就是下一层的所有节点了。我们在遍历某一层的节点时候,定义一个变量max来记录这一层的最大值,就可以获得题目的解了。
深度优先遍历
深度优先我们就是使用递归的方式,去遍历自身节点和左右子节点。这里可以使用使用一个Map来记录每一层当前遍历过节点的最大值,key是层的序号,val是最大值。我们在递归的时候,注意带进去当前是第几层的参数。
Java版本代码
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
int max = Integer.MIN_VALUE;
while (size-- > 0) {
TreeNode treeNode = queue.poll();
max = Integer.max(max, treeNode.val);
if (treeNode.left != null) {
queue.offer(treeNode.left);
}
if (treeNode.right != null) {
queue.offer(treeNode.right);
}
}
ans.add(max);
}
return ans;
}
}