【代码随想录day 15】 力扣 257. 二叉树的所有路径 - 实践

视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/binary-tree-paths/description/

这道题实质上就是一道遍历节点题,但需要记下二叉树的所有路径,涉及到这几个问题:

  1. 遍历节点记录的是int型,返回的路径是string类型的,因此涉及到类型转换的疑问,运用C++的to_string函数来完成转换。
  2. 加入"->"符号涉及到末了一条路径没有,因此要分好情况。
  3. 回溯挑战,关于路径遍历需要回溯到父节点的另一条子树路径,因此遍历完之和必须进行pop操作来回溯节点。
  4. 对于最后一个节点的遍历,需要先进行路径记录,再终止遍历。
class Solution {
public:
void traversal(TreeNode *cur, vector<
int >
&path, vector<string>
  &result)
  {
  //记录路径的值
  path.push_back(cur->val);
  //判断终止条件,如果是叶子节点就终止,但是需要记录叶子节点的路径,所以在终止前记录路径
  if(cur->left==NULL&&cur->right==NULL)
  {
  //将int类型转换为string类型,并且加上->符号
  string sPath;
  for(int i=0; i< path.size()-1;i++)
  {
  //int转为string
  sPath=sPath+ to_string(path[i]);
  //加入->
  sPath=sPath+"->";
  }
  //最后一个路径不需要加->,所以单独讨论
  sPath=sPath+to_string(path[path.size()-1]);
  //加入结果中
  result.push_back(sPath);
  return;
  }
  //开始递归
  if(cur->left)
  {
  traversal(cur->left, path, result);
  //分岔口需要弹出遍历另一边,即回溯
  path.pop_back();
  }
  if(cur->right)
  {
  traversal(cur->right, path, result);
  //分岔口需要弹出遍历另一边,即回溯
  path.pop_back();
  }
  }
  vector<string>
    binaryTreePaths(TreeNode* root) {
    vector<string> result;
      vector<
      int> path;
      //执行遍历路径函数,输入根节点,路径,返回结果
      traversal(root,path,result);
      //最后返回result
      return result;
      }
      };
posted @ 2025-08-13 09:02  wzzkaifa  阅读(8)  评论(0)    收藏  举报