力扣第257题 二叉树的所有路径 c++ 树 深度优先搜索 字符串 回溯 二叉树

news2024/11/24 15:44:44

题目

257. 二叉树的所有路径

简单

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

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

示例 1:

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

示例 2:

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

提示:

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

思路和解题方法

        1. 首先我们需要明确这个问题的目标,即找到所有从根节点到叶节点的路径。对于每一条路径,我们需要把其中的每个节点的值按顺序连接起来形成一个字符串,并将其保存在一个字符串数组中返回。

        2. 通过观察代码,我们可以发现该题解中使用了递归的思想来解决问题。具体来说,它定义了一个名为 traversal 的递归函数,该函数需要传入三个参数:

  •  
    • node: 当前访问的节点。
    • path: 保存当前路径的节点值的数组。
    • ans: 保存所有路径的字符串的数组。

        3. 对于每个节点 node,该函数首先将 node->val 添加到 path 中,并判断 node 是否为叶节点(即 node->left==NULL&&node->right==NULL),如果是,则将 path 中的所有值按顺序连接起来形成一个字符串,并将其添加到 ans 数组中;否则,递归遍历 node 的左右子树,并在递归返回后将 path 数组中的最后一个元素弹出,以恢复到上一层递归时的状态。

        4. 最终,在主函数 binaryTreePaths 中,我们首先判断根节点是否为空,如果为空,则返回空的字符串数组;否则,我们调用 traversal 函数,将根节点、空的 path 数组和空的 ans 数组作为参数传入,以获取所有路径。最后,返回 ans 数组即可。

复杂度

        时间复杂度:

                O(n)

时间复杂度:对于每个节点,我们只需要访问一次,其中 n 是节点数。

        空间复杂度

                O(n)

递归过程中使用了一个字符串类型的参数 path 和一个字符串数组 ans,以及递归调用栈,因此空间复杂度为 O(n)。特别地,如果所有的节点都在同一条路径上,递归栈的最大深度将是 n,在这种情况下,空间复杂度将达到 O(n) 的最坏情况。

c++ 代码

class Solution {
public:
    // 辅助函数,用于递归遍历二叉树并找到所有路径
    void traversal(TreeNode* node, vector<int>& path, vector<string>& ans) {
        // 将当前节点的值添加到路径中
        path.push_back(node->val);

        // 如果当前节点是叶节点,则将路径转化为字符串,并添加到结果数组中
        if (node->left == nullptr && node->right == nullptr) {
            string sPath;  // 储存当前路径的字符串形式
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);  // 将路径节点的值转化为字符串并添加到路径字符串中
                sPath += "->";  // 添加箭头符号分隔路径节点
            }
            sPath += to_string(path[path.size() - 1]);  // 添加最后一个节点的值
            ans.push_back(sPath);  // 将路径字符串添加到结果数组中
            return;
        }

        // 递归遍历左子树
        if (node->left) {
            traversal(node->left, path, ans);
            path.pop_back();  // 返回上一层递归之前,弹出当前节点,恢复路径状态
        }

        // 递归遍历右子树
        if (node->right) {
            traversal(node->right, path, ans);
            path.pop_back();  // 返回上一层递归之前,弹出当前节点,恢复路径状态
        }
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> path;  // 用于保存当前路径节点的值的数组
        vector<string> ans;  // 用于保存所有路径字符串的数组

        if (root == nullptr) return ans;  // 特殊情况处理,空树直接返回空结果数组

        traversal(root, path, ans);  // 递归遍历二叉树,找到所有路径

        return ans;  // 返回结果数组
    }
};

c++优化代码 (精简)

class Solution {
public:
    // 辅助函数,用于递归遍历二叉树并找到所有路径
    void traversal(TreeNode* node, string path, vector<string>& ans) {
        // 如果节点为空,直接返回
        if (node == nullptr) return;

        // 将当前节点的值添加到路径中
        path += to_string(node->val);

        // 如果当前节点是叶节点,则将完整路径添加到结果数组中
        if (node->left == nullptr && node->right == nullptr) {
            ans.push_back(path);
            return;
        }

        // 添加箭头符号分隔路径节点
        path += "->";

        // 递归遍历左子树
        traversal(node->left, path, ans);

        // 递归遍历右子树
        traversal(node->right, path, ans);
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> ans;  // 用于保存所有路径的数组
        traversal(root, "", ans);  // 递归遍历二叉树,找到所有路径
        return ans;  // 返回结果数组
    }
};

