Leetcode刷题详解——二叉树的所有路径

1. 题目链接:257. 二叉树的所有路径

2. 题目描述:

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

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

示例 1:

img

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

示例 2:

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

提示:

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

3. 算法(回溯)

3.1 算法思路:

使用深度优先遍历(DFS)求解

路径以字符串形式存储,从根节点开始遍历,每次遍历时将当前节点的值加入路径中,如果该节点为叶子节点,将路径存储到结果中。否则,将“->”加入到路径中并递归遍历该节点的左右子树

定义一个结果数组,进行递归。递归具体实现方法如下:

  1. 如果当前节点不为空,就将当前节点的值加入路径path中,否则直接返回
  2. 判断当前节点是否为叶子节点,如果是,则将当前路径加入到所有路径的存储数组paths中
  3. 否则,将当前节点的值加上”->”作为路径的分隔符,继续递归遍历当前节点的左右子节点
  4. 返回结果数组

特别地,我们可以只使用一个字符串存储每个状态的字符串,在递归回溯的过程中,需要将路径中的当前节点移除,以回到上一个节点

具体实现方法如下:

  1. 定义一个结果数组和一个路径数组
  2. 从当前节点开始递归,递归函数的参数为当前节点、结果数组和路径数组
    1. 如果当前节点为空,返回
    2. 将当前节点的值加入到路径数组中
    3. 如果当前节点为叶子节点,将路径数组中的所有元素拼接成字符串,并将该字符串存储到结果数组中
    4. 递归遍历当前节点的左子树
    5. 递归遍历当前节点的右子树
    6. 回溯,将路径数组中的最后一个元素移除,以返回到上一个节点

请添加图片描述

