5052. 最大层内元素和
给你一个二叉树的根节点 root
。设根节点位于二叉树的第 1
层,而根节点的子节点位于第 2
层,依此类推。
请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
示例:
输入:[1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。
提示:
- 树中的节点数介于
1
和10^4
之间 -10^5 <= node.val <= 10^5
、
通过层序遍历的方式,对每层进行值求和,最后进行比较输出即可。
class Solution {
public:
#define INF (0x3f3f3f3f)
struct jie {
int ceng;
TreeNode *t;
jie(int too, TreeNode *lenthh) {
ceng = too; t = lenthh;
}
};
int Level_Find(jie J)
{
if (J.t == NULL)
return -1;
int Sum = 0, Max= -100007 ,C = J.ceng;
vector<pair<int, int>>res;
queue <jie >room;
room.push(J);
while (!room.empty())
{
jie save = room.front();
room.pop();
if (save.ceng != C)
{
res.push_back(make_pair(Sum, Max));
C = save.ceng ;
//cout <<"c="<< C <<" save_C ="<< save.ceng <<' '<< Sum <<" s m =" <<Max<<endl;
Sum = 0;
Max = -100007;
}
Sum += save.t->val;
Max = max(Max, save.t->val);
//cout << Sum << ' ' << Max <<endl;
if (save.t->left)
room.push(jie(save.ceng + 1, save.t->left));
if (save.t->right)
room.push(jie(save.ceng + 1, save.t->right));
}
int res_max = -INF,c_max = 0, d_max = 0;
for (int i = 0; i < res.size(); ++i)
{
if (res[i].first > res_max)
{
res_max = res[i].first;
d_max = res[i].second;
c_max = i + 1;
}
}
return c_max;
}
int maxLevelSum(TreeNode* root) {
return Level_Find(jie(1, root));
}
};