leetcode 257.二叉树的所有路径

98 阅读2分钟

257. 二叉树的所有路径 - 力扣(LeetCode)

回溯

首先定义一个 vector path,用来存放单挑路径上的节点数值,然后再把path转换为字符串存到 vector result里面加上"->”符号,返回。

按照遍历左子树到叶子节点,路径上遇到的值全部放到path里面,这样path里面就有1,2,5三个值。

image.png 这时候开始回溯。把2,5弹出,回到根节点,再遍历左子树,得到1,3

image.png

image.png

接下来写递归回溯

递归的结束条件

当遍历到叶子节点的时候结束递归,开始回溯。这时候把path的值放到result里面:

image.png

当然,在此之前,需要先把path里面的值转为字符串,然后各个值之间用"->"链接:

image.png

path添加路径上节点值

image.png

开始递归 回溯

左子树不为空遍历左子树,遍历到叶子节点回溯。右子树不为空遍历右子树,遍历到叶子节点开始回溯。

image.png

报错

image.png 原因是 path 没有把最后叶子节点的值加入,应该再加一句:

      spath += to_string(path[path.size() - 1]);  //把最后一个值也转为字符串

报错2

如果把  path添加路径节点值    这行代码放到  递归结束条件判断  之后就会出现报错:  

image.png

原因

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;
    }
};