3.2 C++算法代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<string> ret; // 记录结果的向量

    // 主函数,返回所有从根节点到叶子节点的路径
    vector<string> binaryTreePaths(TreeNode* root) {
        string path; // 当前路径字符串
        if (root == nullptr) return ret; // 如果根节点为空,直接返回空结果
        dfs(root, path); // 调用深度优先搜索函数
        return ret; // 返回结果向量
    }

    // 深度优先搜索函数,递归遍历二叉树
    void dfs(TreeNode* root, string path) {
        path += to_string(root->val); // 将当前节点的值添加到路径字符串中

        // 如果当前节点是叶子节点,将路径字符串添加到结果向量中
        if (root->left == nullptr && root->right == nullptr) {
            ret.push_back(path);
            return;
        }

        path += "->"; // 在路径字符串中添加箭头符号,表示继续向下遍历

        // 如果左子节点不为空,递归调用dfs函数遍历左子树
        if (root->left) dfs(root->left, path);

        // 如果右子节点不为空,递归调用dfs函数遍历右子树
        if (root->right) dfs(root->right, path);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AITO问界崛起的“临门一脚”,落在了赛力斯汽车的智慧工厂里

文 | 智能相对论 作者 | 沈浪 AITO问界新M7的销量爆了&#xff0c;口碑也紧接着“爆”了。 AITO问界新M7系列上市以来50天&#xff0c;累计大定突破8万辆。AITO问界M9预计今年12月上市&#xff0c;预订超过了1.5万辆。根据最新公布的产销数据&#xff0c;在过去的10月份&…

【蓝桥杯选拔赛真题48】python最小矩阵 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python最小矩阵 一、题目要求 1、编程实现 2、输入输出 二、算法分析

Python某建筑平台数据, 实现网站JS逆向解密

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: 首先我们先来安装一下写代码的软件&#xff08;对没安装的小白说&#xff09; Python 3.8 / 编译器 Pycharm 2021.2版本 / 编辑器 专业版是付费的 <文章下方名片可获取魔法永久用~> 社区版是免费的 模块…

自动化测试入门知识 —— 数据驱动测试

一、什么是数据驱动测试&#xff1f; 数据驱动测试是一种测试方法&#xff0c;它的核心思想是通过不同的测试数据来验证同一个测试逻辑。通常情况下&#xff0c;测试用例中的输入数据和预期结果会被提取出来&#xff0c;以便可以通过不同的测试数据进行重复执行。 数据驱动测…

R语言用jsonlite库写的一个图片爬虫

目录 一、引言 二、jsonlite库介绍 三、图片爬虫实现步骤 1、发送HTTP请求获取图片列表 2、解析JSON数据提取图片链接 3、下载图片 四、实践与评估 五、注意事项 总结与展望 一、引言 随着互联网的发展&#xff0c;图片已经成为人们获取信息的重要途径之一。图片爬虫…

招聘小程序源码 招聘网源码 人才网源码 招聘求职小程序源码

招聘小程序源码 招聘网源码 人才网源码 招聘求职小程序源码 功能介绍&#xff1a; 1、发布招聘&#xff0c;建立企业人才库 支持企业入驻发布招聘职位&#xff0c;建立人才库&#xff1b; 2、发布简历&#xff0c;在线投简历 支持用户发布简历&#xff0c;向意向职位在线投简…

stm32 ADC

目录 简介 stm32的adc 框图 ①电压输入范围 ②输入通道 ​编辑③ADC通道 ④ADC触发 ⑤ADC中断 ⑥ADC数据 ⑦ADC时钟 ADC的四种转换模式 hal库代码 标准库代码 简介 自然界的信号几乎都是模拟信号&#xff0c;比如光亮、温度、压力、声音&#xff0c;而为了方便存储、…

OpenCV官方教程中文版 —— 图像修复

OpenCV官方教程中文版 —— 图像修复 前言一、基础二、代码三、更多资源 前言 本节我们将要学习&#xff1a; • 使用修补技术去除老照片中小的噪音和划痕 • 使用 OpenCV 中与修补技术相关的函数 一、基础 在我们每个人的家中可能都会几张退化的老照片&#xff0c;有时候…

领星ERP如何无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

领星ERP&#xff08;LINGXING&#xff09;是一款专业的一站式亚马逊管理系统&#xff0c;帮助卖家构建完整的数据化运营闭环。&#xff0c;致力于为跨境电商卖家提供精细化运营和业财一体化的解决方案。 官网&#xff1a;https://erp.lingxing.com 集简云无代码集成平台&…

Spring Boot 使用断言抛出自定义异常,优化异常处理机制

文章目录 什么是断言&#xff1f;什么是异常&#xff1f;基于断言实现的异常处理机制创建自定义异常类创建全局异常处理器创建自定义断言类创建响应码类创建工具类测试效果 什么是断言&#xff1f; 实际上&#xff0c;断言&#xff08;Assertion&#xff09;是在Java 1.4 版本…

UE5数字孪生制作(一) - QGIS 学习笔记

1.下载 QGIS是免费的GIS工具&#xff0c;下载地址&#xff1a; https://www.qgis.org/en/site/ 2.安装 - 转中文 按照步骤安装&#xff0c;完成后&#xff0c;在菜单 设置settings里&#xff0c;选择options&#xff0c;修改语言 确定后&#xff0c;需要重启下软件 3.学习视…

Pycharm 对容器中的 Python 程序断点远程调试

pycharm如何连接远程服务器的docker容器有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 本文是第一种方法的教程&#xff0c;第二种请点击以上的链接…

Spring 与 Spring Boot

什么是 Spring 可以理解 Spring 是一个框架。这个框架最早来源于在差不多的 20 年前的 2002 年。 在那个时候 Java 世界的开发还是以 EJB 为主&#xff0c;因为在这之前的大部分应用都会使用服务器客户端的应用模式。 其实这个模式在现在还是在使用的&#xff0c;例如 IBM 系统…

2023-11-04 LeetCode每日一题(数组中两个数的最大异或值)

2023-11-04每日一题 一、题目编号 421. 数组中两个数的最大异或值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 示例 2&…

gorm的自动化工具gen

gorm的自动化工具gen 官方 https://gorm.io/zh_CN/gen/假设数据库结构如 这里使用gen-tool 安装 go install gorm.io/gen/tools/gentoollatest用法 gentool -hUsage of gentool:-c string配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 -db string指定Driver…

【Linux】僵尸进程、孤儿进程的理解与验证

僵尸进程 概念 僵尸进程&#xff08;Zombie Process&#xff09;是指一个已经终止执行的子进程&#xff0c;但其父进程尚未调用 wait() 或 waitpid() 函数来获取子进程的退出状态。 Linux 中&#xff0c;僵尸进程会保留一些资源&#xff0c;如进程 ID、进程表项和一些系统资源…

设数据为01101001,试采用4个校验位求其偶校验方式的海明码。

遇到一个题目&#xff0c;但是教材书上写的比较迷糊&#xff0c;看不懂&#xff0c;后来在网上搜了一下方法&#xff0c;发现还是比较简单的&#xff0c;现在分享一下我的解法 首先&#xff0c;套用公式&#xff1a;2k - 1 > n k 因为求得数字是8位数&#xff0c;n8&#x…

vue+vant图片压缩后上传

vuevant图片压缩后上传 vue文件写入 <template><div class"home"><van-field input-align"left"><template #input><van-uploaderv-model"fileList.file":after-read"afterRead":max-count"5":…

【计算机网络笔记】传输层——TCP的可靠数据传输

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】

问题原因&#xff1a; nodejs版本太高&#xff08;nodejs v17版本发布了openSSL3.0对短发和密钥大小增加了更为严格的限制&#xff0c;nodejs v17之前版本没有影响&#xff0c;但之后的版本会出现这个错误&#xff0c;物品的node版本是20.9.0&#xff09; 解决方式&#xff1…