一、题目描述
原文链接:515. 在每个树行中找最大值
具体描述:
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例2:
输入: root = [1,2,3]
输出: [1,3]
提示:
- 二叉树的节点个数的范围是 [0,104]
- -2^31 <= Node.val <= 2^31 - 1
二、思路分析
其实就是二叉数的层次遍历,只不过不需要存储每一层的值,只需要把每一层的值进行比较,找到最大的!
如何找最大的那?
定一个整形最小值int levelMax = Integer.MIN_VALUE;
,然后遍历的时候两两比较,如果当前值大则把levelMax
替换成当前值!
顺便我们复习二叉数的层次遍历思路:
- 定义一个队列来进行存储二叉数,首次把root添加到树当中
- 每次根据根据队列的当前长度来遍历队列,存储结果,顺待把当前节点的左右孩子添加到队列当中
- 循环第二步,直到队列为空!
三、AC代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (root != null) queue.offer(root);
while (queue.isEmpty() == false){
int levelLen = queue.size();
int levelMax = Integer.MIN_VALUE;
while (levelLen > 0){
TreeNode tmpNode = queue.poll();
int val = tmpNode.val;
if (levelMax < val) levelMax = val;
if (tmpNode.left != null) queue.offer(tmpNode.left);
if (tmpNode.right != null) queue.offer(tmpNode.right);
levelLen--;
}
result.add(levelMax);
}
return result;
}
}
四、总结
- 整形最大值:
Integer.MIN_VALUE
- 整形最小值:
Integer.MAX_VALUE
五、巩固练习
116. 填充每个节点的下一个右侧节点指针(每一层的节点指向当前层的后面的节点,最后一个指向null)
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
Queue<Node> queue = new LinkedList<>();
if (root != null) queue.offer(root);
while (queue.isEmpty() == false){
int levelLen = queue.size();
while (levelLen > 0){
Node tmpNode = queue.poll();
if (levelLen == 1){
tmpNode.next = null;
}else{
tmpNode.next = queue.peek();
}
if (tmpNode.left != null) queue.offer(tmpNode.left);
if (tmpNode.right != null) queue.offer(tmpNode.right);
levelLen--;
}
}
return root;
}
}
感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