LeetCode257. 二叉树的所有路径

257. 二叉树的所有路径

文章目录

      • 257. 二叉树的所有路径
        • 一、题目
        • 二、题解
          • 方法一:深度优先搜索递归
          • 方法二:迭代


一、题目

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

示例 1:
[图片]

输入: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。

  1. 如果当前节点root为空,直接返回,不进行任何操作。
  2. 如果当前节点是叶子节点(即没有左右子节点),将当前节点的值加入到path中,并将path添加到结果集result中。
  3. 如果当前节点有左子节点或右子节点(可能同时有),将当前节点的值加入到path中,并加入"->"来表示路径的连接。
  4. 对当前节点的左子节点和右子节点分别进行递归调用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; // 返回结果集}
};

算法分析

  1. 时间复杂度:对于二叉树的每个节点,我们只访问一次,同时每次添加路径到结果集的操作的时间复杂度是O(1)。因此,整个算法的时间复杂度是O(N),其中N是二叉树的节点数量。
  2. 空间复杂度:递归函数调用会占用栈空间,递归的深度最坏情况下是二叉树的高度H。在最坏情况下,二叉树可能是一个斜树,高度为N,此时空间复杂度为O(N)。但在一般情况下,二叉树的高度平衡,空间复杂度接近O(logN)。
方法二:迭代

算法思路:
我们可以使用栈来辅助遍历,并在栈中同时保存当前遍历的节点和从根节点到该节点的路径。
具体实现:

  1. 创建一个空的字符串数组 result,用于保存所有的路径。
  2. 创建两个栈 TreeSt 和 PathSt,分别用于辅助二叉树的深度优先搜索和记录从根节点到当前节点的路径。
  3. 如果给定的 root 为空,则直接返回空的结果数组 result。
  4. 将 root 节点压入栈 TreeSt,并将其值转换为字符串后压入栈 PathSt。
  5. 进入循环,当栈 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。
  1. 循环结束后,返回结果数组 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; // 返回所有从根节点到叶子节点的路径的结果数组}
};

算法分析:

  1. 时间复杂度:遍历整个二叉树的时间复杂度为O(N),其中N是二叉树的节点数。在遍历的过程中,对于每个节点,都需要将其值转换为字符串,并将其添加到结果数组中,这些操作的时间复杂度都是O(1)。因此,总体的时间复杂度为O(N)。
  2. 空间复杂度:栈 TreeSt 和 PathSt 最坏情况下可能同时保存所有节点,因此它们的空间复杂度为O(N)。结果数组 result 最坏情况下也可能保存所有从根节点到叶子节点的路径,因此空间复杂度为O(N)。综合考虑,总体的空间复杂度为O(N)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【逗老师的PMP学习笔记】5、项目范围管理

目录 一、规划范围管理二、收集需求1、【关键工具】头脑风暴2、【关键工具】访谈3、【关键工具】问卷调查4、【关键工具】标杆对照&#xff08;对标&#xff09;5、【关键工具】亲和图和思维导图6、【关键工具】质量功能展开7、【关键工具】用户故事8、【关键工具】原型法9、【…

python制作小程序制作流程,用python编写一个小程序

这篇文章主要介绍了python制作小程序代码宠物运输&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 d…

Pytest简介及jenkins集成

一、pytest介绍 pytest介绍 - unittest\nose pytest&#xff1a;基于unittest之上的单元测试框架 自动发现测试模块和测试方法 断言使用assert表达式即可 可以设置测试会话级、模块级、类级、函数级的fixtures 数据准备 清理工作 unittest&#xff1a;setUp、teardown、…

6.6.tensorRT高级(1)-mmdetection框架下yolox模型导出并推理

目录 前言1. yolox导出2. yolox推理3. 补充知识3.1 知识点3.2 mmdetection 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习…

从 GPU 到 ChatGPT,一文带你理清GPU/CPU/AI/NLP/GPT之间的千丝万缕【建议收藏】

目录 硬件 GPU 什么是 GPU&#xff1f; GPU 是如何工作的&#xff1f; GPU 和 CPU 的区别 GPU 厂商 海外头部 GPU 厂商&#xff1a; 国内 GPU 厂商&#xff1a; nvidia 的产品矩阵 AI 什么是人工智能 (Artificial Intelligence-AI)&#xff1f; 人工智能细分领域 …

