Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
给定一棵二叉树的根节点
root,请找出该二叉树中每一层的最大值。
题目要求的是二叉树每一层的最大值,这很容易让我们联想到二叉树的层次遍历,我们只需要在二叉树层次遍历的基础上进行最大值的获取即可,因为层次遍历是从上至下一层一层进行遍历的。
要层次遍历一棵二叉树也非常简单,借助一个队列即可实现,首先将二叉树的根结点放入队列,然后取出队列中的节点,此时取出的就是根结点,接着判断根结点是否有左右孩子,如果有,则分别加入队列。这样队列中就有了两个节点,继续取出其中一个节点,判断是否有左右孩子,如果有,则加入队列。以此类推,即可完成层次遍历。
public static void traverse(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val + "\t");
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
以这样的一棵二叉树为例,则程序输出结果为:
0 1 2 3 4 5 6
我们转换一下思路,尝试着获取一下每一层的所有节点,第一次放入队列的是二叉树的根结点,此时队列中的节点个数为1,二叉树的第一层节点个数为1;当根结点出队时,会将其左右孩子入队,此时队列中的节点个数为2,二叉树的第二层节点个数也为2;基于此,我们可以让队列中的节点个数代表二叉树每一层的节点个数,要想做到这一要求,就必须在每一次循环中将下一层的所有孩子节点入队。 代码如下:
public static void traverse(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
// 记录当前一层的节点个数
int size = queue.size();
// 将下一层的所有孩子节点均加入队列
while (size > 0) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
size--;
}
System.out.println(list);
list.clear();
}
}
输出结果:
[0]
[1, 2]
[3, 4, 5, 6]
现在我们已经得到二叉树每一层的节点数值,接下来就只需要得到其中的最大值即可,代码如下:
public static List<Integer> largestValues(TreeNode root) {
List<Integer> list = new ArrayList<>();
List<Integer> maxList = new ArrayList<>();
if (root == null) {
return maxList;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
// 记录当前一层的节点个数
int size = queue.size();
// 将下一层的所有孩子节点均加入队列
while (size > 0) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
size--;
}
// 求出这一层的最大值
Integer max = list.stream().max(Integer::compareTo).get();
maxList.add(max);
list.clear();
}
return maxList;
}
输出结果:
[0,2,6]
此题得解。