257. 二叉树的所有路径(js)

257. 二叉树的所有路径——DFS + 回溯(js)

  • 题目描述
  • 解题思路
  • 完整代码
  • 时间复杂度分析

题目描述

257. 二叉树的所有路径

解题思路

  1. 题意理解

    给定一棵二叉树,要求返回所有从根节点到叶子节点的路径,路径以字符串形式表示,格式如 “1->2->5”。

  2. 算法选择:DFS + 回溯

    由于需要找出所有从根到叶子的路径,自然想到使用深度优先遍历(DFS)

    同时,因为路径是一个从根开始的逐步构建过程,我们需要在递归过程中记录当前路径,并在递归返回时撤销(回溯)上一步的选择。

  3. 递归终止条件

    如果遇到了 null ,向上返回

    如果遇到了 叶子节点 ,说明得到了一条新的路径,加入结果集,然后返回。

  4. 路径的记录与处理

    我们使用一个数组 path 来记录当前从根节点到当前节点的路径。

    当遇到叶子节点(即 left == null && right == null)时,把 path 用 “->” 连接成字符串加入最终结果数组。

    注意:每次递归后需要 回溯(pop弹出) 上一个节点,确保路径的正确性。

  5. 边界情况处理

    如果根节点为 null,直接返回空数组。

    如果树中只有一个节点,也能正常处理为一个路径。

更直观的理解:
想象你正站在一棵树的某个节点上,此时路径数组(path)中保存的是从根节点到当前节点所经过的路径。
接下来,你需要继续从当前节点出发,分别向的左子树和右子树递归前进。
当你遇到空节点或叶子节点(即递归的终止条件)时,说明当前这条路径已经走到尽头,此时会开始从下往上返回,并在返回的过程中撤销刚刚加入的路径节点(这一步是“回溯”),以便尝试其他分支的路径。

完整代码

递归写法,也可以用迭代

var binaryTreePaths = function(root) {let res = [];let path = [];function dfs(node) {if (node === null) returnpath.push(node.val);// 如果是叶子节点,就把路径加入结果if (!node.left && !node.right) {res.push(path.join('->'));return}// 继续递归左右子树dfs(node.left);dfs(node.right);// 回溯path.pop();}dfs(root);return res;
};

时间复杂度分析

  • 遍历了所有节点:O(N),其中 N 是节点数。

  • 每条路径最长为树高 H,每条路径转为字符串的时间是 O(H),总共最多 N 个叶子节点。
    所以最坏情况总时间为:O(N * H)

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

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

相关文章

自动化文档生成工具(亲测可运行)

本文介绍了一个用Java编写的自动化文档生成工具,通过读取开发清单文本自动生成格式规范的Word文档。该工具的主要特点包括: 采用Apache POI库处理Word文档,支持多级标题和段落自动生成实现中文数字转换功能,将编号转换为"一、…

湖北理元理律师事务所债务优化模型:法律与生活的平衡之道

在债务重组领域,专业机构需同时解决两个矛盾:法律合规性与债务人可持续生存能力。湖北理元理律师事务所通过“三维干预模型”,在武汉某餐饮连锁企业债务危机中验证了该方案的有效性。 一、法律底层设计:还款方案的合法性审查 以该…

Web3-代币ERC20/ERC721以及合约安全溢出和下溢的研究

Web3-代币ERC20/ERC721以及合约安全溢出和下溢的研究 以太坊上的代币 如果你对以太坊的世界有一些了解,你很可能听人们聊过代币— ERC20代币 一个 代币 在以太坊基本上就是一个遵循一些共同规则的智能合约——即它实现了所有其他代币合约共享的一组标准函数&…

论文笔记 <交通灯><多智能体>MetaLight:基于价值的元强化学习用于交通信号控制

今天看的论文是这篇MetaLight:基于价值的元强化学习用于交通信号控制 里面提到的创新点就是MetaLight框架:他目标是让交通信号控制智能体(Agent)在新路口(即使结构或流量模式不同)上能​​快速学习​​(Few…

华为OD-2024年E卷-寻找符合要求的最长子串[200分] -- python

问题描述: 给定一个字符串s,找出这样一个子串: 1)该子串中的任意一个字符最多出现2次; 2)该子串不包含指定某个字符; 请你找出满足该条件的最长子串的长度。 输入描述 第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA…

CppCon 2016 学习:What C++ Programmers Need to Know about Header <random>

随机数生成的历史背景 Middle-Square 方法(中位平方法): 已知最早的随机算法之一或由修道士 Brother Edvin 在 1245 年发明由 John von Neumann 在 1949 年重新发现缺点明显,但执行速度快 Monte Carlo 方法: 起初是…

Origin:误差棒点线图绘制

