LeetCode 257. 二叉树的所有路径,dfs

LeetCode 257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

目录

算法选择

  • 深度优先搜索(DFS)

数据结构

  • 字符串(用于构建路径)

解题步骤

  1. 初始化空字符串数组存储路径
  2. 从根节点开始DFS
  3. 在DFS中构建路径
  4. 到达叶子节点时,将路径添加到结果数组
  5. 返回结果数组
  6. 初始化:创建一个字符串数组paths来存储所有路径。

DFS函数:定义一个递归函数dfs(node, path),其中node是当前节点,path是从根到当前节点的路径。

如果node是叶子节点(即没有左右子节点),将path添加到paths数组中。

如果node有左子节点,递归调用dfs(node->left, path + "->" + to_string(node->val))。

如果node有右子节点,递归调用dfs(node->right, path + "->" + to_string(node->val))。

调用DFS:从根节点开始调用dfs(root, "")。

算法流程

是 否 开始 初始化paths数组 调用dfs root, 判断node是否为叶子节点 将path添加到paths 递归调用dfs node->left,path 递归调用dfs node->right,path 返回paths数组 结束

算法代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    void dfs(TreeNode* node, string path, vector<string>& paths) {
        if (!node) return;
        path += to_string(node->val);
        if (!node->left && !node->right) {
            paths.push_back(path);
        } else {
            path += "->";
            dfs(node->left, path, paths);
            dfs(node->right, path, paths);
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> paths;
        string path;
        dfs(root, path, paths);
        return paths;
    }
};

算法分析

  • 时间复杂度 :O(N2),其中N是树中节点的数量。对于每个节点,我们都需要生成其路径,这需要O(N)的时间,因此总的时间复杂度是O(N2)。
  • 空间复杂度:O(N^2),因为我们需要存储所有路径,每个路径的平均长度是O(N)。

易错点和注意事项

  • 确保在递归调用时正确地构建路径。
  • 避免在非叶子节点处添加路径。
  • 注意递归的终止条件。

相似题目

题目编号 题目名称 题目链接
113 路径总和 II 链接
129 求根到叶子节点数字之和 链接
437 路径总和 III 链接
112 路径总和 链接
相关推荐
lzh200409194 分钟前
手撕线程池:巩固Linux线程知识
linux·c++
Godspeed Zhao8 分钟前
从零开始学AI14——最大似然估计与对数损失函数
算法·逻辑回归·最大似然
basketball61610 分钟前
C++ 命名空间知识点总结:从入门到合理设计
开发语言·c++
流年如夢14 分钟前
排序算法详解
数据结构·算法·排序算法
会编程的土豆16 分钟前
Go 语言中的 `new` 关键字(创建指针)
java·算法·golang
南宫萧幕27 分钟前
HEV能量管理建模实战:从零搭建 Simulink 物理环境到 Python(DQN) 强化学习联合仿真调通
开发语言·python·算法·matlab·汽车·控制
x_yeyue35 分钟前
2026第十七届蓝桥杯c++B组省赛题解
笔记·算法·蓝桥杯·acm·题解
handler0138 分钟前
【C++ 算法竞赛基础】数论篇:核心公式、经典例题与高频模板
开发语言·c++·算法·蓝桥杯·数论·最大公约数·最小公倍数
fpcc40 分钟前
并行编程实战——CUDA编程的打印输出
c++·cuda
humcomm40 分钟前
2026年 Java 面试新特点
java·开发语言·面试