012.二叉树的所有路径
题目链接:力扣
大概思路:
思路:
按题目要求,返回所有从根节点到叶子节点的路径。
遍历节点,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.二叉树的所有路径相关推荐
- mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...
题目解读 题目要求输出二叉树的所有路径(字符串形式),乍一看很简单,不就是二叉树的遍历嘛!其实不然,首先,我们用非递归的方式(C++)解决这道题(递归在产品代码中是不允许使用的,其次定位 bug 的时 ...
- 257. 二叉树的所有路径 golang
257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1/ \ 2 3\5 输出: ["1->2-&g ...
- Suzy找到实习了吗Day 17 | 二叉树进行中:110. 平衡二叉树,257 二叉树的所有路径,404. 左叶子之和
110. 平衡二叉树 题目 判断一颗二叉树是否是平和二叉树:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 我的错误trial 我通过写了一个函数(后序遍历 ...
- 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...
- DS树--二叉树之最大路径
题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符'0'表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径, ...
- 算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和
算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和 平衡二叉树 110. 平衡二叉树 - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高 ...
- 57. Leetcode 257. 二叉树的所有路径 (二叉树-二叉树路径和)
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径.叶子节点 是指没有子节点的节点.示例 1: 输入:root = [1,2,3,null,5] 输出:[" ...
- 打印二叉树的所有路径
http://blog.csdn.net/randyjiawenjie/article/details/6772145 看看思路,下面的小bug还比较多 二叉树的常见问题有如下几个,如果解决好了,就跟 ...
- 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
Binary Tree Maximum Path Sum 原题链接Binary Tree Maximum Path Sum 给定一个二叉树,计算二叉树中最长的路径和,路径只需要从一个节点到另一个节点, ...
最新文章
- net localgroup 命令详解
- 【中级软考】PV操作是什么?(passeren【通过、申请资源、减量】、vrijgeven【释放、释放资源、增量】【荷兰文】)(用于进程间同步)
- kubernetes 实战 使用 nfs 作为动态 storageClass 存储
- request.getParameter() 和request.getAttribute() 区别
- Atmel与ARM合力打造物联网开发平台
- 职场新人如何高效办公?这10款软件帮到你!
- 互联网金融一:大额支付系统、小额支付系统介绍
- unable to find setter method for attribute:[commandName]
- iOS视频播放器MPMoviePlayerController
- BlackBerry 7290
- 网关gate启动报错Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.g
- 前程无忧解密 + 推送
- BOM Routing (2009-08-31 23:46:00)
- PX4-小型固定翼滑跑起飞问题分析
- matplotlib的学习,全是源码,勿喷
- 怎样把计算机设置到小米手机桌面上,小米自由桌面如何设置和使用【图文教程】...
- 范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「同心6阶/8阶/10阶」...
- 虚拟主机换云服务器,云虚拟主机想换云服务器
- 普元ESO 逻辑流返回值选择java--浏览卡住
- HTTP 请求头中的 Remote_Addr,X-Forwarded-For,X-Real-IP | Spring Cloud 13