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

前言

二叉树篇继续。
记录 四十九【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.mzph.cn/news/872713.shtml

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

相关文章

django-ckeditor富文本编辑器

一.安装django-ckeditor 1.安装 pip install django-ckeditor2.注册应用 INSTALLED_APPS [...ckeditor&#xff0c; ]3.配置model from ckeditor.fields import RichTextFieldcontent RichTextField()4.在项目中manage.py文件下重新执行迁移&#xff0c;生成迁移文件 py…

R语言模型评估网格搜索

### 网格搜索 ### install.packages("gbm") set.seed(1234) library(caret) library(gbm) fitControl <- trainControl(method repeatedcv,number 10,repeats 5) # 设置网格搜索的参数池 gbmGrid <- expand.grid(interaction.depth c(3,5,9),n.trees (1:2…

轨道交通AR交互教学定制公司优选深圳华锐视点

在寻找上海AR开发制作公司作为合作伙伴的过程中&#xff0c;选择一家既技术深厚又具备丰富经验的AR开发企业&#xff0c;成为了众多客户与合作伙伴的共同追求。华锐视点上海AR开发制作公司作为业界的佼佼者&#xff0c;凭借其卓越的公司规模、丰富的行业案例以及顶尖的ar增强现…

Unity基础调色

叭叭叭 最近&#xff08;*这两天&#xff09;因为想做一些Unity的调色问题&#xff0c;尝试原文翻译一下&#xff0c;其实直接原文更好&#xff01;&#xff01; Color Grading 参考了&#xff0c;某大牛的翻译&#xff0c;实在忍不住了&#xff0c;我是不知道为什么能翻译成…

OpenSceneGraph学习笔记

目录 引言第一章&#xff1a;OSG概述一、前言&#xff08;1&#xff09;为什么要学习OSG?&#xff08;2&#xff09;OSG的组成&#xff08;3&#xff09;OSG的智能指针&#xff08;4&#xff09;OSG的安装编译 二、第一个OSG程序&#xff08;1&#xff09;Hello OSG程序&#…

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

Linux热键,shell含义及权限介绍

君子忧道不忧贫。 —— 孔丘 Linux操作系统的权限 1、几个常用的热键介绍1、1、[Tab]键1、2、[ctrl]-c1、3、[ctrl]-d1、4、[ctrl]-r 2、shell命令以及运行原理3、权限3、1、什么是权限3、2、权限的本质3、3、Linux中的用户3、4、Linux中文件的权限3、4、1、快速掌握修改权限的…

vue引用js html页面 vue引用js动态效果

要引用的index.html页面&#xff1a;&#xff08;资源来自网络&#xff09;在pubilc下建一个static文件放入js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>数字翻转</title><meta con…

速部署 HBase 测试环境

快速部署 HBase 测试环境 第一步&#xff1a;下载软件&#xff0c;在HBase官网下载最新版&#xff0c; 找到 bin&#xff0c;点击下载&#xff0c;比如我这里下载的是 hbase-2.5.6-bin.tar.gz 第二步&#xff1a;解压软件 $ tar -zxvf hbase-2.5.6-bin.tar.gz $ cd hbase-2.…

Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性&#xff0c;易调用性、泛化性和还原性&#xff0c;任何一个lora只能完美满足其中的两项&#xff1b; 易调用性&#xff1a;在已调用lora后&#xff0c;还需要多少提示词才能让该lora完全生效&#xff1b; 泛化性&#xff1a;能不能还原lora训练素…

杜甫很 忙

我 我希望大家别再乱搞了

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器&#xff08; S S H V S c o d e &#xff09; \huge{Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09;} Windows终端远程登陆Linux服务器&#xff08;SSHVScode&#xff09; 文章目录 写在前面通过SSH远程连接L…

golang程序性能提升改进篇之文件的读写---第一篇

背景&#xff1a;接手的项目是golang开发的&#xff08;本人初次接触golang&#xff09;经常出现oom。这个程序是计算和io密集型&#xff0c;调用流量属于明显有波峰波谷&#xff0c;但是因为各种原因&#xff0c;当前无法快速通过serverless或者动态在高峰时段调整资源&#x…

「邀您参会」首个中国可观测日即将盛大开幕

在云计算领域不断探索与创新的背景下&#xff0c;亚马逊云科技与观测云今日宣布&#xff0c;将联合举办中国可观测日&#xff08;Observability Day&#xff09;活动&#xff0c;旨在深化双方合作&#xff0c;共同推动中国可观测性的发展。 中国站首站&#xff0c;选址上海&am…

软件测试——非功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

【启明智显方案分享】工业级HMI芯片MODEL3\MODEL4应用于电梯系统多媒体

一、方案概述 本方案采用工业级HMI芯片MODEL3或MODEL4作为核心处理器&#xff0c;结合7寸以上高清显示屏&#xff0c;为电梯系统提供多媒体解决方案。该方案不仅能够显示日期、时间、楼层信息等基础信息&#xff0c;还能播放广告、通知、视频等多媒体内容&#xff0c;增强电梯…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述&#xff1a; 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

友讯随身WiFi和格行随身WiFi真实测评!彩屏款随身WiFi谁更胜一筹?随身WiFi哪个最好用?随身WiFi哪个口碑最好?哪个性价比更高?

在众多随身WiFi品牌中&#xff0c;友讯&#xff08;D-Link&#xff09;与格行&#xff08;Gexing&#xff09;都是彩屏款随身WiFi因其相似的设计和各自独特的品牌背景&#xff0c;常常让消费者难以抉择。今天&#xff0c;我们就来一场真实测评&#xff0c;深入剖析这两款彩屏随…

求解答word图标变白

把WPS卸载了之后就变成白色了&#xff0c;然后在注册表中把word的地址改成office word的地址之后图标变成这样了&#xff0c;怎么办

Talk|清华大学袁天远:PreSight - 利用NeRF先验帮助自动驾驶场景在线感知

本期为TechBeat人工智能社区第605期线上Talk。 北京时间7月3日(周三)20:00&#xff0c;清华大学博士生—袁天远的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “PreSight - 利用NeRF先验帮助自动驾驶场景在线感知”&#xff0c;他向大家介绍了新…