题目
给你一个二叉树的根节点 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, 10^4]
范围内 -10^5 <= Node.val <= 10^5
解题
方法一:二叉树 DFS
思路
层序遍历二叉树,把每层加和存入列表集合,然后取列表集合中最大的数的索引中最小的加 1 即可。
代码
class Solution {
private List<Integer> levelSums = new ArrayList<>();
public int maxLevelSum(TreeNode root) {
dfs(root, 0);
int maxIdx = 0;
for (int i = 0; i < levelSums.size(); i++) {
if (levelSums.get(i) > levelSums.get(maxIdx)) maxIdx = i;
}
return maxIdx + 1;
}
private void dfs(TreeNode node, int level) {
if (level == levelSums.size()) levelSums.add(node.val);
else levelSums.set(level, levelSums.get(level) + node.val);
if (node.left != null) dfs(node.left, level + 1);
if (node.right != null) dfs(node.right, level + 1);
}
}
// 关闭同步流
int _ = []() {
ios::sync_with_stdio(false);
cin.tie(0);
return 0;
}();
class Solution {
public:
vector<int> level_sums;
void dfs(TreeNode* node, int level) {
if (level == level_sums.size()) level_sums.push_back(node->val);
else level_sums[level] += node->val;
if (node->left) dfs(node->left, level + 1);
if (node->right) dfs(node->right, level + 1);
}
int maxLevelSum(TreeNode* root) {
dfs(root, 0);
int max_idx = 0, n = level_sums.size();
for (int i = 0; i < n; i++) {
if (level_sums[i] > level_sums[max_idx]) max_idx = i;
}
return max_idx + 1;
}
};
评论区