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

易错点和注意事项

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

相似题目

题目编号 题目名称 题目链接
113 路径总和 II 链接
129 求根到叶子节点数字之和 链接
437 路径总和 III 链接
112 路径总和 链接
相关推荐
想拿大厂offer4 分钟前
【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题
c语言·c++·算法·蓝桥杯
科研小白_d.s9 分钟前
冒泡排序原理及python代码
数据结构·python·算法
可别是个可爱鬼10 分钟前
代码随想录 -- 回溯 -- 子集
数据结构·算法·leetcode
水木流年追梦1 小时前
【shell脚本5】Shell脚本学习--条件控制
人工智能·python·深度学习·学习·算法·机器学习
代码小念1 小时前
外包干了3天,技术退步明显.......
软件测试·面试·职场和发展
YRr YRr1 小时前
详解 CMake 命令:启用详细 Makefile 输出
linux·开发语言·c++·cmake
且行且知1 小时前
`#include <vector>`
c++·算法
江凡心1 小时前
Qt 每日面试题 -3
开发语言·qt·面试
姆路1 小时前
Qt中多语言的操作(以QtCreator为例)
c++·qt
散一世繁华,颠半世琉璃2 小时前
从零开始:在VSCode中打造完美的C++开发环境
c++·ide·vscode