活动地址:CSDN21天学习挑战赛
一、题目
标题:层数最深叶子节点的和
给你一棵二叉树的根节点 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
二、解题
- 该题是二叉树的一个基础题型,解出该题的最简单方法就是通过递归找出最后一个叶子结点的编号,再利用二叉树的性质求出二叉树的高度以及最后一层的理论起始结点,最后通过遍历将最后一层中有值的结点进行相加即可得到结果;
- 而我在这一题当中使用的是另外一种方法,建立一个数组通过递归将每一层的结点数值累加到数组当中,比如第一层的数值总合我存储于 数组[ 0 ] 中,第二层的数值总和存储于 数组[ 1 ] 中;
2.1
- 建立一个数组用于存储每一层的数值总和,因为题目给定的最大结点个数是 10⁴ ,所以可以直接取一个不会小于范围的空间大小即可;
2.2
- 在计算最外层的方法内做的第一件事是将每一层的数值计算出总和,因为需要用到递归所以另外写了一个方法;
- 方法内传入根结点以及当前层数所存储的坐标号;
- 因为整型数组初始值就是 0 ,所以可以直接进行累加操作;
- 做完累加操作之后再对有没有左(右)孩子结点进行判断,因为孩子结点层数必定是下一层,故递归时传入的是左(右)孩子结点和当前层数存储坐标 + 1 的坐标号;
2.3
- 对每一层的数值进行累加完之后需要判断哪一层是最后一层;
- 因为一旦有一层没有结点那么下一层也必定没有结点,故可以通过循环找到首次没有结点的层数;
- 因为最后循环遍历到的是没有结点的一层,所以返回的是其前一层的数值累加结果;
三、代码分享及力扣评分
3.1 力扣评分
- 执行用时 1 ms ,内存消耗在 43.6 ~ 44.2 MB ;
3.2 代码分享
class Solution {
int[] nums = new int[100];
public int deepestLeavesSum(TreeNode root) {
count( root , 0 );
int Max = 1;
while( nums[Max] != 0 )
Max++;
return nums[Max - 1];
}
private void count( TreeNode node, int x ){
nums[x] += node.val;
if( node.left != null )
count( node.left , x + 1 );
if( node.right != null )
count( node.right , x + 1 );
}
}