LeetCode 1161: Maximum Level Sum of a Binary Tree (BFS)
LeetCode 1161We need the smallest level index with the maximum node-value sum.
Source: https://leetcode.com/problems/maximum-level-sum-of-a-binary-tree/
English
Idea
Run BFS level by level. For each level, compute the sum of node values. Track the best sum and the first level where it appears.
Complexity
Time: O(n), Space: O(w) where w is the maximum tree width.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxLevelSum(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int level = 1, bestLevel = 1;
long bestSum = Long.MIN_VALUE;
while (!q.isEmpty()) {
int sz = q.size();
long sum = 0;
for (int i = 0; i < sz; i++) {
TreeNode node = q.poll();
sum += node.val;
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
}
}func maxLevelSum(root *TreeNode) int {
q := []*TreeNode{root}
level, bestLevel := 1, 1
bestSum := math.MinInt64
for len(q) > 0 {
sz := len(q)
sum := 0
for i := 0; i < sz; i++ {
node := q[0]
q = q[1:]
sum += node.Val
if node.Left != nil {
q = append(q, node.Left)
}
if node.Right != nil {
q = append(q, node.Right)
}
}
if sum > bestSum {
bestSum = sum
bestLevel = level
}
level++
}
return bestLevel
}class Solution {
public:
int maxLevelSum(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int level = 1, bestLevel = 1;
long long bestSum = LLONG_MIN;
while (!q.empty()) {
int sz = q.size();
long long sum = 0;
while (sz--) {
TreeNode* node = q.front(); q.pop();
sum += node->val;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
}
};from collections import deque
class Solution:
def maxLevelSum(self, root: Optional[TreeNode]) -> int:
q = deque([root])
level = 1
best_level = 1
best_sum = float('-inf')
while q:
s = 0
for _ in range(len(q)):
node = q.popleft()
s += node.val
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
if s > best_sum:
best_sum = s
best_level = level
level += 1
return best_levelvar maxLevelSum = function(root) {
const q = [root];
let level = 1, bestLevel = 1;
let bestSum = -Infinity;
while (q.length) {
const sz = q.length;
let sum = 0;
for (let i = 0; i < sz; i++) {
const node = q.shift();
sum += node.val;
if (node.left) q.push(node.left);
if (node.right) q.push(node.right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
};中文
思路
按层序遍历(BFS)逐层统计节点值总和,记录最大层和以及首次达到该最大值的层号即可。
复杂度
时间复杂度 O(n),空间复杂度 O(w),w 为树的最大宽度。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public int maxLevelSum(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int level = 1, bestLevel = 1;
long bestSum = Long.MIN_VALUE;
while (!q.isEmpty()) {
int sz = q.size();
long sum = 0;
for (int i = 0; i < sz; i++) {
TreeNode node = q.poll();
sum += node.val;
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
}
}func maxLevelSum(root *TreeNode) int {
q := []*TreeNode{root}
level, bestLevel := 1, 1
bestSum := math.MinInt64
for len(q) > 0 {
sz := len(q)
sum := 0
for i := 0; i < sz; i++ {
node := q[0]
q = q[1:]
sum += node.Val
if node.Left != nil {
q = append(q, node.Left)
}
if node.Right != nil {
q = append(q, node.Right)
}
}
if sum > bestSum {
bestSum = sum
bestLevel = level
}
level++
}
return bestLevel
}class Solution {
public:
int maxLevelSum(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int level = 1, bestLevel = 1;
long long bestSum = LLONG_MIN;
while (!q.empty()) {
int sz = q.size();
long long sum = 0;
while (sz--) {
TreeNode* node = q.front(); q.pop();
sum += node->val;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
}
};from collections import deque
class Solution:
def maxLevelSum(self, root: Optional[TreeNode]) -> int:
q = deque([root])
level = 1
best_level = 1
best_sum = float('-inf')
while q:
s = 0
for _ in range(len(q)):
node = q.popleft()
s += node.val
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
if s > best_sum:
best_sum = s
best_level = level
level += 1
return best_levelvar maxLevelSum = function(root) {
const q = [root];
let level = 1, bestLevel = 1;
let bestSum = -Infinity;
while (q.length) {
const sz = q.length;
let sum = 0;
for (let i = 0; i < sz; i++) {
const node = q.shift();
sum += node.val;
if (node.left) q.push(node.left);
if (node.right) q.push(node.right);
}
if (sum > bestSum) {
bestSum = sum;
bestLevel = level;
}
level++;
}
return bestLevel;
};
Comments