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;
}
};

新code和三年前nowLayer变量名一样诶。

Python

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
32
33
'''
LastEditTime: 2026-01-06 10:44:20
'''
from typing import Optional
from collections import deque

# # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right

class Solution:
def maxLevelSum(self, root: Optional[TreeNode]) -> int:
ans, maximum = 0, -1000000000
nowLayer = 0
q = deque([root])
while q:
nowLayer += 1
layerSum = 0
newQ = deque([])
for node in q:
layerSum += node.val
if node.left:
newQ.append(node.left)
if node.right:
newQ.append(node.right)
q = newQ
if layerSum > maximum:
maximum = layerSum
ans = nowLayer
return ans

Java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* @LastEditTime: 2026-01-06 10:54:39
*/
import java.util.Deque;
import java.util.ArrayDeque;

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int maxLevelSum(TreeNode root) {
int ans = 0, maximum = -1000000000;
int layerNum = 0;
Deque<TreeNode> q = new ArrayDeque<>();
q.offer(root);
while (!q.isEmpty()) {
layerNum++;
int layerSum = 0;
for (int i = q.size(); i > 0; i--) {
TreeNode node = q.poll();
layerSum += node.val;
if (node.left != null) {
q.offer(node.left);
}
if (node.right != null) {
q.offer(node.right);
}
}
if (layerSum > maximum) {
maximum = layerSum;
ans = layerNum;
}
}
return ans;
}
}

Golang

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
32
33
34
35
36
37
38
39
40
41
42
/*
* @LastEditTime: 2026-01-06 10:37:44
*/
package main

import "container/list"

/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxLevelSum(root *TreeNode) int {
ans, maximum := 0, -1000000000
nowLayer := 0
q := list.New();
q.PushBack(root)
for q.Len() > 0 {
nowLayer++
layerSum := 0
for t := q.Len(); t > 0; t-- {
nodeElement := q.Front()
node := nodeElement.Value.(*TreeNode)
q.Remove(nodeElement)
layerSum += node.Val
if node.Left != nil {
q.PushBack(node.Left)
}
if node.Right != nil {
q.PushBack(node.Right)
}
}
if layerSum > maximum {
maximum = layerSum
ans = nowLayer
}
}
return ans
}

Rust

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
32
33
34
35
36
37
38
39
/*
* @LastEditTime: 2026-01-06 13:26:09
*/
use std::rc::Rc;
use std::cell::RefCell;
use std::collections::VecDeque;

impl Solution {
pub fn max_level_sum(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let mut ans = 1;
let mut maximum = -1000000000;
let mut layer_num = 0;
let mut q: VecDeque<Rc<RefCell<TreeNode>>> = VecDeque::new();
if let Some(r) = root {
q.push_back(r);
}
while !q.is_empty() {
layer_num += 1;
let mut layer_sum = 0;
let size: usize = q.len();
for _ in 0..size {
let node_rc: Rc<RefCell<TreeNode>> = q.pop_front().unwrap();
let node: std::cell::Ref<'_, TreeNode> = node_rc.borrow();
layer_sum += node.val;
if let Some(left) = node.left.clone() {
q.push_back(left);
}
if let Some(right) = node.right.clone() {
q.push_back(right);
}
}
if layer_sum > maximum {
maximum = layer_sum;
ans = layer_num;
}
}
ans
}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源