算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

news2024/11/15 21:54:08

前言

二叉树篇继续。
记录 四十九【112. 路径总和】和【113. 路径总和ii】


一、【112. 路径总和】题目阅读

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

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

示例 1:
在这里插入图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:
在这里插入图片描述

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

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

二、【112. 路径总和】尝试实现

题目目标是找一条路径上节点之和=targetsum。

找路径,可以想到:记录 四十六【257. 二叉树的所有路径】 就是求路径,这里在记录四十六的基础上求和判断是否相等即可

方法【递归结合回溯】

(1)递归函数参数:需要节点TreeNode* cur;还需要path记录:vector< int > path;传递目标值:int targetsum。三个参数。
(2)递归函数返回值:bool,等于targetsum时,return true;不等于return false。
(3)终止条件:遇到叶子节点时——

  • 处理逻辑:遍历path,判断这条根节点到叶子节点的路径之和是否等于targetsum。是,return true;否则,return false。

(4)单层逻辑:

  • 先左子树的路径,如果下一层返回true,说明已经找到了,可以直接return true,接着向上层返回;如果没有:
  • 继续右子树路径,同理,如果下一层返回true,说明已经找到了,可以直接return true,接着向上层返回;
  • 左右都没能直接return true,那么该层及以下返回 false,让上一层重新遍历。
  • 回溯:path在“递”遍历时,在push_back元素,当返回时且返回false,需要pop_back弹出加入的元素。进行回溯。

(5)总结:与记录 四十六【257. 二叉树的所有路径】的区别:

  • 终止条件:处理逻辑改成求和;
  • 一遇到return true,可以直接return true。

代码实现【递归+回溯+前序遍历】

