力扣每日一题day36[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
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

递归

可以使用深度优先遍历的方式来遍历二叉树

确定递归函数的参数和返回类型

参数:需要二叉树的根节点,还需要一个计数器,这个计数器用来计算二叉树的一条边之和是否正好是目标和,计数器为int型。

再来看返回值,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:

  • 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。

  • 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。

  • 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。

而本题我们要找一条符合条件的路径,所以递归函数需要返回值,及时返回,那么返回类型是什么呢?

遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。

所以代码如下:

boolean traversal(TreeNode cur,int targetSum)

确定终止条件

不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。

如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。

如果遍历到了叶子节点,count不为0,就是没找到。

递归终止条件代码如下:

if(cur.left==null && cur.right==null && targetSum==0) return true;
if(cur.left==null && cur.right==null) return false;

确定单层递归的逻辑

因为终止条件是判断叶子节点,所以递归的过程中就不要让空节点进入递归了。

递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。

代码如下:

if(cur.left!=null) { // 左 (空节点不遍历)// 遇到叶子节点返回true,则直接返回truetargetSum-=cur.left.val;if(traversal(cur.left,targetSum)) return true; // 注意这里有回溯的逻辑
}
if(cur.right!=null){ // 右 (空节点不遍历)// 遇到叶子节点返回true,则直接返回truetargetSum-=cur.right.val;if(traversal(cur.right,targetSum)) return true; // 注意这里有回溯的逻辑
}
return false;

以上代码中是包含着回溯的,没有回溯,如何后撤重新找另一条路径呢。

回溯隐藏在targetSum这里, 因为把targetSum-=cur.right.val; 直接作为参数传进去,函数结束,targetSum的数值没有改变。

为了把回溯的过程体现出来,可以改为如下代码:

if(cur.left!=null){targetSum-=cur.left.val;if(traversal(cur.left,targetSum)) return true;targetSum+=cur.left.val;
}
if(cur.right!=null){targetSum-=cur.right.val;if(traversal(cur.right,targetSum)) return true;targetSum+=cur.right.val;
}
return false;
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if(root==null) return false;return traversal(root,targetSum-root.val);}boolean traversal(TreeNode cur,int targetSum){if(cur.left==null && cur.right==null && targetSum==0) return true;if(cur.left==null && cur.right==null) return false;if(cur.left!=null){targetSum-=cur.left.val;if(traversal(cur.left,targetSum)) return true;targetSum+=cur.left.val;}if(cur.right!=null){targetSum-=cur.right.val;if(traversal(cur.right,targetSum)) return true;targetSum+=cur.right.val;}return false;}
}

迭代

如果使用栈模拟递归的话,那么如果做回溯呢?

此时栈里一个元素不仅要记录该节点指针,还要记录从头结点到该节点的路径数值总和。

