Every day a leetcode
题目来源:257. 二叉树的所有路径
解法1:深度优先遍历
在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。
- 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
- 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。当然,深度优先搜索也可以使用非递归的方式实现,这里不再赘述。
代码:
/*
* @lc app=leetcode.cn id=257 lang=cpp
*
* [257] 二叉树的所有路径
*/
// @lc code=start
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution
{
public:
void dfs(TreeNode *root, string path, vector<string> &paths)
{
if (root != nullptr)
{
path += to_string(root->val);
// 当前节点是叶子节点
if (root->left == nullptr && root->right == nullptr)
{
paths.push_back(path); // 把路径加入到答案中
}
else // 当前节点不是叶子节点,继续递归遍历
{
path += "->";
dfs(root->left, path, paths);
dfs(root->right, path, paths);
}
}
}
vector<string> binaryTreePaths(TreeNode *root)
{
vector<string> paths;
dfs(root, "", paths);
return paths;
}
};
// @lc code=end
结果:
复杂度分析:
解法2:广度优先遍历
见于官方题解二叉树的所有路径。