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题 统计所有满足条件的路径

题目描述

我的解法

思路

参照之前记录所有路径的题目,使用递归法

  1. 确定参数和返回值
    不设置返回值
    参数:访问节点,从根节点到当前节点路径上的值
    设置一个全局变量,boolean型,初始值设为false,碰到满足条件的修改为true
  2. 确定终止条件
    碰到叶子节点,进行条件判断和处理
  3. 确定单层处理逻辑
    将当前节点的值与累积的路径值相加
    如果左节点不为空,访问左节点
    如果左节点不为空,访问右节点

对应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));

[二叉树路径总和] 一杯茶一包烟,一个递归转一天相关推荐

  1. 一杯茶一包烟,一行代码码一天!用Python分析程序员抽的烟!

    大家好,今天给大家分享一篇关于国产香烟分析的文章,主要用python爬取"烟悦网"数据,并作详细分析,带你看看香烟的种类及价格现状,放一张词云图: 1.爬取数据 1.1 网站分析 ...

  2. 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天

    昨天在复习B站coderwhy老师的项目时,偶然发现了一个问题,弄了半天,最后才发现问题出在哪. 封装完底部的导航栏之后实现路由跳转出现了问题,在浏览器中既不报错,也不输出内容,路由跳转也没有用 整了 ...

  3. Python3解题:二叉树路径总和问题

    Python3解题:二叉树路径总和问题 原题 https://leetcode-cn.com/problems/path-sum-ii/ 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和 ...

  4. 二叉树-路径总和(递归)

    题意: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum ...

  5. 三杯茶(一本令全世界为之动容的书)(Three cups of tea)

    内容简介 敬上一杯茶,你是一个陌生人: 再奉第二杯,你是我们的朋友: 第三杯茶,你是我的家人,我将用生命来保护你. 一个人,一个承诺,一段辛苦漫长的旅程,许许多多人的爱心,一个美丽的承诺,终于实践. ...

  6. 54. Leetcode 113. 路径总和 II (二叉树-二叉树路径和)

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径.叶子节点 是指没有子节点的节点.示例 1: 输入:root = [5, ...

  7. 113. 路径总和 (剑指 Offer 34. 二叉树中和为某一值的路径)(回溯算法)

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径. 叶子节点 是指没有子节点的节点. 示例 1: 输入:root = [ ...

  8. 经典笔试题: 二叉树中和为某一值的路径(路径总和)

    微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水. 这两题是相似问题,循序渐进.也是力扣和剑指offer的经典题. 路径总和 题目描述 ...

  9. LeetCode(合集) 路径总和(二叉树) golang copy的值复制

    112. 路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标 ...

最新文章

  1. 看完这篇 JVM 垃圾回收,和面试官扯皮没问题了
  2. USB入门系列之二:USB的连接模型
  3. 配置文件值注入 ||导入配置文件处理器,以后编写配置就有提示
  4. UI5 datajs.js response handling
  5. sqrt()平方根计算函数的实现1——二分法
  6. 对List集合中的对象进行按某个属性排序
  7. sql 获取数据库字段信息_使用DBATools获取SQL数据库详细信息
  8. ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome
  9. 用“无线诊断”工具解决 Mac 出现的 WiFi 连接问题
  10. 智能优化算法:花授粉算法-附代码
  11. 【MATLAB】MATLAB应用手册(1):高等数学的MATLAB应用
  12. 中兴盒子B860AV2.1-A-B-M-U,通刷,线刷刷机固件
  13. 纹理分析方法:共生矩阵的计算
  14. altium怎么锁定_在AD软件中的锁定与解锁命令应该如何使用?
  15. 下载rpm离线安装包
  16. 微信小程序进阶学习笔记Day05
  17. 不会 Python 没关系,手把手教你用 web scraper 抓取豆瓣电影 top 250 和 b 站排行榜
  18. vCenter学习笔记
  19. 数据导入与预处理-第4章-数据获取python读取pdf文档
  20. 风雨砥砺,岁月如歌——Angular项目组件发布概要

热门文章

  1. Leetcode-1737-满足三条件之一需改变的最少字符数
  2. uniapp | 打开iOS和Android实现GPS定位权限
  3. Android网络编程基础(第一弹)
  4. 计算机绘图员证有无取消,计算机辅助设计
  5. C#,.net使用特性类,将json转为实体时验证字段
  6. 名词解释:VG、PV、PP、LV、LP
  7. 忘记Excel文件打开密码,怎么办?
  8. 一个技术出身的市场人的小访谈
  9. 1064:奥运奖牌计数(C C++)
  10. Unity安卓打包设置项目名称为中文名