携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
快乐周三,虽然这周要上线,但是并不影响马上要到周末了嘿嘿嘿
层数最深叶子结点的和
该题出自力扣的1302题 —— 层数最深叶子结点的和【中等题】,这道题本身也就是披着羊皮的狼罢了,二叉树难免避不开遍历
审题
给你一棵二叉树的根节点
root,请你返回 层数最深的叶子节点的和 。
- 这道题并不复杂,就是给出二叉树的根节点,返回该二叉树的最深层数的叶子节点的和
- 叶子节点,顾名思义就是节点下不存在左右节点了
- 可以使用深度或者广度去解决该题
- 如果是使用广度遍历的话,可以找到最深的一层,并且对所有的节点相加之和
- 如果是使用深度遍历的话,那也是需要每次对分支遍历到最底层,并且需要判断底层是否为最深
- 本次解法使用了深度遍历
- 首先需要定义两个变量,分别是最大值和最深深度
- 定义一个方法,主方法只需要调用该方法即可
- 深度遍历方法需要携带一个参数,当前层数
- 判断左节点是否为空,如果不为空,则递归进入该方法,并且深度加一
- 右节点也是一样,判断后递归进入
- 再次判断,当前深度是否大于全局变量的最大深度,如果是则取代并设置最大深度的最大值为当前的value
- 否则直接全局变量最大值相加
- 时间复杂度O(n),因为需要递归执行整个二叉树,去寻找最大深度
- 空间复杂度O(n),递归导致调用栈的深度,取决于二叉树的深度,因此也是需要空间消耗
编码
class Solution {
public int deepestLeavesSum(TreeNode root) {
return deep(root,1);
}
int max = 0;
int maxDeep = 0;
public int deep(TreeNode root, int i){
if (root.left != null){
deep(root.left,i + 1);
}
if (root.right != null){
deep(root.right,i + 1);
}
if (maxDeep < i){
max = root.val;
maxDeep = i;
}else if (maxDeep == i){
max+=root.val;
}
return max;
}
}