ROS添加发布者和订阅者机制实现

一. ROS的节点和包 ✨Node&#xff1a; ROS的基本单位&#xff0c;实现某个功能的节点。比如实现超声波传感器就是一个节点&#xff0c;雷达传感器就可以是一个节点 ✨Package&#xff1a; 多个有联系的节点组成的单位&#xff0c;比如你要控制无人机姿态&#xff0c;可能需要…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

ES新特性部分

文章目录 Symbol创建使用拓展对象的方法直接添加 控制对象控制类型检查控制是否展开 遍历迭代器自定义遍历 生成器函数&#xff08;实现异步编程&#xff09;解决回调地狱 Promise连续读文件 SetMap类静态属性继承ES5ES6 GET与SET 数值Object方法模块化导入另一种导入 babel ES…

2023华数杯数学建模竞赛选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;隔热材料的结构优化控制研究 A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。 其中第一问需要建立平纹织物整体热导率与单根纤…

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

Android 刷新与显示

目录 屏幕显示原理&#xff1a; 显示刷新的过程 VSYNC机制具体实现 小结&#xff1a; 屏幕显示原理&#xff1a; 过程描述&#xff1a; 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制&#xff0c;绘制完成就提交buffer&#xff0c;系统服务把buffer数据…

移动开发最佳实践:为 Android 和 iOS 构建成功应用的策略

您可以将本文作为指南&#xff0c;确保您的应用程序符合可行的最重要标准。请注意&#xff0c;这份清单远非详尽无遗&#xff1b;您可以加以利用&#xff0c;并添加一些自己的见解。 了解您的目标受众 要制作一个成功的应用程序&#xff0c;你需要了解你是为谁制作的。从创建…

接口自动化测试Mock Get和Post请求

Mock可以模拟一个http接口的后台响应&#xff0c;可以模拟request&#xff0c;response 下载 moco-runner-0.11.0-standalone.jar 下载链接: https://pan.baidu.com/s/1bmFzvJPRnDlQ-cmuJ_3iRg 提取码: kpjv 确保安装了jdk,cmd下可以运行java -version 一、模拟不带参的get请求…

AQL品质抽样标准

AQL抽样标准 - 百度文库 Acceptance Quality Limit 接收质量限的缩写&#xff0c;即当一个连续系列批被提交验收时&#xff0c;可允许的最差过程平均质量水平。 AQL普遍应用于各行业产品的质量检验&#xff0c;不同的AQL标准应用于不同物质的检验上。在AQL 抽样时&#xff0c;…

VUE框架:vue2转vue3全面细节总结(3)路由组件传参

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

idea添加翻译插件并配置有道翻译

1、安装Translation插件 2、 创建有道云应用 有道智云控制台 3、设置idea 4、效果&#xff08;选中文本右键翻译&#xff0c;默认快捷键CtrlShiftY&#xff09;

图文演示:如何三分钟极速搭建一个元宇宙3D虚拟展厅

引言&#xff1a; 元宇宙3D虚拟展厅时代已经来临。元宇宙是一个虚拟的、立体的数字空间&#xff0c;可以让用户沉浸在其中进行交互操作&#xff0c;并体验无限可能。如何快速搭建一个属于自己的虚拟展厅则受到越来越多人的关注。 一&#xff0e;虚拟展厅类型 1.党建展馆 实现…

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…

前端笔记html-layer使用

layer.open方法 layer.open({type:2, //可传入的值有&#xff1a;0&#xff08;信息框&#xff0c;默认&#xff09;1&#xff08;页面层&#xff09;2&#xff08;iframe层&#xff09;3&#xff08;加载层&#xff09;4&#xff08;tips层&#xff09;title: title,content:[…

网络安全之原型链污染

目录&#xff1a; 目录&#xff1a; 一、概念 二、举例 三、 实操了解 总结 四、抛出原题&#xff0c;历年原题复现 第一题&#xff1a; 五、分析与原理 第二题&#xff1a; 八、分析与原理 九、具体操作&#xff0c;payload与结果 结果&#xff1a; 一、概念 Java…