「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
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
递归遍历
思路 由题可得我们需要求最大深度的所有叶子节点的和
- 我们需要一个变量来保存当前的层级深度,递归正好可以每一层+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
};