携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
前言
今天的题目为中等,但是题目整体比较简单,通过BFS或者DFS都可以实现,只要掌握两种遍历树的方式,这道题应该没有什么难度。
每日一题
今天的题目是 1302. 层数最深叶子节点的和,难度为中等
- 给你一棵二叉树的根节点 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
题解
DFS
深度优先遍历,首先我们要了解一下深度优先遍历的一个顺序,我们会先不断遍历左孩子直到左孩子为空,然后去遍历右孩子,利用这一点,我们能够记录下树遍历到过的最深深度.
通过深度优先遍历,我们可以不断地更新一个最深深度的值,一旦当前的深度比这个值更深,那么就更新这个值,并且纪录下当前的val,这也就是我们需要返回的第一个结点,如果当前的深度已经是最深的了,那么之后再碰到这个深度的结点,就将值加入答案,如果当前纪录的深度不是最深的,就更新最深深度,并且对答案重新赋值为当前结点的值。
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function deepestLeavesSum(root: TreeNode | null): number {
if (root == null) return
let maxLevel = -1
let ans = 0
const dfs = (root: TreeNode | null, level: number) => {
if (root == null) return
if (level > maxLevel) {
maxLevel = level;
ans = root.val;
} else if (level == maxLevel) {
ans += root.val;
}
dfs(root.left, level + 1);
dfs(root.right, level + 1);
}
dfs(root,0)
return ans
};
BFS
层序优先遍历,遍历每一层,那么比起深度优先遍历,我们就不需要纪录下最大的深度,因为层序优先遍历的最后一次循环,就一定是这个树的最后一层,我们只需要纪录下遍历到最后一层的时候,所有的val相加的值即可。
我们可以设定一个答案值,在遍历每一层的时候将这个值清除为0,一直到最后一层,就可以通过当前结点是否没有左孩子也没有右孩子来判断是否是最后的结点。
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function deepestLeavesSum(root: TreeNode | null): number {
let ans = 0
const queue = [root]
while (queue.length) {
const size = queue.length
ans = 0
for (let i = 0; i < size; i++) {
const node = queue.shift()
node.left && queue.push(node.left)
node.right && queue.push(node.right)
if(!node.left && !node.right) ans+=node.val
}
}
return ans
};