「这是我参与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) // 将最后一层的也就是最深层数的叶子节点的值取出进行求和并输出
};
我们各有各的雪,各有各的月,我们互相皎洁,也互相圆缺。我有一把蝴蝶,你怀里有风应该也能驱散弥迷的夜。他们一定是爱上了四野的风,和藏在山林里的梦,还好有千万束光照进了他们难捱的冬。
如有任何问题或建议,欢迎留言讨论!