LeetCode257. 二叉树的所有路径
257. 二叉树的所有路径
文章目录
- 257. 二叉树的所有路径
- 一、题目
- 二、题解
- 方法一:深度优先搜索递归
- 方法二:迭代
一、题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
![[图片]](https://img-blog.csdnimg.cn/1cb8e903612d4a438f504b7000355c61.png)
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
- 树中节点的数目在范围 [1, 100] 内
- -100 <= Node.val <= 100
二、题解
方法一:深度优先搜索递归
算法思路
题目要求找出二叉树从根节点到叶子节点的所有路径。我们可以使用深度优先搜索(DFS)来遍历二叉树,并在遍历的过程中记录从根节点到当前节点的路径。当遇到叶子节点时,我们将路径添加到结果集中。
具体实现
我们可以定义一个辅助函数findPath来进行深度优先搜索。该函数的参数包括当前节点root、结果集result,以及当前路径path。
- 如果当前节点root为空,直接返回,不进行任何操作。
- 如果当前节点是叶子节点(即没有左右子节点),将当前节点的值加入到path中,并将path添加到结果集result中。
- 如果当前节点有左子节点或右子节点(可能同时有),将当前节点的值加入到path中,并加入"->"来表示路径的连接。
- 对当前节点的左子节点和右子节点分别进行递归调用findPath函数。
在主函数binaryTreePaths中,我们调用findPath函数,并将结果集作为返回值返回。
class Solution {
public:// 辅助函数,用于进行深度优先搜索遍历void findPath(TreeNode *root, vector<string>& result, string path){if(root == nullptr) return; // 若当前节点为空,则直接返回if(!root->left && !root->right){// 若当前节点是叶子节点(没有左右子节点)path += to_string(root->val); // 将当前节点的值加入到路径中result.push_back(path); // 将完整的路径添加到结果集中}else if(root->left || root->right){// 若当前节点有左子节点或右子节点(可能同时有)path += to_string(root->val); // 将当前节点的值加入到路径中path += "->"; // 用"->"连接当前节点和后续节点}findPath(root->left, result, path); // 递归处理左子节点findPath(root->right, result, path); // 递归处理右子节点} // 主函数,用于返回所有从根节点到叶子节点的路径vector<string> binaryTreePaths(TreeNode* root) {vector<string> result; // 用于存储结果集findPath(root, result, ""); // 调用辅助函数进行深度优先搜索遍历return result; // 返回结果集}
};
算法分析
- 时间复杂度:对于二叉树的每个节点,我们只访问一次,同时每次添加路径到结果集的操作的时间复杂度是O(1)。因此,整个算法的时间复杂度是O(N),其中N是二叉树的节点数量。
- 空间复杂度:递归函数调用会占用栈空间,递归的深度最坏情况下是二叉树的高度H。在最坏情况下,二叉树可能是一个斜树,高度为N,此时空间复杂度为O(N)。但在一般情况下,二叉树的高度平衡,空间复杂度接近O(logN)。
方法二:迭代
算法思路:
我们可以使用栈来辅助遍历,并在栈中同时保存当前遍历的节点和从根节点到该节点的路径。
具体实现:
- 创建一个空的字符串数组 result,用于保存所有的路径。
- 创建两个栈 TreeSt 和 PathSt,分别用于辅助二叉树的深度优先搜索和记录从根节点到当前节点的路径。
- 如果给定的 root 为空,则直接返回空的结果数组 result。
- 将 root 节点压入栈 TreeSt,并将其值转换为字符串后压入栈 PathSt。
- 进入循环,当栈 TreeSt 不为空时,执行以下操作:
- 弹出栈 TreeSt 的栈顶节点 node,同时弹出栈 PathSt 的栈顶路径 path。
- 如果 node 是叶子节点(即没有左右子节点),将 path 添加到结果数组 result 中。
- 如果 node 有右子节点,将右子节点压入栈 TreeSt,并将当前路径 path + “->” + to_string(node->right->val) 压入栈 PathSt。
- 如果 node 有左子节点,将左子节点压入栈 TreeSt,并将当前路径 path + “->” + to_string(node->left->val) 压入栈 PathSt。
- 循环结束后,返回结果数组 result。
class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result; // 用于保存所有从根节点到叶子节点的路径的结果数组stack<TreeNode*> TreeSt; // 辅助深度优先搜索的栈,用于遍历二叉树stack<string> PathSt; // 记录从根节点到当前节点的路径的栈if (root == nullptr) {return result; // 如果根节点为空,直接返回空的结果数组}TreeSt.push(root); // 将根节点压入栈PathSt.push(to_string(root->val)); // 将根节点值转换为字符串并压入栈while (!TreeSt.empty()) { // 当栈不为空时,进行深度优先搜索TreeNode* node = TreeSt.top(); // 弹出栈顶节点TreeSt.pop();string path = PathSt.top(); // 弹出栈顶路径PathSt.pop();if (!node->left && !node->right) { // 如果当前节点是叶子节点,将路径加入结果数组result.push_back(path);}if (node->right) { // 如果当前节点有右子节点,将右子节点和对应路径压入栈TreeSt.push(node->right);PathSt.push(path + "->" + to_string(node->right->val));}if (node->left) { // 如果当前节点有左子节点,将左子节点和对应路径压入栈TreeSt.push(node->left);PathSt.push(path + "->" + to_string(node->left->val));}}return result; // 返回所有从根节点到叶子节点的路径的结果数组}
};
算法分析:
- 时间复杂度:遍历整个二叉树的时间复杂度为O(N),其中N是二叉树的节点数。在遍历的过程中,对于每个节点,都需要将其值转换为字符串,并将其添加到结果数组中,这些操作的时间复杂度都是O(1)。因此,总体的时间复杂度为O(N)。
- 空间复杂度:栈 TreeSt 和 PathSt 最坏情况下可能同时保存所有节点,因此它们的空间复杂度为O(N)。结果数组 result 最坏情况下也可能保存所有从根节点到叶子节点的路径,因此空间复杂度为O(N)。综合考虑,总体的空间复杂度为O(N)。
相关文章:
LeetCode257. 二叉树的所有路径
257. 二叉树的所有路径 文章目录 257. 二叉树的所有路径一、题目二、题解方法一:深度优先搜索递归方法二:迭代 一、题目 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点…...
ajax、axios、fetch的区别
ajax、axios、fetch 的区别 参考答案: ajax 是指一种创建交互式网页应用的网页开发技术,并且可以做到无需重新加载整个网页的情况下,能够更新部分网页,也叫作局部更新。 使用 ajax 发送请求是依靠于一个对象,叫 XmlHtt…...
Liunx开发工具
Liunx开发工具 1.Linux编辑器-vim使用1.1vim的基本概念1.2vim的基本操作1.3命令模式命令集1.3.1光标定位1.3.2光标移动1.3.3文本复制1.3.4文本操作 1.4插入模式命令集1.5底行模式命令集 2.vim配置3.sudo配置4.Linux编辑器-gcc/g使用4.1背景知识4.2gcc如何操作 5.函数库5.1函数库…...
Docker入门之运行Nginx案例
运行镜像 如果你直接安装会比较慢, 建议参照附录内容配置镜像之后再执行 # 执行命令过程一:下载容器镜像 docker run -d nginx:latest 命令解释 docker run 启动一个容器 -d 把容器镜像中需要执行的命令以daemon(守护进程)的方式运行 nginx…...
【深度学习环境】安装anaconda、tensorflow、pycharm
目录 1.安装anaconda 2.安装tensorflow-gpu 3.安装pycharm 4.VNC操作 5.安装Pytorch PS: linux下常见的操作: 1.Linux下强制关闭程序: 2.导出环境 2.1.pip导出 2.2.conda导出 2.3.其他 3.windows下的环境安装 & pycharm远程配置 4.bash…...
mockery 模拟
composer地址:mockery/mockery - Packagist github地址:地址 文档地址:Mockery — Mockery Docs 1.0-alpha documentation 根据文档介绍,mockery是php mock对象框架。根据js的mock框架的作用,估计mockery也是通过创…...
汽车后视镜反射率检测系统
随着社会的快速发展和物质生活的提供,机动车越来越普及,道路行车安全日益重要。为了保障机动车辆和行人的安全,在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像,从而提…...
uni-app引用外部图标库(阿里矢量图)
uni-app引用外部图标库(阿里矢量图) 作为前端程序员,nui-app是必备的,但是有时候内置的图标,组件又不完全满足,这里就可以引进外部图标,这里引用的是阿里矢量图标 第一步,在项目目…...
day49-Todo List(待办事项列表)
50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List(待办事项列表) 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…...
寻找丢失数字:数学与位运算的解密之旅
本篇博客会讲解力扣“268. 丢失的数字”的解题思路,这是题目链接。 注意进阶中的描述:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?这里我会讲解两种思路,它们的时间复杂度是O(N),空间复杂度是O(1)…...
数论分块学习笔记
准备开始复习莫比乌斯反演,杜教筛这一部分,先复习一下数论分块 0.随便说说 数论分块可以计算如下形式的式子 ∑ i 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum_{i1}^{n}f(i)g(\lfloor\frac{n}{i}\rfloor) ∑i1nf(i)g(⌊in⌋)。 利用的原理是 ⌊ n i ⌋ \lf…...
【基础理论】了解点过程
Maximum tsunami wave height generated by the 16 Sept. 2015 Chile earthquake, from the International Tsunami Information Center. Posted by Austin Elliott 一、说明 在这个世界上,会发生许多事件,其趋势可能遵循一种模式。在这篇博客中&#…...
深入理解Spring MVC中的@ResponseBody注解
引言 在现代的Web应用开发中,数据的传递和交互是不可或缺的一部分。Spring MVC作为一个强大的框架,在处理客户端请求和响应时,提供了许多注解来简化开发过程。其中,ResponseBody注解在处理方法的返回值时起到了关键作用࿰…...
大数据学习教程:Linux高级教程(下)
四、大数据集群服务器搭建 1. 新增Linux服务器 1.1、克隆虚拟机 学习环境中,一般使用VMware虚拟机克隆Linux系统,用来进行集群服务器的搭建。 VMware支持两种类型的克隆:完整克隆、链接克隆 完整克隆是和原始虚拟机完全独立的一个复制&…...
1.Oracle建表及使用
1.概述 1. 表:用于 存储数据 -- 是我们最常见的数据库对象 2. 表设计注意事项 (1) 表设计时,尽量遵从 第三范式(3NF) (2) 名称不能超过 30 个字符 -- 超过会报错 (3) 名称只能以 字母 大头,可由数字、 _、 $…...
《网络是怎样连接的》(二.2)
(6条消息) 《网络是怎样连接的》(二.1)_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第二章 2.5 2.6章节。 目录 简述: 本文的主要内容是 以太网的收发操作 和 UDP协议的收发操作。 IP与以太网的包收发操作 包是什…...
MySQL加密插件安装
加密插件 查看已经安装的插件:show plugs; 增加加密插件: 登陆MySQL后,通过show variables like ‘validate%’;查看相关验证规则。 ① 在配置文件中新增,[mysqld]标签下 plugin-load-addvalidate_password.so ② 在运行时新增…...
新手入门Jenkins自动化部署入门详细教程
1. 背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新…...
Neural Network学习笔记4
完整的模型训练套路 train.py import torch import torchvision from torch.utils.data import DataLoader # 引入自定义的网络模型 from torch.utils.tensorboard import SummaryWriterfrom model import *# 准备数据集 train_data torchvision.datasets.CIFAR10(root"…...
[转]关于cmake --build .的理解
https://blog.csdn.net/qq_38563206/article/details/126486183 https://blog.csdn.net/HandsomeHong/article/details/120170219 cmake --build . 该命令的含义是:执行当前目录下的构建系统,生成构建目标。 cmake项目构建过程简述: 1. 首先…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
