【二叉树】层数最深叶子节点的和

2023-10-27

题目描述

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

示例1

输入:root = [1,2,5,7,0,null,null]
输出:7

解题思路 

这道题正向思路是每一层都做一次计算,直到等到最后一层的结果;

TreeNode参考代码如下:

package org.example;

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode() {
    }

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

按照这个思路:

  • 第一层,结果为1;
  • 第二层,结果为7;
  • 第三层,结果也为7;
  • 返回最后一层结果;

为了能解决上述问题,我使用了队列(java中的Deque),代码实现如下:

import org.example.TreeNode;

import java.util.Deque;
import java.util.LinkedList;

public class Solution3 {
    
    public int deepestLeavesSum(TreeNode root) {

        Deque<TreeNode> deque = new LinkedList<>();
        if (root != null) {
            deque.offer(root);
        }

        int sum = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            sum = 0;
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                sum += node.val;
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
            }
        }
        return sum;
    }


    public static void main(String[] args) {
        Solution3 solution = new Solution3();

        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.left.left.left = new TreeNode(7);
        root.right.right = new TreeNode(6);
        root.right.right.right = new TreeNode(8);

        System.out.println(solution.deepestLeavesSum(root));

    }
}

为了能够提升效率,这里我使用dfs做改造,完全使用递归核心逻辑:

  • 如果节点为null,直接返回;
  • 如果节点所在层数大于最大层数,则让最大层数加一,同时将结果设置成0;
  • 如果节点所在层数等于最大层数,则做加法,结果加上根节点的value;
  • 然后递归调用代码;

具体代码实现如下:


import org.example.TreeNode;

public class Solution {

    int maxLevel = 0;
    int res = 0;

    public int deepestLeavesSum(TreeNode root) {

        dfs(root, 0);
        return res;
    }

    private void dfs(TreeNode root, int level) {
        if (root == null) {
            return;
        }

        if (maxLevel < level) {
            maxLevel = level;
            res = 0;
        }

        if (level == maxLevel) {
            res += root.val;
        }

        dfs(root.left, level + 1);
        dfs(root.right, level + 1);
    }


    public static void main(String[] args) {
        Solution solution = new Solution();

        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.left.left.left = new TreeNode(7);
        root.right.right = new TreeNode(6);
        root.right.right.right = new TreeNode(8);

        System.out.println(solution.deepestLeavesSum(root));

    }

 这个是2代码实现的耗时差别,1ms的使用dfs,6ms的是最初的解决思路。

 

总结

这道题是一道中等难度的二叉树遍历的题目,如果对二叉树DFS和BFS都比较清楚,能快速的解决这个问题。如果有更快、更简洁的代码实现欢迎回复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【二叉树】层数最深叶子节点的和 的相关文章

随机推荐

  • 内网穿透代理(NPS)搭建以及使用

    与公众号同步更新公众号文章链接 内网穿透代理 NPS 搭建以及使用 部署前提需要一台公网服务器 各大云piao 获取到服务器后需要放行服务器端口 建议所有端口 ALL 新建一个NPS文件夹 mkdir NPS 进入NPS文件夹 cd NPS
  • Go语言面试题--基础语法(11)

    文章目录 1 定义一个包内 全局 字符串变量 下面语法正确的是 2 下面这段代码输出什么 3 下面这段代码输出什么 1 定义一个包内 全局 字符串变量 下面语法正确的是 A var str string B str C str D var
  • 彻底搞懂Vue中的Mixin混入(保姆级教程)

    彻底搞懂Vue中的Mixin混入 保姆级教程
  • 【IC设计】EDA palyground使用

    有时候我们在外地无法使用vivado等工具来进行Verilog编程 可以使用这个在线网站www edaplayground com 这个笔记记录一些需要注意的点 它会自动帮我们建立一个testbench sv 里面写入testbench 需
  • HTML5-画布使用教程

    1 简介画面的基本使用教程 CSS绘图和数据存储原理 橘猫吃不胖 的博客 CSDN博客
  • Python 读取txt文件每一行数据生成列表

    本意是将数据 改为如下形式 push lea push mov call mov mov pop retn mov jmp push mov mov call test jz push call add mov pop retn mov m
  • .PersistenceException: ### Error querying database.Cause: java.lang.NullPointerException

