数据结构学习 jz34 二叉树中和为某一值的路径

关键词:回溯 二叉树 前序遍历 路径记录

因为我没有仔细接触过二叉树的遍历过程,所以我是懵懵懂懂按照dfs的方法写的。没想到写对了,看了解答发现这叫做二叉树的前序遍历。用时29min。

这让我明白了前序遍历和dfs原来是有相同之处的。(我甚至想按照习惯给它剪枝,后来发现不太行,每条路都必须走一遍才行,我似乎又懂得了许多呢!)

题目:

思路:

注意这里是每个节点都要访问到的,不能剪枝!!!

容器:

得弄两个vector。

std::vector<std::vector<int>> res:记录最后要返回的结果。

std::vector<int> temp:记录中途的路径,如果有符合的路径,就把这个vector push到res里面。

sum记录中途的结果。

注意:函数形参里的std::vector<int>& temp不要漏引用,不然内存会多用很多!

中止条件:

到达叶子节点就停: (别剪枝)

 if (root->left == nullptr && root->right == nullptr)

逐个查询:

这里有两个要查询的东西,左节点和右节点。

if (root->left != nullptr)dfs(root->left, target, temp, sum + root->val);
if (root->right != nullptr)dfs(root->right, target, temp, sum + root->val);

复杂度计算:

时间复杂度O(n)

空间复杂度O(n) 主要是统计temp用掉的额外空间,如果数退化成链表,就需要n

代码:

#include <vector>
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}};class Solution {
public:std::vector<std::vector<int>> res;std::vector<std::vector<int>> pathTarget(TreeNode* root, int target) {if (root == nullptr) return res;std::vector<int> temp;dfs(root, target, temp, 0);return res;}void dfs(TreeNode* root, int target, std::vector<int>& temp, int sum){temp.push_back(root->val);if (root->left == nullptr && root->right == nullptr)//如果叶子节点{if (sum + root->val == target)//如果符合{res.push_back(temp);}}else{if (root->left != nullptr)dfs(root->left, target, temp, sum + root->val);if (root->right != nullptr)dfs(root->right, target, temp, sum + root->val);}temp.pop_back();//回溯return;}};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/324471.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次canal除坑记录

记一次canal除坑记录 错误信息 Caused by :com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table 问题处理 今天对Canal相关程序进行升级&#xff0c;原监听的表及业务都正常&#xff1b;遇到新增加的表时总是不走&#xff1b;…

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境!

Jenkins是一个流行的开源持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;工具&#xff0c;它通过自动化构建、测试和部署过程&#xff0c;帮助开发团队更高效地交付软件。Jenkins的…

UG装配-沿线运动

如果希望图中圆柱销沿着槽运动&#xff0c;直接约束面是困难的&#xff0c;我们可以画出圆弧的中心线和圆柱销的中心点&#xff0c;约束点在线上&#xff0c;进行移动 需要注意的是&#xff0c;我们在零件中画点和线的时候&#xff0c;在装配体默认加载模型引用集的时候是无法显…

AI绘画治愈系风景

大家好&#xff0c;分享风景壁纸&#xff0c;缓解心情。 是非成败转头空&#xff0c;青山常在&#xff0c;暖阳不移。 渡人先渡己&#xff0c;选取色彩缤纷故事&#xff0c;运用AI绘画&#xff0c;构建我们平时极少看到的场景&#xff0c;又有冲突和破碎感&#xff0c;融在一…

记录 搭载小车 运行激光slam lio-sam fast-lio2

用了将近一个月搭载了一台履带车 其中 主控&#xff1a;NUC i7-8559U 激光雷达为&#xff1a;velodyne16线和hesai64线 IMU为&#xff1a;轮趣N100 mini 对imu使用上位机进行调平矫正 设置输出400HZ 对外参标定 首先使用velodyne16线 安装驱动直接运行&#xff0c;没遇到啥…

易图讯便携式三维电子沙盘实战应用系统

便携式三维电子沙盘采用军工加固三防高性能笔记本&#xff0c;具有IP65级防尘防水防摔性能&#xff0c;以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;支持高清卫星影像、DEM高程数据、矢量数据、三维模型、倾斜摄像、BIM、点云、城市白模、等高线、标高…

【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

2-sql注入之sqli-labs靶场搭建

文章目录 SQL注入之sqli-labs靶场搭建1、Sqli-labs环境安装需要安装以下环境工具下载链接&#xff1a; 2、phpstudy连接mysql总是启动了又停止第一种情况可能是端口占用问题第二种情况就是曾经在电脑上安装过mysql SQL注入之sqli-labs靶场搭建 Sqli-labs是一个印度程序员写的&…

vue-cli配置自定义打包命令

vue-cli配置自定义打包命令 一、目录结构二、.env.development三、.env.production四、 对应打包命令 一、目录结构 在vue项目中&#xff0c;env是全局配置文件&#xff0c;可以存储不同环境下的变量。 使用vue-cli搭建项目&#xff0c;默认会在根目录创建一个.env文件 如果需…

Maven(mvn)的学习下载和配置

文章目录 Maven&#xff08;mvn&#xff09;1.Maven 是什么&#xff1f;2.Maven做什么&#xff1f;2.1传统方式对项目的管理2.2Maven对jar包的管理 3.Maven怎么学3.1Maven如何创建项目3.2Maven的下载与配置3.3Maven的项目结构3.4Maven依赖的引入3.5Maven依赖的剔除3.6Maven依赖…

MySQL基础篇(四)事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一期向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 注意&#xff1a; 默认 MySQL 的事务是 自动提交 的&#…

基于springboot的java读取文档内容(超简单)

读取一个word文档里面的内容&#xff0c;并取出来。 代码&#xff1a; SneakyThrowsGetMapping(value "/readWordDoc")ApiOperationSupport(order 1)ApiOperation(value "文档读取 ", notes "文档读取 ")public R ReadWordDoc () {System.o…