刷题的日常-最大层内元素和

85 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

刷题的日常

一天一题,保持脑子清爽

最大层内元素和

来自leetcode的 1161 题,题意如下:

你一个二叉树的根节点root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中最小 的那个。

示例如下: image.png

输入:root = [1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。
输入: root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出: 2

理解题意

由题意我们可以将条件整理如下:

  • 题目会给出一个树节点,树节点至少一个
  • 要求统计树中每层的总和
  • 返回具有总和最大的层 的 层数
  • 如果总和相等,返回最小的层数
  • 层数开始为1

做题思路

树的遍历不止前中后序三种,还有层序遍历,这里用层序遍历实现:

  • 用队列记录待遍历的树节点
  • 开辟preSum记录前一层的汇总,sum为当前层的汇总
  • 当我们遍历树时候,可以记录下一层的大小
  • 根据每层的数量弹出队首的节点
  • 汇总sum值,并将子节点放到栈里
  • 最后比较大小,如果出现更大的汇总值,更新结果为当前层
  • 最后返回结果即可

代码实现

public class Solution {
    public int maxLevelSum(TreeNode root) {
        int preSum = root.val;
        int size, sum, level = 0, result = 1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while ((size = queue.size()) > 0) {
            level++;
            sum = 0;
            while (size-- > 0) {
                TreeNode node = queue.poll();
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
                sum += node.val;
            }
            if (sum > preSum) {
                result = level;
            }
            preSum = Math.max(preSum, sum);
        }
        return result;
    }
}