携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
刷题的日常
一天一题,保持脑子清爽
最大层内元素和
来自leetcode的 1161 题,题意如下:
你一个二叉树的根节点root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中最小 的那个。
示例如下:
输入: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;
}
}