力扣第113题 路径总和 || 树 深度优先搜索 回溯 二叉树

news2024/9/22 1:17:20

题目

113. 路径总和 II

中等

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

提示:

  • 树中节点总数在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

思路和解题方法

  1. 首先判断当前节点 cur 是否为叶子节点,并且路径和 count 是否等于 0。如果是,则将当前路径 path 加入到结果集 ans 中,并返回。

  2. 如果当前节点不是叶子节点,继续判断其左右子节点是否存在。

  3. 如果左子节点存在,将左子节点的值加入到 path 中,同时将路径和 count 减去左子节点的值,然后递归调用 traversal 函数。

  4. 递归调用结束后,恢复路径和 count 的值,即将左子节点的值从 path 中弹出,并将其加回到 count 中。

  5. 如果右子节点存在,执行与左子节点类似的操作。

  6. 最后,将结果集 ans 返回。

        在主函数 pathSum 中,首先判断根节点是否为空。若为空,则直接返回空的结果集 ans

如果根节点不为空,将根节点的值加入到 path 中,并调用 traversal 函数开始遍历搜索满足条件的路径。

        最后,将结果集 ans 返回。

复杂度

        时间复杂度:

                O(n*n)

时间复杂度为O(n * m),其中n是二叉树中节点的数量,m是满足路径和等于给定值的路径数量。

        空间复杂度

                O(n*m)

空间复杂度为O(n * m),需要使用一个二维vector来存储所有路径。

c++ 代码

class Solution {  // 定义一个名为Solution的类
public:  // 类作用域的开始

    vector<vector<int>> ans;  // 一个二维向量,用于存储所有满足条件的路径
    vector<int> path;  // 存储当前路径的节点值

    // 定义一个名为traversal的私有方法,用于遍历二叉树并寻找满足条件的路径
    void traversal(TreeNode *cur,int count)
    {
        // 如果当前节点是叶子节点,并且当前路径上的节点值总和等于目标值
        if(!cur->left && !cur->right && count == 0) 
        {
            // 将当前路径添加到结果中
            ans.push_back(path);
            return;  // 结束此方法
        }
        // 如果当前节点不是叶子节点,直接返回
        if(!cur->left&&!cur->right) return;
        
        // 如果存在左子节点
        if(cur->left)
        {
            // 将左子节点的值添加到当前路径中
            path.push_back(cur->left->val);
            // 减少目标值,因为左子节点的值会被加到子树的和中
            count -= cur->left->val;
            // 递归遍历左子树
            traversal(cur->left,count);
            // 恢复目标值,为后续节点做准备
            count+=cur->left->val;
            // 从当前路径中移除最后一个元素,为后续遍历做准备
            path.pop_back();
        }
        // 如果存在右子节点
        if(cur->right)
        {
            // 将右子节点的值添加到当前路径中
            path.push_back(cur->right->val);
            // 减少目标值,因为右子节点的值会被加到子树的和中
            count -= cur->right->val;
            // 递归遍历右子树
            traversal(cur->right,count);
            // 恢复目标值,为后续节点做准备
            count+=cur->right->val;
            // 从当前路径中移除最后一个元素,为后续遍历做准备
            path.pop_back();
        }
        return;  // 结束此方法
    }

    // 定义一个公有方法,接收二叉树的根节点和目标总和作为参数,并返回满足条件的路径列表
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        // 如果根节点为空,直接返回结果列表(空列表)
        if(root==NULL) return ans;
        // 将当前节点的值添加到当前路径中
        path.push_back(root->val);
        // 减少目标值,因为当前节点的值会被加到子树的和中(但这个值是0,所以实际上没有影响)
        traversal(root,targetSum-root->val);
        // 结束后返回结果列表
        return ans;
    }
};  

c++优化代码

class Solution {
public:
    vector<vector<int>> ans; // 存放最终结果的二维数组
    vector<int> path; // 存放当前路径的数组

