[路飞]_程序员必刷力扣题: 1302. 层数最深叶子节点的和

179 阅读1分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

1302. 层数最深叶子节点的和

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

示例1:

image.png

输入: 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, 104] 之间。
  • 1 <= Node.val <= 100

递归遍历

思路 由题可得我们需要求最大深度的所有叶子节点的和

  • 我们需要一个变量来保存当前的层级深度,递归正好可以每一层+1来记录层级,所以这里我们使用递归遍历二叉树
  • 我们只需要求最大深度的和,其他不需要,这里我们可以直接用一个变量res来保存最大深度的叶子节点的和,并且用变量maxN记录当前深度
    • 如果遇到同一深度的值则res+=当前叶子节点的值
    • 如果遇到更大深度的叶子节点,需要更新maxN,以及重置res的值为当前节点的值为当前叶子结点的值

具体实现:

  • 声明最外层变量最大深度maxN以及当前累加的和res
  • 用一个递归函数recursion,我们需要传入一个树节点,并且传入对应节点深度,每次递归深度n+1
  • 处理边界条件; 如果传入的节点root为空则直接return
  • 处理正常节点
    • 如果不是叶子节点,则继续递归处理左右子树,深度n+1
    • 如果是叶子结点,则需要判断当前节点深度
      • 如果当前深度===maxN,则res累加当前节点的值
      • 如果当前深度>maxN,则res重置为当前节点的值
      • 如果当前深度<maxN,无需处理
  • 调用递归函数,传入root以及当前深度1,开始遍历 最后直接返回res的值即可
var deepestLeavesSum = function (root) {
    // 递归遍历
    var maxN = 1
    var res = 0
    function recursion(root, n) {
        if (!root) return
        if (!root.left && !root.right) {
            // 叶子结点
            if(n === maxN){
                res+=root.val
            }else if(n>maxN){
                res = root.val
                maxN = n
            }
        } else {
            recursion(root.left,n+1)
            recursion(root.right,n+1)
        }
    }
    recursion(root,1)
    return res
};