题目描述:
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例2:
输入:root = [1]
输出:[“1”]
代码:
/**
* 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> binaryTreePaths(TreeNode* root) {
vector<string> s;
if(root==NULL)return s;
string temp = to_string(root->val); //root不为空,先在当前路径temp中加入root的值
solve_dfs(s,root,temp);
return s;
}
void solve_dfs(vector<string>& s,TreeNode* root,string temp){
//深度优先搜索
if(root->left==NULL&&root->right==NULL){
//叶子节点
s.push_back(temp); //当前路径已结束,加入vector中
return;
}
if(root->left){
//左子节点递归处理,路径加上左子节点的值
solve_dfs(s,root->left,temp+"->"+to_string(root->left->val));
}
if(root->right){
solve_dfs(s,root->right,temp+"->"+to_string(root->right->val)); //右子节点递归处理,路径加上右子节点的值
}
}
};
分析:
找到每条到叶子节点的路径,因为直到遍历到叶子节点时路径才停止,应该使用深度优先搜索DFS。
设置dfs函数内临时变量temp记录当前的路径,vector记录所有保存的路径。
对于root:
若其左子节点和右子节点皆为空,说明当前已经访问到叶子节点,路径已经完成,将当前形成的路径temp加入vector中保存;
若其左子节点不为空,对其左子节点进行dfs操作直到找到一条路径;
若其右子节点不为空,对其右子节点进行dfs操作直到找到一条路径;
知识点总结:
①深度优先搜索DFS:
对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次
(与广度优先搜索的对比分析:https://www.jianshu.com/p/bff70b786bb6)
②对c++函数的变量使用“引用&”:
对于有&,则不会调用拷贝构函造数,也就不会生成副本,函数里实际操作的是参实本身
题中void solve_dfs(vector& s,TreeNode* root,string temp)的vector s是在函数执行过程中需要不断更新的量,要加&;root和temp只是该函数执行过程中的临时变量,不需要加&。