leetcode-在每个树行中找最大值

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}