[路飞][LeetCode]1302_层数最深叶子节点的和

143 阅读1分钟

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

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

示例 1:

输入: 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

解题思路

  • 我们使用层序遍历
  • 计算最后一层的和

解题代码

var deepestLeavesSum = function(root) {
    if(!root) return 0;
    let sum = 0;
    let queue = [root]
    while(queue.length){ // 只要queue中还有元素也就是还没到最深层,一直进行迭代
        sum = 0  // 重置sum
        const len = queue.length
        for(let i=0;i<len;i++){ 
            const node = queue.shift(); // 将当前层的元素取出
            sum = sum + node.val; // 进行求和
            node.left && queue.push(node.left); // 将下一层的左子树元素塞入数组
            node.right && queue.push(node.right); // 将下一层的右子树元素塞入数组
        }
    }
    return sum
};

优化写法

  • 我们用一个二维数组来存储每层的元素
  • 利用程序遍历,将每层的元素放置到对应的数组中
  • 对左右叶子结点进行递归
  • 对最深的一层的节点进行求和操作
  • 输出求和的结果
var deepestLeavesSum = function(root) {
    let arr=[]  // 用于存储每层元素值的数组
    function dfs(node,depth){ // 
        if(!node)return 
        if(!arr[depth])arr[depth]=[]; // 对arr[depth] 进行初始化
        arr[depth].push(node.val)
        dfs(node.left,depth+1)  // 递归左子树
        dfs(node.right,depth+1)  // 递归右子树
    }
    dfs(root,0)
    return arr.pop().reduce((sum,cur)=>sum+cur) // 将最后一层的也就是最深层数的叶子节点的值取出进行求和并输出
};

我们各有各的雪,各有各的月,我们互相皎洁,也互相圆缺。我有一把蝴蝶,你怀里有风应该也能驱散弥迷的夜。他们一定是爱上了四野的风,和藏在山林里的梦,还好有千万束光照进了他们难捱的冬。

如有任何问题或建议,欢迎留言讨论!