携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 >>
题目
给你一个二叉树的根节点 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
思考
本题难度中等。
首先是读懂题意。给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
我们可以使用广度优先搜索的方法。定义数组 ret 存储每一层的节点和,数组长度表示层数。定义队列q存储每一层的所有节点。我们依次遍历二叉树,对每一层的所有节点的值求和,如果大于最大值maxSum,则更新节点和和层数。最后,返回层数即可。时间复杂度是O(n),其中 n 是二叉树的节点个数。而空间复杂度是O(n),因为在最坏情况下,数组 ret 中有 O(n) 个节点。
解答
方法一:广度优先搜索
/**
* @param {TreeNode} root
* @return {number}
*/
var maxLevelSum = function(root) {
let ans = 1, maxSum = root.val
let ret = [] // 存储每一层的节点和,数组长度表示层数
let q = [] // 队列q存储每一层的所有节点
q.push(root)
while (q.length > 0) {
const currentLevelSize = q.length
ret.push(0)
for (let i = 1; i <= currentLevelSize; ++i) {
const node = q.shift()
ret[ret.length - 1] += node.val
if (node.left) q.push(node.left)
if (node.right) q.push(node.right)
}
if (ret[ret.length - 1] > maxSum) {
maxSum = ret[ret.length - 1]
ans = ret.length
}
}
return ans
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是二叉树的节点个数。
- 空间复杂度:O(n)。最坏情况下,数组中有 O(n) 个节点。