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 路径总和 链接
相关推荐
吃好睡好便好4 小时前
用while循环语句求和
开发语言·学习·算法·matlab·信息可视化
王璐WL4 小时前
【C语言入门级教学】函数的概念2
c语言·数据结构·算法
不知名的忻5 小时前
B 树与 B+ 树:面试完全指南
b树·算法·面试·b+树
运筹vivo@6 小时前
2657. 找到两个数组的前缀公共数组 | 难度:中等
算法·leetcode·职场和发展·哈希表
索木木6 小时前
NCCL SHARP 和 TREE算法
java·服务器·算法
刀法如飞6 小时前
《道德经》简单解说版-第 2 章:天下皆知美之为美
前端·后端·面试
Raink老师6 小时前
【AI面试临阵磨枪-59】企业内部 AI 系统权限、数据隔离、审计设计
人工智能·面试·职场和发展
Lumbrologist6 小时前
【C++】零基础入门 · 第 1 节:第一个程序 Hello World 与编译运行
开发语言·c++
枕星而眠7 小时前
Linux 线程:原理、属性、实战与面试避坑
linux·运维·c语言·面试
_李小白7 小时前
【C++学习笔记】新特性之inline变量
c++·笔记·学习