1.首先将你的数据复制到表格 2.选中B(y)列数据,依次点击图示选项 3.选中图中红框数据,点击绘制点线图即可 4.结果展示

Spring 源码学习 1:ApplicationContext

Spring 源码学习 1:ApplicationContext Bean 定义和 Bean 实例 AnnotationConfigApplicationContext 首先,创建一个最简单的 Spring Boot 应用。 在入口类中接收SpringApplication.run的返回值: SpringBootApplication public class Dem…

CppCon 2017 学习:Design Patterns for Low-Level Real-Time Rendering

这段内容讲的是离散显卡(Discrete GPU)中的内存管理模型,重点是CPU和GPU各自独立管理自己的物理内存,以及它们如何通过虚拟内存和DMA引擎实现高效通信。以下是详细的理解和梳理: 1. 基本概念 CPU 和 GPU 是两个独立的…

【单调队列】-----【原理+模版】

单调队列 一、什么是单调队列? 单调队列是一种在滑动窗口或区间查询中维护候选元素单调性的数据结构,通常用于解决“滑动窗口最大值/最小值”等问题。 核心思想是:利用双端队列(deque)维护当前窗口内或候选范围内元素…

CSS语法中的选择器与属性详解

CSS:层叠样式表,Cascading Style Sheets 层叠样式表 内容和样式分离解耦,便于修改样式。 特殊说明: 最后一条声明可以没有分号,但是为了以后修改方便,一般也加上分号为了使用样式更加容易阅读,可以将每条代…

模拟设计的软件工程项目

考核题目 论文论述题:结合你 参与开发、调研或模拟设计的软件工程项目 ,撰写一篇论文 完成以下任务,论文题目为《面向微服务架构的软件系统设计与建模分析》,总分: 100 分。 1. 考核内容: 一、系统论述…

个人理解redis中IO多路复用整个网络处理流

文章目录 1.redis网络处理流2.理解通知机制 1.redis网络处理流 10个客户端通过TCP与Redis建立socket连接,发送GET name指令到服务器端。服务器端的网卡接收数据,数据进入内核态的网络协议栈。Redis通过IO多路复用机制中的epoll向内核注册监听这些socket的…

【郑州轻工业大学|数据库】数据库课设-酒店管理系统

该数据课设是一个基于酒店管理系统的数据库设计 建库语句 create database hotel_room default charset utf8 collate utf8_general_ci;建表语句 use hotel_room;-- 房型表 create table room_type( id bigint primary key auto_increment comment 房型id, name varchar(50)…

TCP 三次握手与四次挥手详解

前言 在当今互联网时代,前端开发的工作范畴早已超越了简单的页面布局和交互设计。随着前端应用复杂度的不断提高,对网络性能的优化已成为前端工程师不可忽视的重要职责。而要真正理解并优化网络性能,就需要探究支撑整个互联网的基础协议——…

RTD2735TD/RTD2738 (HDMI,DP转EDP 高分辨率高刷新率显示器驱动芯片)

一、芯片概述 RTD2738是瑞昱半导体(Realtek)推出的一款高性能显示驱动芯片,专为高端显示器、便携屏、专业显示设备及多屏拼接系统设计。其核心优势在于支持4K分辨率下240Hz高刷新率及8K30Hz显示,通过集成DisplayPort 1.4a与HDMI …

C++实现手写strlen函数

要实现求字符串长度的函数&#xff0c;核心思路是通过指针或索引遍历字符串&#xff0c;直到遇到字符串结束标志 \0 。以下是两种常见的实现方式&#xff1a; 指针遍历版本 #include <iostream> using namespace std; // 指针方式实现strlen size_t myStrlen(const cha…

NVPL 函数库介绍和使用

文章目录 NVPL 函数库介绍和使用什么是 NVPLNVPL 的主要组件NVPL 的优势安装 NVPL基本使用示例示例1&#xff1a;使用 NVPL RAND 生成随机数示例2&#xff1a;使用 NVPL FFT 进行快速傅里叶变换 编译 NVPL 程序性能优化建议总结 NVPL 函数库介绍和使用 什么是 NVPL NVPL (NVI…

HTTP相关内容补充

目录 一、URI 和 URL 二、使用 Cookie 的状态管理 三、返回结果的 HTTP状态码 一、URI 和 URL URI &#xff1a;统一资源标识符 URL&#xff1a;统一资源定位符 URI 格式 登录信息&#xff08;认证&#xff09;指定用户名和密码作为从服务器端获取资源时必要的登录信息&a…

MySQL: Invalid use of group function

https://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function 出错SQL: 错误原因&#xff1a; 1. 不能在 WHERE 子句中使用聚合&#xff08;或分组&#xff09;函数 2. HAVING 只能筛选分组后的聚合结果或分组字段 # Write your MySQL query statem…