    void traversal(TreeNode *cur, int targetSum) {
        if (!cur) return; // 当前节点为空,直接返回

        path.push_back(cur->val); // 将当前节点的值加入路径数组
        targetSum -= cur->val; // 更新目标和

        if (!cur->left && !cur->right && targetSum == 0) { // 当前节点是叶子节点,且路径和等于目标和
            ans.push_back(path); // 将当前路径加入结果数组
        } else {
            traversal(cur->left, targetSum); // 继续遍历左子树
            traversal(cur->right, targetSum); // 继续遍历右子树
        }

        path.pop_back(); // 回溯操作,将当前节点从路径数组中弹出
    }

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        traversal(root, targetSum); // 从根节点开始遍历,并计算路径和
        return ans; // 返回结果数组
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven系列第3篇:详解maven解决依赖问题

maven系列目标&#xff1a;从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第3篇。 我们先来回顾一下什么是maven&#xff1f; maven是apache软件基金会组织维护的一款自动化构件工具&#xff0c;专注服务于java平台的项目构件和依赖管理。 本文主要内容…

高频时序数据仓库

天软课堂将在本周四添加新主题--天软超高频行情数据。针对市场上高频行情数据处理业务的相关痛点&#xff0c;直观的在线演示如何通过天软高频数仓及高性能计算能力&#xff0c;将其逐个击破&#xff0c;期待各位老师的参会。

不吹不黑,网络安全工程师年薪30万是真的吗?

近几年&#xff0c;网络安全愈演愈烈&#xff0c;很多人都开始重视网络安全&#xff0c;有些公司为了招聘网安人才主动给出去30万甚至更高的年薪&#xff0c;那么&#xff0c;今天就来说一下网络安全工程师的那些事&#xff0c;看看他们真的是有这么厉害吗&#xff1f;他们又凭…

如何处理前端路由?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【Redis】Redis性能优化:理解与使用Redis Pipeline

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 Pipeline介绍原生批命令(MSET, MGET) VS PipelinePipeline的优缺点一些疑问Pipeline代码实现 当我们谈论Redis数据处理和存储的优化方法时&#xff0c;「 Redis Pipeline」无疑是一个不能忽视的重要技术。…

06-Zookeeper选举Leader源码剖析

上一篇&#xff1a;05-Zookeeper典型使用场景实战 一、为什么要看源码 提升技术功底&#xff1a;学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底深度掌握技术框架&#xff1a;源码看多…

文献检索技巧收集

在进行文献阅读之前最重要的工作就是文献检索&#xff0c;筛选出有价值的文献进行阅读。在写作的时候直接plain text&#xff0c;少用标题 文献检索–>文献阅读–>文献整理–>… 一、搜索技巧 加不加引号&#xff0c;在搜索中文时不会有这个烦恼&#xff0c;中文分词时…

Unity实现设计模式——适配器模式

Unity实现设计模式——适配器模式 适配器模式又称为变压器模式、包装模式&#xff08;Wrapper&#xff09; 将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 在一个在役的项目期望在原有接口的基础…

短视频营销:品牌与年轻消费者的新连接方式

近年短视频平台早已成为了品牌推广的首选热门渠道。通过短小精悍、生动有趣的视频内容&#xff0c;品牌可以与用户进行更直接、更有效的互动&#xff0c;传递品牌形象和价值观。在本文中&#xff0c;我们将介绍一些成功的短视频营销案例&#xff0c;展示创新引领品牌推广的新时…

K8S存储总结持久化存储解决方案(以NFS为例)

目录 K8S存储 一、emptydir 1. emptydir是什么 2. emptydir例子 二、hostpath hostpath 是什么 hostpath 例子 弊端 三、持久化存储 1.Persistent Volume(PV) 2.Persistent Volume Claim(PVC) 3.PV/PVC结合NFS使用实践&#xff08;持久存储&#xff09; 1. NFS服务…

LeetCode-94-二叉树的中序遍历

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-94-二叉树的中序遍历 解题思路&#xff1a;递归&#xff0c;具体可以参考 LeetCode-144-二叉树的前序遍历 代码实现&#xff1a; class Solution {List<Integer> listnew ArrayList<>();public List<Integer…

基于SpringBoot的网上摄影工作室

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 作品分类管理 轮播图管理 摄影作品管理 摄影作品收藏 摄影圈 摄影作品发布 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统…

启动Spring Boot项目

介绍启动运行Spring Boot项目打包的jar 1、使用java -jar命令启动项目 java -jar project.jar 执行效果&#xff1a; 使用java -jar 文件名.jar启动项目&#xff0c;项目在前台运行&#xff0c;项目运行的日志将打印在当前控制台上&#xff0c;若退出当前控制台&#xff0c…

汽车烟雾测漏仪(EP120)

【汽车烟雾测漏仪&#xff08;EP120&#xff09;】 此烟雾测漏仪专为车辆管道&#xff08;油道、气道、冷却管道&#xff09; 的泄露检测而设计。适用于所有轻型 汽车、摩托车、轻卡、游艇等。 【特点】 具有空气模式和烟雾模式。空气模式&#xff0c;无需烟雾&#xff0c;检测…

Springboot 订餐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 订餐管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有 完整的源代码和数据库&…

HTML5+CSS3+JS小实例:仿优酷视频轮播图

实例:仿优酷视频轮播图 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

矩阵分解PCA,SVD

PCA 协方差矩阵的特征向量是PCA主成分的方向。 数据----去中心化-------协方差矩阵---------特征向量表示坐标轴方向&#xff0c;特征值表示坐标轴方向的方差 缺点&#xff1a;受离群值的影响很大 主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#…

内网穿透方法汇总

内网穿透 1.ddns原理和使用条件 电信宽带&#xff1a;通过难过光猫拨号&#xff0c;得到的如果是私网的IP&#xff0c;可以通过10000号投诉&#xff0c;从而得到公网IP&#xff08;浮动IP&#xff0c;每次拨号会分配一个IP&#xff0c;可以通过ddns实现通过域名绑定&#xff…

2.8 Flowmap的实现

一、Flowmap是什么 Valve 2010的GDC讲座&#xff0c;《求生之路2》中水的制作 http://alex.vlachos.com/graphics/Vlachos-SIGGRAPH10-WaterFlow.pdf Water (shader) - Valve Developer Community 1.Flowmap的本质 一张记录了2D向量信息的纹理&#xff0c;Flowmap上的颜色&…