    错误 org apache ibatis io ResolverUtil Checking to see if class com wei mapper UserMapper matches criteria is assignable t
  • c++ protobuf 可能会遇到的坑

    1 发现存在内存泄露 程序退出时记得调用 google protobuf ShutdownProtobufLibrary 这里一定是在程序退出时调用 如果调用后又使用了 protobuf 会出现异常 因为protobuf 中使用构造 会有创
  • Mysql undo log

    一 基本概念 undo log有两个作用 1 为事务提供回滚 2 多版本并发控制 MVCC undo log和redo log记录物理日志不一样 它是逻辑日志 可以认为 当delete操作时 undo log记录的是insert记录 反之亦
  • 【Leetcode】1684. Count the Number of Consistent Strings

    题目地址 https leetcode com problems count the number of consistent strings 给定一个字符串 a a a和一个字符串数组 A A A 问
  • 单链表学习笔记(C语言)

    单链表学习笔记 C语言 一 说明 1 链表 所谓链表 就是用一组任意的存储单元存储线性表元素的一种数据结构 2 结构 链表的每个数据的存储都由两部分组成 1 数据元素本身 其所在的区域称为数据域 2 指向直接后继元素的指针 所在的区域称为指
  • RocketMQ消费者设置了instanceName属性后消息竟不翼而飞

    文章目录 背景 问题重现 生产者代码 消费者代码 紊乱的消费结果 原因分析 消费负载均衡 clientId怎么生成 为什么会生成相同的clientId 解决方案 方案一 不设置instanceName属性 方案二 两个消费者设置不同的ins
  • 踩坑:Python找不到指定路径的文件 最全解决方法

    数据集为ucr时间序列数据集 其中 Adiac文件夹中的文件可以通过下面的代码打开 其他文件格式与Adiac相同 且在同一个目录文件下 跑其他的文件 会出现某某文件不存在的问题 网上找了各种解决方法都尝试了 依然还是会报文件找不到错误 最后
  • 程序媛菜鸡算法题流水账之ZJU机试题

    最近考研分数线还没有正式公布 感觉自己处在危殆边缘 于是分岔路口之多令我眼花缭乱 将近八个月没有碰过IDE 机试路漫漫 且行且记忆 ZJU机试题 from NewCoder 做题顺序为通过率递减 同时推荐用C 用时真的少很多 虽然我选修过但
  • Llama-2大模型本地部署研究与应用测试

    最近在研究自然语言处理过程中 正好接触到大模型 特别是在年初chatgpt引来的一大波AIGC热潮以来 一直都想着如何利用大模型帮助企业的各项业务工作 比如智能检索 方案设计 智能推荐 智能客服 代码设计等等 总得感觉相比传统的搜索和智能化
  • 【GD32】FreeRTOS-ADC-DMA采集

    本文章介绍ADC多通道采集DMA进行传输 并且在任务中实时去获取数据 一 时钟配置 分别配置GPIO ADC DMA时钟 static void SystemClock Configration void rcu periph clock
  • Autofac的AOP面向切面编程研究

    什么是AOP 我的理解是 把系统性的编程工作封装起来 我给这个取个名字叫 Aspect 然后通过AOP技术把它切进我们的业务逻辑代码 业务 这样的好处 Aspect 和 业务 相互独立 既可以让 业务 用到了 Aspect 又让2者互相独立
  • 8.1 霍纳法则

    以下是一个典型的多项式运算 int y 4 x x x x 9 x x x 2 x x 7 x 1 这个表达式能不能性能优化 细数一下这个表达式用了4 3 2 1 10次乘法 同时用到了4次加法 可以优化为 int y 4 x 9 x 2
  • django中使用celery和rabbitmq

    第一步先安装celery pip install django celery 第二步安装rabbitmq sudo apt get install rabbitmq server 添加用户 sudo rabbitmqctl add user
  • 【二叉树】层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回 层数最深的叶子节点的和 示例1 输入 root 1 2 5 7 0 null null 输出 7 解题思路 这道题正向思路是每一层都做一次计算 直到等到最后一层的结果 TreeNode参