class solution {public boolean haspathsum(treenode root, int targetsum) {if(root == null) return false;stack<treenode> stack1 = new stack<>();stack<integer> stack2 = new stack<>();stack1.push(root);stack2.push(root.val);while(!stack1.isempty()) {int size = stack1.size();
​for(int i = 0; i < size; i++) {treenode node = stack1.pop();int sum = stack2.pop();
​// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回trueif(node.left == null && node.right == null && sum == targetsum) {return true;}// 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来if(node.right != null){stack1.push(node.right);stack2.push(sum + node.right.val);}// 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来if(node.left != null) {stack1.push(node.left);stack2.push(sum + node.left.val);}}}return false;}
}

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

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

相关文章

nuxt打包占用磁盘IO

目录 前言排除过程 前言 jenkins运行打包&#xff0c;总是要卡一段时间&#xff0c;磁盘IO很高。我手动执行后的确发现了这个问题&#xff0c;如下图所示。 排除过程 我的方案很原始&#xff0c;利用git恢复到以前的版本&#xff0c;抽检&#xff0c;搞了差不多两个小时&am…

Megatron模型并行研究

Megatron模型并行研究 1. 技术调研 a. Megatron-LM Megatron-LM针对的是特别大的语言模型&#xff0c;使用的是模型并行的训练方式。但和普通的模型并行不同&#xff0c;他采用的其实是张量并行的形式&#xff0c;具体来说就是将一个层切开放到不同的GPU上&#xff0c;属于层…

XC8284B 高效率12MHz,34V升压LED驱动器 LED背光驱动、闪光灯

XC8284B是一个升压转换器驱动多达9个系列白色LED的单节离子电池设计的。其300mV反馈电压降低功率损耗&#xff0c;提高效率。优化后的工作频率可以满足LC滤波器小值和低工作电流的要求&#xff0c;具有较高的效率。内置软启动功能&#xff0c;可减少浪涌电流。微型封装类型为节…

论文中公式怎么降重 papergpt

大家好&#xff0c;今天来聊聊论文中公式怎么降重&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文中公式怎么降重 一、引言 在论文撰写过程中&#xff0c;公式是表达学…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

安卓好用的python编辑器,安卓平台python编辑器

本篇文章给大家谈谈安卓上好用的python编辑软件有哪些&#xff0c;以及安卓上好用的python编辑软件推荐&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 1. 简介 Thonny是基于python内置图形库tkinter开发出来的支持多平台(windows,Mac,Linux)的python IDE&am…

文献速递:生成对抗网络医学影像中的应用—— CG-3DSRGAN:用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络

文献速递&#xff1a;生成对抗网络医学影像中的应用—— CG-3DSRGAN&#xff1a;用于从低剂量PET图像恢复图像质量的分类指导的3D生成对抗网络 本周给大家分享文献的主题是生成对抗网络&#xff08;Generative adversarial networks, GANs&#xff09;在医学影像中的应用。文献…

[已解决]HttpMessageNotReadableException: JSON parse error: Unexpected character:解析JSON时出现异常的问题分析与解决方案

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

人工智能对网络安全的影响

技术的快速发展带来了不断增长的威胁环境&#xff0c;网络犯罪分子和恶意行为者利用我们互联世界中的漏洞。在这个数字时代&#xff0c;数据泄露和网络攻击呈上升趋势&#xff0c;仅靠传统的安全措施已经不够了。人工智能 &#xff08;AI&#xff09; 的进步彻底改变了网络安全…

污水处理厂可视化:让环保与科技共舞

随着科技的飞速发展&#xff0c;我们的生活环境变得越来越美好。然而&#xff0c;随着城市化进程的加快&#xff0c;污水处理问题也日益凸显。如何有效、高效地处理污水&#xff0c;成为了一个亟待解决的问题。而“污水处理厂可视化”技术的出现&#xff0c;为这个问题提供了一…

opencv静态链接error LNK2019

opencv 3.1.0 静态库&#xff0c;包括以下文件 只链接opencv_world310d.lib&#xff0c;报错 opencv_world310d.lib(matrix.obj) : error LNK2019: 无法解析的外部符号 _ippicvsFlip_16u_I8&#xff0c;该符号在函数 "enum IppStatus (__stdcall*__cdecl cv::getFlipFu…

论文阅读——RS DINO

RS DINO: A Novel Panoptic Segmentation Algorithm for High Resolution Remote Sensing Images 基于MASKDINO模型&#xff0c;加了两个模块&#xff1a; BAM&#xff1a;Batch Attention Module 遥感图像切分的时候把一个建筑物整体比如飞机场切分到不同图片中&#xff0c;…

C#文件操作(二)

一、前言 文章的续作前文是&#xff1a; C#文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135117922?spm1001.2014.3001.5501 二、流 流是序列化设备的抽象表示序列化设备可以线性方式储存数据并可按照同样的方式访问一次…

力扣题目学习笔记(OC + Swift)17. 电话号码的字母组合

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

Amazon Toolkit — CodeWhisperer 使用

tFragment--> 官网&#xff1a;https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 最近学习了亚马逊云科技的 代码工具&#xff0c;感慨颇多。下面是安装 和使用的分享。 CodeWhisperer&#xff0c;亚马逊推出的实时 AI 编程助手&#xff0c;是一项基于机器学习…

6. 行为模式 - 观察者模式

亦称&#xff1a; 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式&#xff0c; 允许你定义一种订阅机制&#xff0c; 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象&#xff1a; ​ 顾…

使用Python将OSS文件免费下载到本地:第四步 将ECS中文件下载到本地

大家好&#xff0c;我是水滴~~ 本文将介绍了使用的知识点、以及将ECS中文件下载到本地的代码、并对该代码进行详细解析、最后给出部署方案&#xff0c;希望能对你有所帮助&#xff01; 《Python入门核心技术》专栏总目录・点这里 系列文章 使用Python将OSS文件免费下载到本地…

使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(上篇)

原创 | 文 BFT机器人 3DLiDAR传感器&#xff08;或&#xff09;三维光探测和测距是一种先进的发光仪器&#xff0c;能够像我们人类一样在三维空间中感知现实世界。这项技术特别彻底改变了地球观测、环境监测、侦察和现在的自动驾驶领域&#xff0c;它提供准确和详细数据的能力…

Asp.Net Core 项目中常见中间件调用顺序

常用的 AspNetCore 项目中间件有这些&#xff0c;调用顺序如下图所示&#xff1a; 最后的 Endpoint 就是最终生成响应的中间件。 Configure调用如下&#xff1a; public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseD…

个人财务工具、密钥管理平台、在线会计软件、稍后阅读方案 | 开源专题 No.51

gethomepage/homepage Stars: 10.1k License: GPL-3.0 这个项目是一个现代化、完全静态的、快速且安全的应用程序仪表盘&#xff0c;具有超过 100 种服务和多语言翻译的集成。 快速&#xff1a;网站在构建时以静态方式生成&#xff0c;加载时间飞快。安全&#xff1a;所有对后…