数据结构学习 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;
    }
    
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零学算法17

17.给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[…

GLTF编辑器实现逼真的石门模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中&#xff0c;每个像素点都包含了一个法线向量&#xff0…

【开源项目】超经典数字孪生智慧物流园

数字孪生物流园管理系统&#xff0c;具有仓储管理智能化、运输管理自动化、物流管理系统化、共享服务平台化等特点。飞渡科技基于数字孪生、物联网IOT、人工智能等新一代信息技术&#xff0c;以智能设备为基底&#xff0c;通过人、物、资源、系统等多方数据的传递和交互&#x…

记一次canal除坑记录

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

【第七在线】智能商品系统是否可以帮助预测新品的销售表现?

智能商品系统在鞋服企业商品运营中的应用已经成为一种趋势。随着技术的发展和数据的积累&#xff0c;智能化已经成为企业提高运营效率和市场竞争力的重要手段。其中&#xff0c;智能商品系统通过对大量销售数据的分析&#xff0c;可以帮助预测新品的销售表现&#xff0c;为企业…

Linux驱动(三)platform总线驱动

1、前言 Platform总线是Linux内核中用于管理嵌入式系统中的设备的一种总线类型。它允许设备驱动程序通过一组标准的接口与嵌入式系统中的硬件设备进行通信。 Platform总线维护了一个驱动链表和一个设备链表&#xff0c;当有新的设备添加后会通过自身的match函数遍历驱动链表查…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80 注意点&#xff1a;后续使用的时候会报错 需要手动创…

LeetCode-无重复字符的最长子串(3)

题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 代码&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> occnew HashSet<Character>();int lens.length();int…

Local server not started, start with 报错python -m weditor

一、python -m weditor 如图报错 Local server not started, start with 报错 二、解决方案 右上角选择新的无痕窗口下&#xff0c;然后打开 http://localhost:17310/ 即可

VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本,请确保该脚本没有错误。您也可以提交支持请求,报告此问题。

问题描述&#xff1a;今天打开centos7虚拟机就是直接打不开了报了下面的错误&#xff0c;也没有动任何东西&#xff0c;点确定后&#xff0c;也是依然没有反应 问题原因&#xff1a;可能是虚拟机中的内存满了&#xff0c;需要清理内存 解决方法如下 首先cmd打开终端敲入如下命…

linux磁盘管理实验1

1.在安装好的linux系统中新加一块硬盘&#xff0c;将硬盘分成2个主分区&#xff0c;和2个逻辑分区&#xff0c;将其中一个逻辑分区设置成vfat&#xff08;FAT32&#xff09;分区&#xff0c;并实现开机自动挂载所有分区。 答&#xff1a;添加一个硬盘为sdb 分成2个主分区&#…

LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

文章首发于公众号&#xff1a;机器感知 LLM增强LLM&#xff1b;通过预测上下文来提高文生图质量&#xff1b;Spikformer V2&#xff1b;同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expanding Capabilities through Composition 本文研究了如何高效地组…

面试算法96:字符串交织

题目 输入3个字符串s1、s2和s3&#xff0c;请判断字符串s3能不能由字符串s1和s2交织而成&#xff0c;即字符串s3的所有字符都是字符串s1或s2中的字符&#xff0c;字符串s1和s2中的字符都将出现在字符串s3中且相对位置不变。例如&#xff0c;字符串"aadbbcbcac"可以由…

透明OLED屏制作:工艺与技术挑战

透明OLED屏作为一种前沿的显示技术&#xff0c;其制作过程涉及一系列复杂的工艺和技术挑战。作为一名专注于OLED技术研发的工程师&#xff0c;我将为大家深入解析透明OLED屏的制作过程&#xff0c;以及所面临的挑战。 首先&#xff0c;透明OLED屏的制作过程大致可分为以下几个步…

使用.Net nanoFramework为ESP32进行蓝牙配网

通过前面的介绍&#xff0c;我们已经学会了如何使用 .NET nanoFramework 为 ESP32 设备连接 Wi-Fi 网络。然而&#xff0c;在实际的物联网环境中&#xff0c;我们往往需要使用更便捷的式来满足配网需求。这篇文章将带你了解一些常见的配网方案&#xff0c;并以 ESP32 为例&…

【Java 进阶篇】Nginx 使用详解:搭建高性能的 Web 服务器

在互联网的世界里&#xff0c;Web 服务器是我们访问网站、获取信息的入口。Nginx&#xff08;发音"engine x"&#xff09;作为一款轻量级、高性能的 Web 服务器和反向代理服务器&#xff0c;因其出色的性能和可扩展性而备受推崇。本文将围绕 Nginx 的使用进行详解&am…

KK集团高管变更:陈世欣任总经理,涉无证放贷遭关注,还曾被处罚

近日&#xff0c;KK集团关联公司广东快客电子商务有限公司&#xff08;下称“KK集团”&#xff09;发生工商变更&#xff0c;其中郭惠波不再担任该公司总经理一职&#xff0c;由陈世欣接任。而在早前&#xff0c;陈世欣曾于2020年取代吴悦宁担任总经理职务&#xff0c;2021年7月…

Linux服务器的几种类型

Linux是一个开源操作系统内核&#xff0c;用作各种Linux发行版&#xff08;也称为“distros”&#xff09;的核心组件。由Linus Torvalds于1991年开发&#xff0c;Linux基于Unix操作系统。它以其稳定性、安全性和多功能性而闻名。 Linux的关键特点&#xff1a; 开源性质&#…

每日一道算法题day-three(备战蓝桥杯)

哈喽大家好&#xff0c;今天来给大家带来每日一道算法题系列第三天&#xff0c;让我们来看看今天的题目&#xff0c;一起备战蓝桥杯 题目&#xff1a; 小 Y的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 11 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…