回溯
首先定义一个 vector path,用来存放单挑路径上的节点数值,然后再把path转换为字符串存到 vector result里面加上"->”符号,返回。
按照遍历左子树到叶子节点,路径上遇到的值全部放到path里面,这样path里面就有1,2,5三个值。
这时候开始回溯。把2,5弹出,回到根节点,再遍历左子树,得到1,3
接下来写递归回溯
递归的结束条件
当遍历到叶子节点的时候结束递归,开始回溯。这时候把path的值放到result里面:
当然,在此之前,需要先把path里面的值转为字符串,然后各个值之间用"->"链接:
path添加路径上节点值
开始递归 回溯
左子树不为空遍历左子树,遍历到叶子节点回溯。右子树不为空遍历右子树,遍历到叶子节点开始回溯。
报错
原因是 path 没有把最后叶子节点的值加入,应该再加一句:
spath += to_string(path[path.size() - 1]); //把最后一个值也转为字符串
报错2
如果把 path添加路径节点值 这行代码放到 递归结束条件判断 之后就会出现报错:
原因
path 就没有把叶子节点的值加入
修正
把 这段代码放到 递归结束条件判断代码之前
code
class Solution {
public:
void travesal(TreeNode* node,vector<int>& path,vector<string>& result)
{
//path添加路径节点值
path.push_back(node->val);
//递归结束条件
if(node->left==NULL&&node->right==NULL)
{
string spath;
for(int i=0;i<path.size()-1;i++)
{
spath+=to_string(path[i]);
spath+="->";
}
spath += to_string(path[path.size() - 1]);//把最后一个值转为字符串
result.push_back(spath);
return;
}
//单层搜索逻辑
if(node->left){travesal(node->left,path,result);path.pop_back();}
if(node->right){travesal(node->right,path,result);path.pop_back();}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int>path;
vector<string> result;
if(root==nullptr)return result;
travesal(root,path,result);
return result;
}
};