LeetCode探索(124):1302-层数最深叶子节点的和

122 阅读1分钟

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

题目

给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和

示例 1:

img

输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15

示例 2:

输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出:19

提示:

  • 树中节点数目在范围 [1, 10^4] 之间。
  • 1 <= Node.val <= 100

思考

本题难度中等。

首先是读懂题意。题目很简单,也就是给出一棵二叉树的根节点 root ,我们需要返回层数最深的叶子节点的和。

我们可以使用深度优先搜索的方法来解决问题。定义最深的一层节点的和为 sum,最深一层的层数为 maxLevel(初始值设置为 -1),根节点的层数为0。遍历二叉树,判断节点是否为同一层,若是则将节点的值加到 sum 上,如果是下一层,则更新 sum 为 0,继续累加新一层的节点的值。最后,返回 sum 的值即可。

此外,我们不难想到 Leetcode 102.二叉树的层序遍历 的题目,与本题很类似。Leetcode 102 是遍历二叉树的每一层,并把相同层的节点存入同一个数组中。那么。我们可以借用该方法,先是得出由二叉树的不同层组成的数组,返回数组最后的一个元素(即二叉树最深的一层的所有节点),再对该节点数组遍历求和即可,也就是广度优先搜索的方法。

解答

方法一:深度优先搜索

/**
 * @param {TreeNode} root
 * @return {number}
 */
var deepestLeavesSum = function(root) {
  let maxLevel = -1
  let sum = 0
  const dfs = (node, level) => {
    if (!node) {
      return
    }
    if (level > maxLevel) {
      maxLevel = level
      sum = node.val
    } else if (level === maxLevel) {
      sum += node.val
    }
    dfs(node.left, level + 1)
    dfs(node.right, level + 1)
  }
  dfs(root, 0)
  return sum
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。深度优先搜索需要遍历每个节点一次。
  • 空间复杂度:O(n)。

方法二:广度优先搜索

/**
 * @param {TreeNode} root
 * @return {number}
 */
var deepestLeavesSum = function(root) {
  let levelArr = levelOrder(root)
  let deepestLevel = levelArr[levelArr.length - 1]
  return deepestLevel.reduce((sum, item) => sum + item, 0)
}
// 二叉树的层序遍历
var levelOrder = function(root) {
  const res = []
  if(!root) {
    return res
  }
  const q = [] // 队列
  q.push(root)
  while(q.length > 0) {
    let size = q.length
    res.push([])
    while(size > 0) {
      const node = q.shift()
      res[res.length - 1].push(node.val) // 存储每层的所有节点
      if (node.left) q.push(node.left)
      if (node.right) q.push(node.right)
      size--
    }
  }
  return res
}

复杂度分析:

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。
  • 空间复杂度:O(n)。

参考