层数最深的叶子节点和

123 阅读2分钟

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

层数最深的叶子节点和

描述

给你一颗二叉树根节点root,你需要返回二叉树最深的所有叶子节点和。

image.png

如上图二叉树,叶子节点有7,5,8三个节点,但其中节点5只有三层,而节点7和8都是四层,那最深就是叶子节点7和8,两者值相加等于15,所以返回结果是15。

分析

叶子节点判断很简单,就是左右子节点都等于null,但现在最主要的是需要知道最深的所有叶子节点,然后再求和返回。

或者我们知道二叉树的最大层级,再把最大层级的节点值求和也是正确的结果。

那如何实现呢?

大体有两种思路,之前也都说过,广度优先搜索(BFS)和深度优先搜索(DFS)。

广度优先搜索是将每层节点进行循环,如果不是最后一层级的话,则不需要累加节点值,只需要对最后一层级,也就是最深的叶子节点了,进行求和运算返回,难点在于怎么设计仅对每一层级单独组合。

深度优先搜索不断循环每一条向下路径,直到最后一层再走第一条路径,因为这样不能横向对比,不知道当前最深层级是否是整个二叉树的最大层级,这样我们需要保存当前层级作为最大层级,并且当前分支的最大层级值作为总和的初始值,以后的每次路径循环都与之前最大层级进行比较,若等于,则继续累加,若小于不用处理,大于则说明目前最大层级在当前路径中。

程序实现

根据以上深度优先搜索的分析,代码实现如下:

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