力扣257. 二叉树的所有路径(递归回溯与迭代)

news2024/11/29 10:41:31

题目:

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

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

示例 1:

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

示例 2:

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

提示:

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

思路: 

这道题目要求从根节点到叶子的路径,所以需要前序遍历(中左右),这样才方便让父节点指向孩子节点,找到对应的路径。

先用递归的方法来做,走过的路径用path来表示,每遍历一个节点就加入到path中,递归遍历节点

递归完,要做回溯,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。此时就需要用到回溯来删走过的节点,回溯和递归是一一对应的,有一个递归,就要有一个回溯。

代码及思路:

递归回溯:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        # 定义一个列表来存储路径
        path = []
        # 定义一个列表来存储结果
        result = []
        # 如果根节点为空,直接返回结果列表
        if not root:
            return result
        # 进行前序遍历
        self.traversal(root, path, result)
        return result
        
    def traversal(self, node, path, result):
        # 将当前节点的值加入路径中   
        path.append(node.val)
        # 如果当前节点是叶子节点,将路径转化为字符串并加入结果列表中  (中)
        if not node.left and not node.right:
            spath = '->'.join(map(str, path))
            result.append(spath)
            return
        # 如果有左子节点,进行递归遍历,并将左子节点从路径中弹出  (左)
        if node.left:
            self.traversal(node.left, path, result)
            path.pop()   # 回溯
        # 如果有右子节点,进行递归遍历,并将右子节点从路径中弹出  (右)
        if node.right:   
            self.traversal(node.right, path, result)
            path.pop()   # 回溯

迭代法:

# 定义二叉树节点的类
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        # 使用栈来存储节点
        stack = [(root)]
        # 使用栈来存储路径
        path_st = [str(root.val)]
        result = []
        while stack:
            # 弹出节点
            node = stack.pop()
            # 弹出路径
            path = path_st.pop()
            # 如果节点没有左右子节点,说明到达叶子节点,将路径加入结果中
            if not node.left and not node.right:
                result.append(path)
            # 如果有右子节点,将右子节点和路径加入栈中
            if node.right:
                stack.append(node.right)
                path_st.append(path + '->' + str(node.right.val))
            # 如果有左子节点,将左子节点和路径加入栈中
            if node.left:
                stack.append(node.left)
                path_st.append(path + '->' + str(node.left.val))
        return result

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

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

相关文章

Java简易版:UDP协议实现群聊

要先 运行服务端&#xff0c;在运行客户端&#xff0c;否则会报错。 服务端&#xff1a; package 二十一章;import java.io.*; import java.net.*; import java.util.ArrayList; public class T{public static ServerSocket server_socket;public static ArrayList<Socket…

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

file-saver 的使用

简介 FileSaver.js 是在客户端保存文件的解决方案&#xff0c;非常适合在客户端生成文件的 Web 应用程序 基本使用 以下内容基于官方文档&#xff0c;官方文档传送门https://gitcode.net/mirrors/eligrey/FileSaver.js 注意&#xff1a;存在文件保存的大小限制&#xff0c;具…

入门深度学习真的这么难吗?

今天微信私信回答了一个同学的问题&#xff1a;&#xff1f;我在入门深度学习的过程中&#xff0c;从配环境到 debug 全是坑&#xff0c;解决问题的时间远超跑模型的时间&#xff0c;为什么入门深度学习这么难&#xff1f; 这个问题真的问到我的心坎里了&#xff0c;我只能说&…

Python轴承故障诊断 (二)连续小波变换CWT

目录 前言 1 连续小波变换CWT原理介绍 1.1 CWT概述 1.2 CWT的原理和本质 2 基于Python的CWT实现与参数对比 2.1 代码示例 2.2 参数介绍和选择策略 2.2.1 尺度长度&#xff1a; 2.2.2 小波函数&#xff08;wavelet&#xff09;&#xff1a; 2.3 凯斯西储大学轴承数据的…

御剑工具学习

御剑 1.1 工具的下载路径1.2 工具的安装流程1.3 工具的详细使用 1.1 工具的下载路径 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1Bn7GtWb7AStcjzVahFOjSQ 提取码&#xff1a;zkaq 1.2 工具的安装流程 御剑不用安装&#xff0c;直接下载下来解压&#xff0c;双击“御…

【Java实现百钱买百鸡的两种写法】

Java实现百钱买百鸡的两种写法 Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09;Java三重嵌套for循环实现百钱买百鸡的写法&#xff08;二&#xff09; Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09; //定义一个记录循环次数变量int …

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…

docker安装node及使用

文章目录 一、安装node二、创建node容器三、进入创建的容器如有启发&#xff0c;可点赞收藏哟~ 一、安装node 查看可用版本 docker search node安装最新版本 docker install node:latest二、创建node容器 docker run -itd --name node-test node–name node-test&#xff1…

10款装系统启动工具

1、GhostWin10 PE&#xff1a; GhostWin10 PE主要适用于安装Windows 10操作系统。它是一个基于Ghost Win10制作的PE系统&#xff0c;提供了安装Windows 10的功能 2、老毛桃PE&#xff1a; 老毛桃PE适用于各种Windows操作系统的安装和修复。它是一个基于Windows PE环境的工具…

epoll实现同时承载100w客户端的数量

概念 先表明&#xff0c;这里是让epoll能够同时承受100w的连接&#xff0c;不针对业务处理。 对于百万并发的业务处理&#xff0c;其前提条件就是要同时承受住100w的连接。 程序源码 epoll的源码直接给出来 /*支持百万并发的 reactor1.其主要限制在于Linux系统的限制,需要修改一…

小白教学!几个步骤入门AI动画视频制作

公众号&#xff1a;算法一只狗 文章目录 文本视频生成软件&#xff1a;PIKA小黑子表情包熊猫头表情包 动画视频制作故事和分镜文本制作动画生成与拼接 总结 要介绍动画生成之前&#xff0c;先让大家来看看我生成的动画视频&#xff1a; AI动画生成故事 上面的视频我只用了不到2…

Android12 WIFI 无法提供互联网连接

平台 RK3588 Android 12 问题描述 ConnectivityService是Android系统中负责处理网络连接的服务之一。它负责管理设备的网络连接状态&#xff0c;包括Wi-Fi、移动数据、蓝牙等。 在Android系统中&#xff0c;ConnectivityService提供了一些关键功能&#xff0c;包括但不限于…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…

uniapp实战 —— 可滚动区域 scroll-view (自适配高度,下拉刷新)

自适配高度 自定义的顶部导航栏&#xff0c;可参考博文 https://blog.csdn.net/weixin_41192489/article/details/134852124 如图可见&#xff0c;在页面滚动过程中&#xff0c;顶部导航栏和底栏未动&#xff0c;仅中间的内容区域可滚动。 整个页面的高度设置为 100%&#xf…

【SQL开发实战技巧】系列(四十九):Oracle12C常用新特性☞表分区部分索引(Partial Indexes)

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

漏洞复现-用友NC任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…