[二叉树路径总和] 一杯茶一包烟,一个递归转一天
LeetCode 第112题 路径总和 做题记录
- 题目描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20210409154915348.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzMyNjE2,size_16,color_FFFFFF,t_70)
- 我的解法
- 思路
- 对应Java代码
- 复杂度分析
- 递归法的进一步总结
- 本题修改后的更优解法
- 对应Java代码
- 复杂度分析
- 另外一道113题 统计所有满足条件的路径
题目描述![](/assets/blank.gif)
我的解法
思路
参照之前记录所有路径的题目,使用递归法
- 确定参数和返回值
不设置返回值
参数:访问节点,从根节点到当前节点路径上的值
设置一个全局变量,boolean型,初始值设为false,碰到满足条件的修改为true - 确定终止条件
碰到叶子节点,进行条件判断和处理 - 确定单层处理逻辑
将当前节点的值与累积的路径值相加
如果左节点不为空,访问左节点
如果左节点不为空,访问右节点
对应Java代码
class Solution {private boolean res = false;public boolean hasPathSum(TreeNode root, int targetSum) {if(root == null){return res;}traversal(root, 0, targetSum);return res;}public void traversal(TreeNode cur, int pathSum, int targetSum){pathSum += cur.val;if(cur.left == null && cur.right == null){if(pathSum == targetSum){res = true;return;}}if(cur.left != null){traversal(cur.left, pathSum, targetSum);}if(cur.right != null){traversal(cur.right, pathSum, targetSum);}}
}
复杂度分析
时间复杂度:O(n) 其实n是树的节点,对每个节点访问一次
空间复杂度:O(h) 其中h是树的高度,空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈链状,空间复杂度为O(n),平均情况下树的高度与节点数的对数正相关,空间复杂度为O(logn)
递归法的进一步总结
关于递归函数什么时候需要返回值?什么时候不需要?
在做题过程中发现有些题似乎不管有没有返回值都能解决,比如本题,上面的解法没有返回值成功解决了,但实际上以最优的方式来将有区别的。本题要求只要找到一个合适的就可以结束了,但是上面没有返回值的解法,找到一个合适的后还会将整棵树都遍历完。
一个简单的规律是:
1. 如果需要搜索整棵二叉树,那么递归函数就要返回值
2. 如果要搜索其中一条符合条件的路径(即遍历过程中找到合适的情况),递归函数就需要返回值,因为遇到符合条件的就要及时返回,减少后面不必要的遍历
本题修改后的更优解法
此部分转载于公众号代码随想录
对应Java代码
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if(root == null){return false;}return traversal(root, targetSum - root.val);}public boolean traversal(TreeNode cur, int count){if(cur.left == null && cur.right == null && count == 0){ return true; }if(cur.left == null && cur.right == null){ return false; }if(cur.left != null){count -= cur.left.val;if(traversal(cur.left, count)) {return true;}count += cur.left.val;}if(cur.right != null){count -= cur.right.val;if(traversal(cur.right, count)) {return true;}count += cur.right.val;}return false;}
}
复杂度分析
同上的解法
另外一道113题 统计所有满足条件的路径
过程中有一个问题
private List<List<Integer>> res = new ArrayList<List<Integer>>();private List<Integer> path = new ArrayList<Integer>();
在使用res.add(path) 后,如果通过path.remove对path进行修改,res中的值也会变,所以想存储当时完整的path路径,可以每次新建一个对象,例子如下:
res.add(new ArrayList<>(path));
[二叉树路径总和] 一杯茶一包烟,一个递归转一天相关推荐
- 一杯茶一包烟,一行代码码一天!用Python分析程序员抽的烟!
大家好,今天给大家分享一篇关于国产香烟分析的文章,主要用python爬取"烟悦网"数据,并作详细分析,带你看看香烟的种类及价格现状,放一张词云图: 1.爬取数据 1.1 网站分析 ...
- 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天
昨天在复习B站coderwhy老师的项目时,偶然发现了一个问题,弄了半天,最后才发现问题出在哪. 封装完底部的导航栏之后实现路由跳转出现了问题,在浏览器中既不报错,也不输出内容,路由跳转也没有用 整了 ...
- Python3解题:二叉树路径总和问题
Python3解题:二叉树路径总和问题 原题 https://leetcode-cn.com/problems/path-sum-ii/ 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和 ...
- 二叉树-路径总和(递归)
题意: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum ...
- 三杯茶(一本令全世界为之动容的书)(Three cups of tea)
内容简介 敬上一杯茶,你是一个陌生人: 再奉第二杯,你是我们的朋友: 第三杯茶,你是我的家人,我将用生命来保护你. 一个人,一个承诺,一段辛苦漫长的旅程,许许多多人的爱心,一个美丽的承诺,终于实践. ...
- 54. Leetcode 113. 路径总和 II (二叉树-二叉树路径和)
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径.叶子节点 是指没有子节点的节点.示例 1: 输入:root = [5, ...
- 113. 路径总和 (剑指 Offer 34. 二叉树中和为某一值的路径)(回溯算法)
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径. 叶子节点 是指没有子节点的节点. 示例 1: 输入:root = [ ...
- 经典笔试题: 二叉树中和为某一值的路径(路径总和)
微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水. 这两题是相似问题,循序渐进.也是力扣和剑指offer的经典题. 路径总和 题目描述 ...
- LeetCode(合集) 路径总和(二叉树) golang copy的值复制
112. 路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标 ...
最新文章
- 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了
- USB入门系列之二:USB的连接模型
- 配置文件值注入 ||导入配置文件处理器,以后编写配置就有提示
- UI5 datajs.js response handling
- sqrt()平方根计算函数的实现1——二分法
- 对List集合中的对象进行按某个属性排序
- sql 获取数据库字段信息_使用DBATools获取SQL数据库详细信息
- ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome
- 用“无线诊断”工具解决 Mac 出现的 WiFi 连接问题
- 智能优化算法:花授粉算法-附代码
- 【MATLAB】MATLAB应用手册(1):高等数学的MATLAB应用
- 中兴盒子B860AV2.1-A-B-M-U,通刷,线刷刷机固件
- 纹理分析方法:共生矩阵的计算
- altium怎么锁定_在AD软件中的锁定与解锁命令应该如何使用?
- 下载rpm离线安装包
- 微信小程序进阶学习笔记Day05
- 不会 Python 没关系,手把手教你用 web scraper 抓取豆瓣电影 top 250 和 b 站排行榜
- vCenter学习笔记
- 数据导入与预处理-第4章-数据获取python读取pdf文档
- 风雨砥砺,岁月如歌——Angular项目组件发布概要