dfs(二十)257. 二叉树的所有路径
257. 二叉树的所有路径
给你一个二叉树的根节点
root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]示例 2:
输入:root = [1] 输出:["1"]提示:
- 树中节点的数目在范围
[1, 100]
内-100 <= Node.val <= 100
解法一:全局变量path来存放
使用dfs先将每条路径存储在一个vector中,最后再从vector转入string中。
为什么使用vector?因为在dfs操作的时候使用的是全局变量temp来记录每次的路径元素,使用vector可以很容易的进行push pop 操作,其实使用string temp也可以,不过会比较麻烦。
/**
* 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:
vector<string> res;
vector<string> binaryTreePaths(TreeNode* root) {
PreOrder(root);
// Print();
for(int i = 0; i < ret.size(); i++)
{
string temp;
for(int j = 0; j < ret[i].size(); j++)
{
if(j > 0)
temp += "->";
temp += to_string(ret[i][j]);
}
res.push_back(temp);
}
return res;
}
vector<vector<int>> ret;
vector<int> temp;
void PreOrder(TreeNode* root)
{
if(root == nullptr)
return;
temp.push_back(root->val);
if(root->left == nullptr && root->right == nullptr)
{
ret.push_back(temp);
}
PreOrder(root->left);
PreOrder(root->right);
temp.pop_back();
}
void Print()
{
for(int i = 0; i < ret.size(); i++)
{
for(int j = 0; j < ret[i].size(); j++)
cout<<ret[i][j]<<" ";
cout<<endl;
}
}
};
解法二:path放入函数头上进行传参
在进行dfs操作时候分为俩种情况 叶子节点 和 非叶子节点
访问到叶子结点时,说明path中存放了一条合理的路径,我们直接将其放入res结果即可,在函数返回的时候path中之前新插入的元素随着栈帧的返回自行进行pop,省略了我们需要进行pop这一步骤
class Solution {
public:
vector<string> res;
vector<string> binaryTreePaths(TreeNode* root) {
string path;
dfs(root, path);
return res;
}
void dfs(TreeNode* root, string path)
{
if(root == nullptr)
return;
if(root->left == nullptr && root->right == nullptr)
{
path += to_string(root->val);
res.push_back(path);
return;
}
else
{
path += to_string(root->val); //相同的操作可以提前放判断之前
path += "->"; // 前面没有return可以直接放在判断之后
}
dfs(root->left, path);
dfs(root->right, path);
}
};
优化后:
class Solution {
public:
vector<string> res;
vector<string> binaryTreePaths(TreeNode* root) {
string path;
dfs(root, path);
return res;
}
void dfs(TreeNode* root, string path)
{
if(root == nullptr)
return;
path += to_string(root->val);
if(root->left == nullptr && root->right == nullptr)
{
res.push_back(path);
return;
}
path += "->";
dfs(root->left, path);
dfs(root->right, path);
}
};