1161.最大层内元素和

【LetMeFly】1161.最大层内元素和

力扣题目链接:https://leetcode.cn/problems/maximum-level-sum-of-a-binary-tree/

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

 

示例 1:

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

示例 2:

输入:root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出:2

 

提示:

  • 树中的节点数在 [1, 104]范围内
  • -105 <= Node.val <= 105

方法一:层序遍历 + 广搜BFS

有关二叉树的层序遍历,之前已经讲过,详细方法可参考 LeetCode 0107.二叉树的层序遍历II の 题解

本题,同样地,我们使用优先队列来对二叉树进行层序遍历。

  • 用变量maxSum记录当前的单层最大和
  • 用变量ans来记录取得maxSum的最小层号
  • 用变量nowLayer记录当前遍历到的层的层号

初始值maxSumint范围内的最小值INT_MINans取任意值即可,nowLayer的值取1

在遍历到某一层时,用一个临时变量thisSum统计这一层的节点值之和

如果这一层遍历结束后,thisSum的值大于之前所记录的最大值maxSum

那么就更新maxSumthisSum,并将ans赋值为当前层号nowLayer

  • 时间复杂度$O(N)$,其中$N$是节点个数。
  • 空间复杂度$O(N2)$,其中$N2$是节点最多的一层的节点数。

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
int maxLevelSum(TreeNode* root) {
int maxSum = INT_MIN;
int ans = -1;
int nowLayer = 1;

queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int thisLayerNum = q.size(); // 这一层有几个元素
int thisSum = 0;
for (int i = 0; i < thisLayerNum; i++) {
TreeNode* thisNode = q.front();
q.pop();
thisSum += thisNode->val;
if (thisNode->left)
q.push(thisNode->left);
if (thisNode->right)
q.push(thisNode->right);
}
if (thisSum > maxSum) {
maxSum = thisSum;
ans = nowLayer;
}
nowLayer++;
}

return ans;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126082726


1161.最大层内元素和
https://blog.letmefly.xyz/2022/07/31/LeetCode 1161.最大层内元素和/
作者
Tisfy
发布于
2022年7月31日
许可协议