LeetCode题练习与总结:二叉树的所有路径--257

news2024/10/1 10:15:24

一、题目描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

二、解题思路

这是一个深度优先搜索(DFS)的问题。我们可以使用递归的方式来遍历二叉树,并记录从根节点到叶子节点的路径。以下是解题步骤:

  1. 如果当前节点为空,直接返回空列表。
  2. 如果当前节点是叶子节点(没有左右子节点),则将当前路径加入到结果列表中。
  3. 如果当前节点不是叶子节点,递归地遍历其左右子节点,并在递归调用时将当前节点的值添加到路径字符串中。
  4. 在每次递归调用结束后,需要将路径字符串回溯到之前的状态,以便进行其他分支的搜索。

三、具体代码

import java.util.ArrayList;
import java.util.List;

// TreeNode类定义在Solution类的外部
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> paths = new ArrayList<>();
        if (root == null) {
            return paths;
        }
        dfs(root, "", paths);
        return paths;
    }

    private void dfs(TreeNode node, String path, List<String> paths) {
        if (node.left == null && node.right == null) {
            // 当前节点是叶子节点,将路径加入结果列表
            paths.add(path + node.val);
            return;
        }
        // 当前节点不是叶子节点,继续递归遍历左右子节点
        if (node.left != null) {
            dfs(node.left, path + node.val + "->", paths);
        }
        if (node.right != null) {
            dfs(node.right, path + node.val + "->", paths);
        }
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对于二叉树中的每个节点,我们都会访问一次。
  • 在访问每个节点时,我们会进行以下操作:
    • 检查当前节点是否是叶子节点。
    • 如果不是叶子节点,递归地访问左右子节点。

由于每个节点都会被访问一次,并且对于每个节点,我们只进行常数时间的操作(除了递归调用),所以时间复杂度主要取决于节点的数量。

时间复杂度 = O(N),其中 N 是二叉树中节点的数量。

2. 空间复杂度
  • 空间复杂度主要取决于递归调用的深度和存储路径的列表。
  • 在最坏的情况下,二叉树是完全不平衡的(例如,每个节点只有左子节点或只有右子节点),递归调用的深度将达到 N(树的高度)。
  • 同时,我们还需要存储所有从根节点到叶子节点的路径,这些路径的数量取决于叶子节点的数量。在最坏的情况下,如果每个节点都是叶子节点,那么路径的数量也是 N。

空间复杂度分析如下:

  • 递归栈空间:O(N)(最坏情况下,树的高度为 N)。
  • 存储路径的列表:O(N)(最坏情况下,每个节点都是叶子节点,路径数量为 N)。

总的空间复杂度是递归栈空间和存储路径列表空间的总和,但由于我们在分析空间复杂度时通常只考虑最占空间的项,因此空间复杂度为 O(N)。

五、总结知识点

  • 类定义

    • TreeNode 类定义了二叉树的节点结构,包括节点值 val 以及指向左右子节点的引用 left 和 right
    • Solution 类包含了解决给定问题的方法。
  • 构造函数

    • TreeNode 类中有三个构造函数,分别用于创建一个没有子节点的节点、一个只有值没有子节点的节点,以及一个具有值和子节点的节点。
  • 数据结构

    • List<String> 用于存储从根节点到叶子节点的路径字符串。
    • ArrayList 是 List 接口的一个实现,提供了动态数组的功能。
  • 递归

    • dfs 方法是一个递归方法,用于深度优先搜索二叉树,并构建路径字符串。
    • 递归的基本情况是到达叶子节点,递归的递推步骤是遍历左右子节点。
  • 字符串操作

    • 使用 + 运算符来拼接字符串,构建从根节点到当前节点的路径。
  • 条件语句

    • 使用 if 语句来检查当前节点是否为叶子节点,以及是否需要递归遍历左右子节点。
  • 返回值

    • binaryTreePaths 方法返回一个包含所有路径的列表。
    • dfs 方法不直接返回值,但通过引用传递的 paths 列表来存储路径。
  • 方法重载

    • TreeNode 类的构造函数通过不同的参数列表实现了方法重载。
  • 方法访问修饰符

    • public 和 private 关键字用于控制方法访问权限,public 表示该方法可以被外部类访问,而 private 表示该方法只能在本类内部访问。
  • 参数传递

    • String 类型的参数 path 在 dfs 方法中被传递和修改,这体现了 Java 中的值传递特性,但由于 String 是不可变的,实际上每次修改都是创建了新的字符串对象。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ基本原理

一、基本结构 所有中间件技术都是基于 TCP/IP 协议基础之上进行构建新的协议规范&#xff0c;RabbitMQ遵循的是AMQP协议&#xff08;Advanced Message Queuing Protocol - 高级消息队列协议&#xff09;。 生产者发送消息流程&#xff1a; 1、生产者和Broker建立TCP连接&#…

国庆同欢,祖国昌盛!肌肉纤维启发,水凝胶如何重构聚合物

在这个国庆佳节&#xff0c;我们共同感受祖国的繁荣昌盛&#xff0c;同时也迎来了知识的探索之旅。今天来了解聚合物架构的重构的研究——《Hydrogel‐Reactive‐Microenvironment Powering Reconfiguration of Polymer Architectures》发表于《Advanced Science》。材料科学不…

【数据结构与算法】算法和算法分析

文章目录 一.算法1.定义2.描述 二.算法与程序三.算法特性四.算法效率的度量4.1算法时间事前分析法算法时间复杂度的渐进表示法分析算法时间复杂度的基本方法 4.2算法空间 数据的逻辑结构映像到内存就是数据的存储结构&#xff0c;针对数据的逻辑结构可以选择多种存储结构。数据…

Kotlin:2.0.0 的新特性

一、概述 kotlin 2.0.0版本英文官方文档 The Kotlin 2.0.0 release is out and the new Kotlin K2 compiler is Stable! Additionally, here are some other highlights: Kotlin 2.0.0发布了&#xff0c;新的Kotlin K2编译器已经稳定了。此外&#xff0c;以下是其他一些亮点: …

Linux操作系统中dubbo

1、简介 dubbo框架是做微服务通信的&#xff0c;是由阿里巴巴开发&#xff0c;后捐赠给阿帕奇基金会。 2、与OpenFeign的区别 dubbo是采用RPC协议实现微服务通信&#xff0c;OpenFeign是采用Http请求的方式实现的。 OpenFeign 最简单的&#xff0c;就是Spring公司开发的&am…

TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点

论文标题&#xff1a; 英文&#xff1a;TinyAP: An intelligent Access Point to combat Wi-Fi attacks using TinyML中文&#xff1a;TinyAP&#xff1a;使用TinyML对抗Wi-Fi攻击的智能接入点 作者信息&#xff1a; Anand Agrawal 和 Rajib Ranjan Maiti&#xff0c;来自印…

C语言常用标准库 -- 5.<time.h>

目录 引言 5. C标准库--time.h 5.1 简介 5.2 常量与宏 5.3 库变量 5.4 库宏 5.5 库函数 5.6 注意事项 &#x1f308;你好呀&#xff01;我是 程序猿 &#x1f30c; 2024感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;…

线程池面试集

目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…

【docker学习】Linux系统离线方式安装docker环境方法

centos7-linux安装docker(离线方式) 下载docker的安装文件 https://download.docker.com/linux/static/stable/x86_64/ 下载的是&#xff1a;docker-18.06.3-ce.tgz 这个压缩文件 将docker-18.06.3-ce.tgz文件上传到centos7-linux系统上&#xff0c;用ftp工具上传即可 解压…

《RabbitMQ篇》基本概念介绍

MQ功能 解耦 MQ允许不同系统或组件之间松散耦合。发送者和接收者不需要直接连接&#xff0c;从而提高了系统的灵活性和可维护性。异步处理 使用MQ可以实现异步消息传递&#xff0c;发送者可以将消息放入队列后立即返回&#xff0c;不必等待接收者处理。这提高了系统的响应速度…

鸿蒙NEXT开发-ArkTS(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

Spring IoC笔记

目录 1.什么是 IoC&#xff1f; 2.IoC类注解&#xff08;五大注解&#xff09; 2.1那为什么要这么多类注解&#xff1f; 2.2五大注解是不是可以混用&#xff1f; 2.3程序被spring管理的条件是&#xff1f; 3.bean对象 3.1Bean 命名约定 3.2获取bean对象 4.⽅法注解 B…

《应急通信产业发展研究报告》蓝皮书解读

近日&#xff0c;中国信通院发布了《应急通信产业发展研究报告》蓝皮书&#xff0c;该报告是对中国应急通信产业现状、发展趋势及其政策环境的综合分析&#xff0c;旨在为行业发展提供参考与指导。以下是小编对该蓝皮书的一些内容解读&#xff1a; 1.应急通信的重要性 应急通信…

2.点位管理|前后端如何交互——帝可得后台管理系统

目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数3. 合作商4.区域管理中添加查看详情功能5.合作商添加点位…

【拥抱AIGC】通义灵码扩展管理

通义灵码提供了扩展管理&#xff0c;支持自定义指令&#xff0c;满足企业编码场景的扩展诉求。 适用版本 企业标准版、企业专属版 通义灵码管理员、组织内全局管理员&#xff08;专属版&#xff09;在通义灵码控制台-扩展管理中&#xff0c;进行自定义指令的管理、查看自定义…

解锁数据宝藏:AI驱动搜索工具,让非结构化数据“说话

哈哈,说起这个 AI 搜索演示啊,那可真是个有意思的话题!非结构化数据,这家伙虽然难搞,但价值却是杠杠的。今天呢,咱就好好聊聊怎么借助 Fivetran 和 Milvus,快速搭建一个 AI 驱动的搜索工具,让企业能从那些乱七八糟的数据里淘到金子! 一、非结构化数据的挑战与机遇 首…

PCL 点云条件滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 条件定义与滤波 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

Python从入门到高手4.1节-掌握条件控制语句

目录 4.1.1 理解条件控制 4.1.2 if, elif, else 4.1.3 条件表达式 4.1.4 条件控制可以嵌套 4.1.5 if语句的三元运算 4.1.6 国庆节快乐 4.1.1 理解条件控制 在日常生活中&#xff0c;我们常喜欢说如果, "如果怎么样&#xff0c;那么就会怎么样"。"如果&qu…

240930_CycleGAN循环生成对抗网络

240930_CycleGAN循环生成对抗网络 CycleGAN&#xff0c;也算是笔者记录GAN生成对抗网络的第四篇&#xff0c;前三篇可以跳转 240925-GAN生成对抗网络-CSDN博客 240929-DCGAN生成漫画头像-CSDN博客 240929-CGAN条件生成对抗网络-CSDN博客 在第三篇中&#xff0c;我们采用了p…

【Lazy ORM +Netty+DB开发一个内网渗透工具 wu-lazy-cloud-network(1.2.8-JDK17-SNAPSHOT)】

【Lazy ORM NettyDB开发一个内网渗透工具 wu-lazy-cloud-network&#xff08;1.2.8-JDK17-SNAPSHO&#xff09;】 环境 Java 17Spring Boot 3.xLazy ORMNettyMysql、H2 更新日志 版本1.2.8-JDK17-SNAPSHOT [change] 原《内网穿透》更改为服务端渗透客户端 [change] 新增服务…