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)中保存的是从根节点到当前节点所经过的路径。

接下来,你需要继续从当前节点出发,分别向的左子树和右子树递归前进。

当你遇到空节点或叶子节点(即递归的终止条件)时,说明当前这条路径已经走到尽头,此时会开始从下往上返回,并在返回的过程中撤销刚刚加入的路径节点(这一步是"回溯"),以便尝试其他分支的路径。

完整代码

递归写法,也可以用迭代

js 复制代码
var binaryTreePaths = function(root) {
    let res = [];
    let path = [];
    function dfs(node) {
	    if (node === null) return
        path.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)

相关推荐
程序员编程指南几秒前
Qt 与物联网(IoT)开发
c语言·开发语言·c++·qt·物联网
秋风起,再归来~3 分钟前
C++从入门到起飞之——智能指针!
开发语言·c++·算法
破刺不会编程30 分钟前
linux线程互斥和同步
linux·运维·服务器·开发语言·网络
清岚_lxn31 分钟前
前端js通过a标签直接预览pdf文件,弹出下载页面问题
前端·javascript·pdf
embrace9933 分钟前
【C语言学习】scanf函数
c语言·开发语言·汇编·学习·青少年编程·c#·编辑器
归云鹤44 分钟前
QT 动态属性和静态属性
开发语言·数据库·qt
代码的余温1 小时前
Vue多请求并行处理实战指南
前端·javascript·vue.js
JohnYan1 小时前
工作笔记 - NATS的Nkey认证
javascript·后端·rabbitmq
重生之我是Java开发战士1 小时前
【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
c语言·开发语言·算法
种时光的人2 小时前
JVM面试通关指南:内存区域、类加载器、双亲委派与GC算法全解析
java·开发语言·jvm·面试