题目链接:力扣

大概思路:

思路:

按题目要求,返回所有从根节点到叶子节点的路径。

遍历节点,path存储遍历过程中节点的值,遇见叶子节点返回。

在返回之前,把path的值,加入到结果集(需要把path里的值做下字符串转化),同时把path里的值弹出去,给下一条路径的记录留下空间。

遍历结束,返回结果集。

递归三部曲:

1.明确递归函数的参数和返回类型:

参数需要传入根节点root,一个数组path用来存储路径,一个结果集(字符串类型的)

void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)

2.确认终止条件:

遇见叶子节点,返回。

返回之前,需要把记录到path里的值,输入到结果集。

把path里的值输入到结果集的过程中,需要做一个字符串转换。

为啥最后一个节点要单独收集?

大概是因为题目要求的"1->2->3"格式的末尾是没有"->",下面代码的for循环会给末尾也添上->

if (cur->left == NULL && cur->right == NULL) { // 遇到叶子节点string sPath;for (int i = 0; i < path.size() - 1; i++) { // 将path里记录的路径转为string格式sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)result.push_back(sPath); // 收集一个路径return;
}

3.设计单层递归逻辑:

用前序遍历,先纪录遍历的节点值到path里,然后再递归,递归逻辑里要加个if来保证该节点的左右子树指针不为空值(空值会导致空指针异常)。

同时在递归逻辑里面还要加上一段回溯代码,弹出path的值(一般是遍历的这个节点的值),保证向上返回时,path的值可以腾出空间,为下一段路径记录做准备。

为啥用前序遍历?

因为需要先记录遍历节点的值,然后在递归,中后序遍历会先递归再记录结果集。

为啥记录节点的值放在path的操作要放在终止条件之前?

因为不放在终止条件之前,那叶子节点的值在还没有被记录的时候就已经被终止条件返回了,叶子节点的值就被遗漏了。

path.push_back(cur->val); //(中间省略终止条件的代码)if (cur->left) {traversal(cur->left, path, result);path.pop_back(); // 回溯
}
if (cur->right) {traversal(cur->right, path, result);path.pop_back(); // 回溯
}

总代码:

注意下传入的参数root等于空的话,也就可以直接返回result了(没有路径)

class Solution {
private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 // 这才到了叶子节点if (cur->left == NULL && cur->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 (cur->left) { // 左 traversal(cur->left, path, result);path.pop_back(); // 回溯}if (cur->right) { // 右traversal(cur->right, path, result);path.pop_back(); // 回溯}}public:vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if (root == NULL) return result;traversal(root, path, result);return result;}
};

遇见的问题:

这一段c++的引用是什么东西?

感觉在题目里就是普通的数组啊。。好像说是地址拷贝...

vector<int>& path, vector<string>& result

终止条件那的两段path.size()-1,感觉第一个path.size()-1,因为数组从0开始,所以数组的尺寸-1是到末尾下标的,第二段应该意思也是末尾下标啊,怎么解释?

哦,第一个path.size()-1前面有个小于符号啊,那没事了。

个人想法:

刷一下知乎和哔哩哔哩就过去一个小时,真是时间杀手...有毒,算了..

感觉这记录也太复杂,我大抵自己回来看也看不懂,以后再修改吧,有梳理思路的作用就行了。

012.二叉树的所有路径相关推荐

  1. mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...

    题目解读 题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C++)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时 ...

  2. 257. 二叉树的所有路径 golang

    257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1/ \ 2 3\5 输出: ["1->2-&g ...

  3. Suzy找到实习了吗Day 17 | 二叉树进行中:110. 平衡二叉树,257 二叉树的所有路径,404. 左叶子之和

    110. 平衡二叉树 题目 判断一颗二叉树是否是平和二叉树:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 我的错误trial 我通过写了一个函数(后序遍历 ...

  4. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径

    文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...

  5. DS树--二叉树之最大路径

    题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符'0'表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径, ...

  6. 算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

    算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和 平衡二叉树 110. 平衡二叉树 - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高 ...

  7. 57. Leetcode 257. 二叉树的所有路径 (二叉树-二叉树路径和)

    给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径.叶子节点 是指没有子节点的节点.示例 1: 输入:root = [1,2,3,null,5] 输出:[" ...

  8. 打印二叉树的所有路径

    http://blog.csdn.net/randyjiawenjie/article/details/6772145 看看思路,下面的小bug还比较多 二叉树的常见问题有如下几个,如果解决好了,就跟 ...

  9. 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求

    Binary Tree Maximum Path Sum 原题链接Binary Tree Maximum Path Sum 给定一个二叉树,计算二叉树中最长的路径和,路径只需要从一个节点到另一个节点, ...

最新文章

  1. net localgroup 命令详解
  2. 【中级软考】PV操作是什么?(passeren【通过、申请资源、减量】、vrijgeven【释放、释放资源、增量】【荷兰文】)(用于进程间同步)
  3. kubernetes 实战 使用 nfs 作为动态 storageClass 存储
  4. request.getParameter() 和request.getAttribute() 区别
  5. Atmel与ARM合力打造物联网开发平台
  6. 职场新人如何高效办公?这10款软件帮到你!
  7. 互联网金融一:大额支付系统、小额支付系统介绍
  8. unable to find setter method for attribute:[commandName]
  9. iOS视频播放器MPMoviePlayerController
  10. BlackBerry 7290
  11. 网关gate启动报错Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.g
  12. 前程无忧解密 + 推送
  13. BOM Routing (2009-08-31 23:46:00)
  14. PX4-小型固定翼滑跑起飞问题分析
  15. matplotlib的学习,全是源码,勿喷
  16. 怎样把计算机设置到小米手机桌面上,小米自由桌面如何设置和使用【图文教程】...
  17. 范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「同心6阶/8阶/10阶」...
  18. 虚拟主机换云服务器,云虚拟主机想换云服务器
  19. 普元ESO 逻辑流返回值选择java--浏览卡住
  20. HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP | Spring Cloud 13

热门文章

  1. SAP Hybris培训-标准课程/企业内训
  2. 胶囊网络可以PK掉CNN吗?//——暂时不能 胶囊网络的不足点思考
  3. 使用JavaBean封装对数据库的访问、连接池的配置和使用
  4. 【Axure教程】中继器版穿梭表格
  5. 01时态(1):疑问句
  6. 2021云计算技能竞赛真题
  7. 专访:台湾这家设计公司如何hold住甲方爸爸?
  8. 基于matlab的磁悬浮控制系统,基于MATLAB的磁悬浮球系统PID控制器设计与实现
  9. 跟踪信号发生器如何产生宽频带信号?
  10. Macbook删除苹果系统,装单系统win10系统