LeetCode 257. 二叉树的所有路径
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
目录
算法选择
- 深度优先搜索(DFS)
数据结构
- 字符串(用于构建路径)
解题步骤
- 初始化空字符串数组存储路径
- 从根节点开始DFS
- 在DFS中构建路径
- 到达叶子节点时,将路径添加到结果数组
- 返回结果数组
- 初始化:创建一个字符串数组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 | 路径总和 | 链接 |