层数最深叶子节点的和

70 阅读2分钟

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

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是处于什么原因,算法学习需要持续保持,今天让我们一起来看看这一道题目————层数最深叶子节点的和

题目描述

给你一棵二叉树的根节点 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, 10^4] 之间。
1 <= Node.val <= 100

思路分析

题目的意思很明确,就是要我们统计层数最深的叶子节点的和 ,如例一中的最深层数为4层,其中位于4层的有两个节点,分别是7和8,所以我们的到的层数最深的叶子节点的和应该是7 + 8 = 15,所以解决这道题我们只需要解决以下两个关键问题即可:1、判断当前节点是不是最深层级;2、更新层数最深的叶子节点的和。具体步骤如下:

  • 1、遍历二叉树

关于二叉树的遍历我们也都做过不少题目了,这里可以任选一种遍历方式来进行遍历,这里我直接使用先序遍历。

function dfs(r,deep){
    ……
    if(r.left) dfs(r.left,deep+1);
    if(r.right) dfs(r.right,deep+1);
}
  • 2、更新当前节点最深层级

遍历的时候判断一下当前的层级是否大于记录的最深层级,如果是大于记录的最深层级,我们应该要更新当前层级为最深层级,且将节点和重置为当前节点值。

if(deep > maxd){
    maxd = deep;
    sum = r.val;
}
  • 3、更新层数最深的叶子节点的和

如果遍历的层级与记录的最深层级相等,我们需要将节点和加上当前节点的值。

if(deep == maxd){
    sum += r.val;
}

AC代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var deepestLeavesSum = function(root) {
    let maxd = 0,
        sum = 0;
    function dfs(r,deep){
        if(deep > maxd){
            maxd = deep;
            sum = r.val;
        }
        if(deep == maxd){
            sum += r.val;
        }
        if(r.left) dfs(r.left,deep+1);
        if(r.right) dfs(r.right,deep+1);
    }
    dfs(root,1);
    return sum;
};

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。