LeetCode探索(108):1161-最大层内元素和

508 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情 >>

题目

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

示例 1:

img

输入: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) 个节点。

参考