traversal 函数进行了修改。我们使用一个额外的 string 类型的参数 path 来保存当前路径的字符串

而不是使用一个整数数组。在递归过程中,我们将当前节点的值加入到 path 结尾,并根据情况添加箭头符号 "->"

此外,我们还对参数进行了一些调整,使用 nullptr 表示空指针,而不是 NULL。这是 C++11 引入的 nullptr 关键字,它更为直观和安全。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

Win11右键恢复Win10老版本

Win11右键恢复Win10老版本 最近自己更新了windows11的OS,整体感觉都是不错的,但是就是每次右键菜单我都要再次点击下展开更多选项,这对追求极简主义的我,就是不爽, 手动恢复win10操作吧! 第一种:创建文件(简单快速) 1.新建一个resoreRightKey.reg文件,并在里面填入如下代码 W…

阿里云服务器乌兰察布带宽收费价格表

阿里云服务器华北6&#xff08;乌兰察布&#xff09;地域公网带宽价格表&#xff0c;1M带宽价格是23元/月&#xff0c;按使用流量价格是0.8元每GB&#xff0c;阿里云服务器网来详细说下1M带宽、5M带宽、6M带宽、10M带宽、20M带宽、50M带宽和100M等带宽收费价格表&#xff1a; …

课题学习(四)----四元数解法

一、四元数解法 为了求解惯性导航的力学方程&#xff0c;姿态矩阵 R b b R^b_{b} Rbb​可以有姿态微分方程得到。其中&#xff0c;四元数是常用的方法&#xff0c;如下图所示&#xff0c;假设刚体在原点旋转&#xff0c;根据欧拉定理&#xff0c;运动坐标系(b系列)相对于导航坐…

计算机竞赛 题目:基于深度学习的人脸表情识别 - 卷积神经网络 竞赛项目 代码

文章目录 0 简介1 项目说明2 数据集介绍&#xff1a;3 思路分析及代码实现3.1 数据可视化3.2 数据分离3.3 数据可视化3.4 在pytorch下创建数据集3.4.1 创建data-label对照表3.4.2 重写Dataset类3.4.3 数据集的使用 4 网络模型搭建4.1 训练模型4.2 模型的保存与加载 5 相关源码6…

vue3 vscode no tsconfig与找不到名称“ref”。ts(2304)

如题&#xff0c;这两个问题都与tsconfig的配置有关&#xff0c;先看下问题表现&#xff1a; 解决方法&#xff0c;应当正确配置如下&#xff0c;之后保存或重启vscode&#xff1a;

Stm32_标准库_7_光敏传感器

AO端口&#xff1a;通俗的讲大概是根据环境亮度的不同导致电阻的阻值不同&#xff0c;最后AO口输出的模拟量也不同&#xff0c;这个端口是用来测量环境光照的具体强度 DO端口&#xff1a;光敏电阻默认设置了一个阈值&#xff0c;当光照强度高于这个阈值本端口输出低电平&#…

C#使用ICSharpCode.TextEditor制作代码编辑器

效果 类似于vs里的代码风格 准备工作 1 创建Winform项目 2 NuGet下载ICSharpCode.TextEditor 显示控件ICSharpCode.TextEditor 将Debug目录下的ICSharpCode.TextEditor.dll,通过工具栏显示控件,并拖拽到Form窗口代码 1 Form 代码 using System; using S

Midjourney第四篇:9大风格头像

获取图像生成提示词&#xff08;咒语&#xff09;&#xff0c;公众号&#xff1a;科技探幽&#xff0c;回复“mid”&#xff0c;获取详细教程 迪士尼风格 关键词&#xff1a;art by disney ,Disney style,3d character from Disney 皮克斯风格 关键词&#xff1a;art by pix…

跟着播客学英语-Why I use vim ? part one.

