LeetCode 515. 在每个树行中找最大值

362 阅读1分钟

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);
        }
    }
}

image.png

以这样的一棵二叉树为例,则程序输出结果为:

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]

此题得解。