算法小知识-----8.17-----层数最深叶子节点的和

112 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

快乐周三,虽然这周要上线,但是并不影响马上要到周末了嘿嘿嘿

层数最深叶子结点的和

该题出自力扣的1302题 —— 层数最深叶子结点的和【中等题】,这道题本身也就是披着羊皮的狼罢了,二叉树难免避不开遍历

审题

给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。

image.png

  • 这道题并不复杂,就是给出二叉树的根节点,返回该二叉树的最深层数的叶子节点的和
  • 叶子节点,顾名思义就是节点下不存在左右节点了
  • 可以使用深度或者广度去解决该题
    • 如果是使用广度遍历的话,可以找到最深的一层,并且对所有的节点相加之和
    • 如果是使用深度遍历的话,那也是需要每次对分支遍历到最底层,并且需要判断底层是否为最深
  • 本次解法使用了深度遍历
    • 首先需要定义两个变量,分别是最大值和最深深度
    • 定义一个方法,主方法只需要调用该方法即可
    • 深度遍历方法需要携带一个参数,当前层数
      • 判断左节点是否为空,如果不为空,则递归进入该方法,并且深度加一
      • 右节点也是一样,判断后递归进入
    • 再次判断,当前深度是否大于全局变量的最大深度,如果是则取代并设置最大深度的最大值为当前的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;
    }
}

image.png