/**
 * Definition for a binary tree node.
 * 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:
    bool traversal(TreeNode* cur,vector<int>& path,int targetSum){
        path.push_back(cur->val);
        if(!cur->left &&!cur->right){//叶子节点
        	//区别一
            int sum = 0;
            for(int num:path){
                sum += num;
            }
            if(sum == targetSum) return true;
            else return false;
        }
        if(cur->left){
        	//区别二
            if(traversal(cur->left,path,targetSum)) return true;
            else path.pop_back();//回溯
        }
        if(cur->right){
            if(traversal(cur->right,path,targetSum)) return true;
            else path.pop_back();//回溯
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        vector<int> path;
        if(!root) return false;
        return traversal(root,path,targetSum);
    }
};

三、【112. 路径总和】参考学习

参考学习链接

学习内容

  1. 递归思路:直接用targetsum减去路径上的节点值,如果遇到叶子节点时,刚好减到0,说明找到;如果不等于0,说明没找到。
  2. 和二、尝试实现中的思路区别:
  • 二、中的思路是先搜集路径,用path存放,最后判断和是否相等;
  • 参考思路:不用记录路径,直接targetsum减值。
  1. 参考思路的递归实现
  • 递归函数参数:需要节点TreeNode* cur;和此时targetsum减剩下多少值:int count ;
  • 递归函数返回值:题目给true和false的判断,所以设定bool类型;
  • 递归终止条件:叶子节点和count == 0的结合。说明要在父节点那一层先减子节点的值,当“递”到下一层可以直接判断终止条件。
  • 递归逻辑:
    • 当左子树存在,先减去左孩子的值,“递”给下一层。如果返回true,可以直接return true;注意:回溯,count减掉左孩子的值,当“回归”时,count要加回来。
    • 当右子树存在,同理。
  1. 另一种递归+回溯实现:可以对比二、中的代码实现

    /**
     * Definition for a binary tree node.
     * 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:
        bool traversal(TreeNode* cur,int count){
            if(!cur->left && !cur->right && count ==0) return true;//叶子节点且减到0,目标get。
            if(!cur->left && !cur->right && count != 0) return false;//路径结束,和不等。
    
            if(cur->left){
                //count在这一层没改变,“递给”下一层做减法
                //当返回true时,直接返回。
                if(traversal(cur->left,count-cur->left->val)) return true;
            }
            if(cur->right){//同理
                if(traversal(cur->right,count-cur->right->val)) return true;
            }
            return false;
        }
        bool hasPathSum(TreeNode* root, int targetSum) {
            if(!root) return false;
            return traversal(root,targetSum-root->val);
        }
    };
    
  2. 迭代法思路:思路和递归一样,用栈实现。而且依然是用targetsum做减法。结合迭代遍历的模版实现:

  • 但是栈中放的元素,需要记录到它这里,targetsum减剩下多少值。所以用pair类型。
  1. 代码实现【迭代】
    和参考中的区别:参考进行求和;下面进行减法(递归的思路)。
    /**
     * Definition for a binary tree node.
     * 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:
        bool hasPathSum(TreeNode* root, int targetSum) {
            stack<pair<TreeNode* ,int>> st;
            if(!root) return false;
            st.push(pair<TreeNode* ,int> (root,targetSum-root->val));
            while(!st.empty()){
                pair<TreeNode*,int> num = st.top();
                st.pop();
                if(!num.first->left && !num.first->right && num.second == 0){//叶子节点
                    return true;
                }
                if(!num.first->left && !num.first->right && num.second != 0){
                    continue;
                }
                if(num.first->right){//右孩子存在
                    st.push(pair<TreeNode* ,int> (num.first->right,num.second-num.first->right->val));
                }
                if(num.first->left){//处理左孩子,和右孩子同理
                    st.push(pair<TreeNode* ,int> (num.first->left,num.second-num.first->left->val));
                }
            }
            return false;
        }
    };
    

四、【113. 路径总和ii】题目阅读

经过112学习,提示同类型题:【113. 路径总和ii】。那么来做下【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

五、【113. 路径总和ii】尝试实现

和【112. 路径总和】的区别:113让求出所有和等于目标值的路径。112能找到一条就可以return。

思路

  1. 求和思路:和112肯定一样。但是需要记录整个路径,所以vector< int > path在此处的作用比上面大。
  2. 递归实现,三步确定:
  • 递归参数:需要节点TreeNode* cur;需要记录路径:vector< int >& path;需要路径集合:vector<vector< int >>& result ;需要target到该节点,减剩下多少值:int count。整了4个参数。
  • 递归返回值:因为把结果都放到result中,也不需要返回什么,所以void。
  • 递归终止条件:
    • 遇到叶子节点且count==0,说明该路径要放入result。return;
    • 遇到叶子节点但count != 0,说明该路径不用放入result。直接return;
  • 递归逻辑:
    • 先把当前节点放到path中。
    • 如果左子树存在,深入遍历。“回归”的时候,path回溯,进行pop_back
    • 如果右子树存在,深入遍历。“回归”的时候,path回溯,进行pop_back

代码实现【递归+回溯+前序】

/**
 * Definition for a binary tree node.
 * 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:
    void traversal(TreeNode* cur,vector<int>& path,vector<vector<int>>& result,int count){
        path.push_back(cur->val);//中
        if(!cur->left && !cur->right && count == 0){//符合条件的路径
            result.push_back(path);
            return;
        }
        if(!cur->left &&!cur->right && count != 0){//一条完整路径,但是不符合条件
            return;//不放入result,直接return
        }
        if(cur->left){
            traversal(cur->left,path,result,count-cur->left->val);
            path.pop_back();//回溯
        }
        if(cur->right){
            traversal(cur->right,path,result,count-cur->right->val);
            path.pop_back();
        }
        return;
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        vector<vector<int>> result;//返回值,路径集合
        vector<int> path;//记录路径
        if(!root) return result;
        traversal(root,path,result,targetSum-root->val);
        return result;
    }
};

六、【113. 路径总和ii】参考学习

参考学习链接

代码区别:

  • path和result的形式——参考用成员变量,不放到参数部分;五、中代码实现放到参数里。
  • 都是用targetsum减节点值,传递减剩下多少值。

总结

【112. 路径总和】和【113. 路径总和ii】:
在这里插入图片描述
(欢迎指正,转载标明出处)

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

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

相关文章

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1"&#xff0c;选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机&#xff0c;比如我选择的是192.168.0.104&#xff1a; 结果提示&#xff1a;Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

走进NoSql

一、引入 1.1什么是NoSql NoSQL&#xff08;Not Only SQL&#xff09;是一组非关系型数据库&#xff08;或称为非SQL数据库&#xff09;的统称&#xff0c;它们提供了与传统的关系型数据库不同的数据存储和检索方式。NoSQL数据库通常用于处理大量的、分布式的、非结构化或半结…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下&#xff0c;如何使用阿里云物联网平台&#xff0c;创建一个简单的远程控制小灯示例。 完整工程&a…

BurpSuit的intruder模块结果进行筛选和导出

文章目录 一、搭建的测试网站第一步 先抓去数据包,查看数据包第二步 可以控制返回信息一条一条的显示第三步 使用intrude模块进行遍历,每次只显示一条用户信息第四步 配置过滤规则第五步 查看结果显示第六步 进行数据导出第七步 查看导出的表格二、实际项目中使用免责声明一、…

PCIe驱动开发(3)— 驱动设备文件的创建与操作

PCIe驱动开发&#xff08;3&#xff09;— 驱动设备文件的创建与操作 一、前言 在 Linux 中一切皆为文件&#xff0c;驱动加载成功以后会在“/dev”目录下生成一个相应的文件&#xff0c;应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即…

Azure Repos 仓库管理

从远端仓库克隆到本地 前提:本地要安装git,并且登录了账户 1.在要放这个远程仓库的路径下,打git 然后 git clone https://.. 如果要登录验证,那就验证下,点 generate git credentials,复制password 克隆完后,cd 到克隆的路径, 可以用 git branch -a //查看分…

Spring Cloud环境搭建

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 开发环境安装 1.1 安装JDK ​1.2 安装MySQL 2. 案列介绍 2.1 …

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具&#xff0c;可以实时动态显示系统中各个进程的资源占用情况&#xff0c;包括CPU、内存等。 进入 linux 系统&#xff0c;直接输入 top&#xff0c;回车&…

全网超详细Redis主从部署(附出现bug原因)

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 http://t.csdnimg.cn/zkpBE http://t.csdnimg.cn/lUU5gLinux环境下配置redis 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redi…

书生大模型第三关-Git基础

1.任务1: 破冰活动&#xff1a;自我介绍 目标&#xff1a; 每位参与者提交一份自我介绍。 提交地址&#xff1a;https://github.com/InternLM/Tutorial 的 camp3 分支&#xff5e; 行动&#xff1a; 首先Fork项目到自己Repo中&#xff0c;然后git clone在本地上 然后创建一个…

liunx面试题目

如何看当前Linux系统有几颗物理CPU和每颗CPU的核数&#xff1f; 查看物理cup&#xff1a; cat /proc/cpuinfo|grep -c ‘physical id’ 查看每颗cup核数 cat /proc/cpuinfo|grep -c ‘processor’ 若希望自动实现软件包的更新&#xff0c;可以使用yum-cron并启动该服务 yum -y …

【java计算机毕设】农产品仓库管理系统系统MySQL ssm JSP maven项目代码+文档 前后端一体 暑假作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】农产品仓库管理系统系统MySQL ssm vue maven项目代码文档 前后端一体 暑假作业 2项目介绍 系统功能&#xff1a; 农产品仓库管理包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改个人信息和…

60K起?“软件安全岗”比“网络安全岗”薪资高在哪里?

在网络世界的江湖中&#xff0c;“软件安全”与“网络安全”这两大“武林高手”都肩负着守护数字领域和平的重任。不过&#xff0c;眼尖的小伙伴们可能发现了&#xff0c;软件安全岗位的薪资待遇往往比网络安全岗位要丰厚那么一些&#xff0c;这到底是为啥呢&#xff1f;今天&a…

【AI绘画教程】Stable Diffusion 1.5 vs 2

在本文中,我们将总结稳定扩散 1 与稳定扩散 2 辩论中的所有要点。我们将在第一部分中查看这些差异存在的实际原因,但如果您想直接了解实际差异,您可以跳下否定提示部分。让我们开始吧! Stable Diffusion 2.1 发布与1.5相比,2.1旨在解决2.0的许多相对缺点。本文的内容与理解…

数字化转型“破局”:低代码开发平台如何缩短开发交付周期,提升效率

日新月异的数字时代&#xff0c;各行业正经历着前所未有的变革与转型。随着大数据、云计算、人工智能等技术的不断成熟与融合&#xff0c;数字化转型的步伐愈发坚定而迅速&#xff0c;成为企业转型升级、实现可持续发展的必由之路。然而&#xff0c;传统的软件开发模式受限于高…

35.UART(通用异步收发传输器)-RS232(2)

&#xff08;1&#xff09;RS232接收模块visio框图&#xff1a; &#xff08;2&#xff09;接收模块Verilog代码编写: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

如何防止漏洞攻击

随着信息技术的日新月异&#xff0c;企业在日常运营中对网络和数字化系统的依赖日益加深。然而&#xff0c;这种高度依赖也伴随着网络安全威胁的急剧增长&#xff0c;对企业的核心资产与数据构成了严峻挑战。为了有效捍卫企业利益&#xff0c;确保运营无忧&#xff0c;积极构建…

Monaco 使用 DocumentHighlightProvider

Monaco 中有一个文字高亮的功能&#xff0c;就是选中一个单词&#xff0c;会高亮文字文档中所有出现该单词的位置&#xff0c;效果如下&#xff1a; Monaco 默认就有这个功能&#xff0c;可以根据具体需求进行定制。通过 registerDocumentHighlightProvider 进行注册 实现 pro…

无人机之图传距离的决定因素

一、发射功率&#xff1a;图传设备的发射功率越大&#xff0c;信号能够传播的距离就越远 二、工作频段&#xff1a;不同频段具有不同的传播特性&#xff0c;一些频段在相同条件下可能具有更远的传输距离。 三、天线性能&#xff1a;优质的天线可以增强信号的发送和接收能力&a…

9.11和9.9哪个数更大?所有模型测试

目录 通义千问2.5 通义千问2_0.5b kimi 智谱清言 ​编辑讯飞星火 秘塔搜索 文言一心 豆包 腾讯元宝 海螺AI ChatGPT 3.5 Gemini 1.0 通义千问72B Claude-3 天工AI 参赛选手&#xff1a;讯飞星火、文言一心、腾讯元宝、海螺AI、通义千问72B、天工AI、 通义千问2…