257. 二叉树的所有路径(DFS)
题意:
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
解题思路:
经典的递归问题
问 答 确定返回条件 这道题需要找的是到叶子节点的路径,所有到叶子节点就需要放回 什么时候到叶子节点? 叶子的特点就是无左孩子和右孩子,即 root->left == nullptr && root->right == nullptr
递归的过程 在每次递归中,需要把节点的值放在一个vector容器,到叶子节点再全部取出. 递归的结果 取出vector容器中的值,逐个添加到一个字符串中.然后再添加到结果容器中.
- 其实这道题就是经典的DFS问题,确认返回条件和该怎么返回,然后只需要套入模板即可.
DFS模板
void dfs(TreeNode*root, vector<int> path)
{
//空节点直接返回即可
if (!root)
return;
//逐值添加进容器
path.push_back(root->val);
//到了叶子节点,确定返回条件
if (!root->left && !root->right)
{
'''
return;
}
//递归建立
dfs(root->left, path,res);
dfs(root->right, path,res);
}
本题代码:
/**
* 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, vector<int> path,vector<string> &res)
{
//空节点直接返回即可
if (!root)
return;
//逐值添加进容器
path.push_back(root->val);
//到了叶子节点,把容器中的值全部取出来,然后变成字符串添加到结果容器中.
if (!root->left && !root->right)
{
string re;
for (int i = 0; i < path.size() - 1; i++)
{
re += to_string(path[i]);
re += "->";
}
re += to_string(path[path.size() - 1]);
res.push_back(re);
return;
}
//递归遍历
dfs(root->left, path,res);
dfs(root->right, path,res);
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> res;
vector<int>way;
dfs(root, way, res);
return res;
}
};
总结:
用DFS时,需要判断递归返回的条件和返回的结果是什么,而且这道题我用的Path 不是引用的,所有它本身就带有回溯,不需要我们自己来完成.还有该题返回的结果是
vector<string>
容器,所有我们需要在递归中完成然后返回,即作为引用参数即可.