why-use-vim-01.png 最近这段时间在学英语&#xff0c;在网上看到有网友推荐可以听英文播客提高听力水平。 正好我自己也有听播客的习惯&#xff0c;只不过几乎都是中文&#xff0c;但现在我已经尝试听了一段时间的英文播客&#xff0c;觉得效果还不错。 大部分都是和 IT 相关的…

MyBatis(JavaEE进阶系列4)

目录 前言&#xff1a; 1.MyBatis是什么 2.为什么要学习MyBatis框架 3.MyBatis框架的搭建 3.1添加MyBatis框架 3.2设置MyBatis配置 4.根据MyBatis写法完成数据库的操作 5.MyBatis里面的增删改查操作 5.1插入语句 5.2修改语句 5.3delete语句 5.4查询语句 5.5like查…

【广州华锐互动】动物解剖学AR互动学习平台

增强现实&#xff08;AR&#xff09;是一种将虚拟信息叠加到现实世界中的技术。通过智能手机、平板电脑或AR眼镜等设备&#xff0c;AR技术可以创建出逼真的虚拟物体&#xff0c;这些物体可以与现实世界的环境相互交互。 AR技术在教育领域的应用非常广泛&#xff0c;包括历史、科…

【redis学习笔记】分布式锁

什么是分布式锁 以往的锁都是只能在当前进程中⽣效, 在分布式的这 种多个进程多个主机的场景下就⽆能为⼒了。 因此提供分布式锁&#xff0c;加锁就是往redis上设置一个特殊的key:value&#xff0c;完成操作后&#xff0c;释放锁就是删除这个key:value&#xff1b;其他服务器尝…

数据结构——多重链表的实现

//多重列表的实现 #include<stdio.h> #include<stdlib.h> struct lnode {int row,col,value; }; //没有用到down指针 //没有用到tag和next指针 typedef struct node {int tag;//区分头结点(0)和非零元素结点(1)struct node* right;struct node* down;//共用体与结…

达梦数据库 视图 错误 [22003]: 数据溢出

今天通过DBeaver连接访问达梦数据库的一个视图&#xff0c;报错&#xff1a;错误 [22003]: 数据溢出 经过分析&#xff0c;原因是视图字段的数据类型和原表的数据类型不一致造成的

加密密钥应用范围及特点优势分析

加密密钥是一种用于保护数据和信息安全的重要工具。它通过在数据传输和存储过程中对数据进行加密&#xff0c;使得未经授权的人无法访问和解读数据。加密密钥的应用范围广泛&#xff0c;包括网络通信、电子商务、金融交易、数据存储等领域。安策将对加密密钥的应用范围和特点优…

AP2400 LED电源驱动 降压恒流IC 机场灯 指示灯 交通照明灯

产品描述 AP2400 是一款 PWM 工作模式,高效率、外围简单、外驱功率管&#xff0c;适用于 5-100V输入的高精度降压 LED 恒流驱动芯片。外驱 MOS&#xff0c;最大输出电流可达 6A。AP2400 可实现三段功能切换&#xff0c;通过MODE1/2/3 切换三种功能模式&#xff1a;全亮&#xf…

PyQt5配置踩坑

安装步骤比较简单&#xff0c;这里只说一下我踩的坑&#xff0c;以及希望一些大佬可以给点建议。 一、QtDesigner 这个配置比较简单&#xff0c;直接就能用&#xff0c;我的配置如下图&#xff1a; C:\Users\lenovo\AppData\Roaming\Python\Python311\site-packages\qt5_app…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

海外网红营销:打造热门短视频的秘诀

在当今数字化时代&#xff0c;短视频已成为社交媒体上最热门的内容形式之一。无论是TikTok、Instagram、YouTube还是其他平台&#xff0c;短视频都吸引了海内外网红和品牌的注意。本文将详细探讨海外网红营销中如何打造爆款短视频&#xff0c;以便帮助品牌在竞争激烈的市场中脱…

一些常见分布-正态分布、对数正态分布、伽马分布、卡方分布、t分布、F分布等

目录 正态分布 对数正态分布 伽马分布 伽马函数 贝塔函数 伽马分布 卡方分布 F分布 t分布 附录 参考文献 本文主要介绍一些常见的分布&#xff0c;包括正态分布、对数正态分布、伽马分布、卡方分布、F分布、t分布。给出了分布的定义&#xff0c;推导了概率密度函数&…