当前位置: 首页 > news >正文

437. 路径总和 III

题目:给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

方法一:遍历出每个结点开头的路径,并计算以这个结点开头的符合条件的路径有多少。

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @param {number} targetSum* @return {number}*///主函数var pathSum = function(root, targetSum) {if(root===null){return 0;}let ret = rootSum(root,targetSum);ret+=pathSum(root.left,targetSum);ret+=pathSum(root.right,targetSum);return ret;
};//用于计算某个结点的所有路径const rootSum = (root,targetSum)=>{let ret = 0;if(root===null){return 0;}const val = root.val;if(val===targetSum){ret++;}ret += rootSum(root.left,targetSum-val);ret += rootSum(root.right,targetSum-val);return ret;}

方法二:前缀和

        因为原来的寻找ret是用递归的方法,相当于套了两层for,但是现在在一次递归中,就可以找到答案。减少的时间复杂度在于前缀和免去了方法一种对重复子节点的计算。

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @param {number} targetSum* @return {number}*/
var pathSum = function(root, targetSum) {const hash = new Map();hash.set(0,1);return dfs(root,hash,0,targetSum);
};const dfs = (root,hash,cur_sum,targetSum)=>{ //hash记录前面出现过的前缀和出现的次数if(root===null){return 0;}let res = 0;cur_sum+=root.val;//更新前缀和res = hash.get(cur_sum-targetSum) || 0;//将当前的前缀和更新到hashhash.set(cur_sum,(hash.get(cur_sum) || 0)+1);res += dfs(root.left,hash,cur_sum,targetSum);res += dfs(root.right,hash,cur_sum,targetSum);//遍历完当前节点需要取消hash中的记录hash.set(cur_sum,(hash.get(cur_sum) || 0) - 1)return res;
}

http://www.lryc.cn/news/625560.html

相关文章:

  • Qt 插件开发全解析:从接口定义,插件封装,插件调用到插件间的通信
  • SWMM排水管网水力、水质建模及在海绵与水环境中的应用
  • 第5章 高级状态管理
  • 结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
  • 深入理解 CAS:无锁编程的核心基石
  • nginx安装配置教程
  • 理解JavaScript中的函数赋值和调用
  • Gemini CLI 详细操作手册
  • 传统概率信息检索模型:理论基础、演进与局限
  • JETSON ORIN NANO进阶教程(六、安装使用Jetson-container)
  • elementplus组件文本框设置前缀
  • 网络基础——网络传输基本流程
  • 【服务器】Apache Superset功能、部署与体验
  • C++高频知识点(二十四)
  • 【基础-判断】所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数
  • 一个基于前端技术的小狗寿命阶段计算网站,帮助用户了解狗狗在不同年龄阶段的特点和需求。
  • 【数据结构】二叉树-堆(深入学习 )
  • dockerfile文件中crlf与lf换行符问题
  • 配电网AI识别抓拍装置有哪些突出的功能特点
  • 基于VLM 的机器人操作视觉-语言-动作模型:综述 2
  • 第八十四章:实战篇:图 → 视频:基于 AnimateDiff 的视频合成链路——让你的图片“活”起来,瞬间拥有“电影感”!
  • 小程序插件使用
  • 小程序开发APP
  • UART串口通信编程自学笔记30000字,嵌入式编程,STM32,C语言
  • 面试经验分享-某电影厂
  • 【部署相关】DockerKuberbetes常用命令大全(速查+解释)
  • 走进数字时代,融入数字生活,构建数字生态
  • Git#cherry-pick
  • .net core web程序如何设置redis预热?
  • 第7章 React性能优化核心