LeetCode算法题(Go语言实现)_36

题目

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

一、代码实现(双重递归法)

func pathSum(root *TreeNode, targetSum int) int {if root == nil {return 0}// 计算以当前节点为起点的路径数 + 左右子树的路径数return dfs(root, targetSum) + pathSum(root.Left, targetSum) + pathSum(root.Right, targetSum)
}func dfs(node *TreeNode, remain int) int {if node == nil {return 0}count := 0if node.Val == remain {count++}// 递归处理左右子树,更新剩余目标值count += dfs(node.Left, remain - node.Val)count += dfs(node.Right, remain - node.Val)return count
}

二、算法分析(递归法)

1. 核心思路
  • 双重递归结构:外层递归遍历所有节点作为路径起点,内层递归计算以该节点为起点的路径数目
  • 暴力穷举:对每个节点及其子树进行深度优先搜索,统计符合条件的路径
2. 关键步骤
  1. 外层递归:遍历每个节点作为可能的路径起点
  2. 内层递归:以当前节点为起点,向下搜索满足sum=targetSum的路径
  3. 终止条件:空节点返回0,当前节点值等于剩余值时计数+1
  4. 状态传递:将剩余值remain - node.Val传递给子树
3. 复杂度
指标说明
时间复杂度O(n²)每个节点触发一次O(n)的子树遍历
空间复杂度O(h)h为树高度(递归栈空间)

三、代码实现(前缀和优化法)

func pathSum(root *TreeNode, targetSum int) int {prefixSum := make(map[int]int)prefixSum[0] = 1 // 处理根节点自身满足条件的情况return dfs(root, 0, targetSum, prefixSum)
}func dfs(node *TreeNode, currSum int, target int, prefixSum map[int]int) int {if node == nil {return 0}currSum += node.Valcount := prefixSum[currSum - target]prefixSum[currSum]++count += dfs(node.Left, currSum, target, prefixSum)count += dfs(node.Right, currSum, target, prefixSum)prefixSum[currSum]-- // 回溯return count
}

四、算法分析(前缀和法)

1. 核心思路
  • 前缀和哈希表:记录从根节点到当前节点的路径和出现次数
  • 数学关系:若存在currSum - target = oldSum,则oldSum -> currSum的路径和为target
2. 关键步骤
  1. 初始化哈希表:预存prefixSum[0]=1处理根节点自身满足条件的情况
  2. 更新当前和:累加节点值到currSum
  3. 查询差值:计算currSum - target的出现次数
  4. 回溯操作:维护哈希表状态避免子树间的干扰
3. 复杂度
指标说明
时间复杂度O(n)单次遍历所有节点
空间复杂度O(n)哈希表存储n个节点的前缀和

五、图解示例

root = [10,5,-3,3,2,null,11], targetSum=8为例:

        10/  \5   -3/ \    \3   2   11

前缀和法流程

  1. 路径10→5→3:和为18 → 18-8=10(无记录)
  2. 路径10→5→2:和为17 → 17-8=9(无记录)
  3. 路径10→5:和为15 → 15-8=7(无记录)
  4. 路径10→-3→11:和为18 → 18-8=10(命中初始0)
    最终计数:3(路径5→3、路径5→2→1、路径-3→11)

六、边界条件与扩展

1. 特殊场景验证
  • 空树:返回0
  • 负数和零:如root = [-2,null,-3], target=-5 → 返回1
  • 重复路径:多节点值相同的情况需正确计数
2. 扩展应用
  • 多条件路径统计:同时满足和值与节点数限制
  • 动态目标值:支持实时修改targetSum的在线查询
  • 路径回溯:记录具体路径而非仅计数(需维护路径栈)

七、总结与优化方向

1. 方法对比
方法优势劣势适用场景
双重递归实现简单时间复杂度高小规模树(n<1000)
前缀和线性时间复杂度需要维护哈希表状态大规模树
2. 工程优化
  • 并行计算:对左右子树进行并发遍历(Go协程)
  • 内存预分配:根据树高度预判哈希表容量
  • 数值溢出处理:使用int64存储累加和
3. 算法扩展
  • K路径问题:统计和值为targetSum的TopK最长路径
  • 三维路径:推广到三叉树等复杂结构
  • 流式处理:支持无法完整加载内存的超大树结构

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

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

相关文章

深度解析:文件或目录损坏且无法读取的应对之道

引言 在数字化办公与数据存储日益普及的今天&#xff0c;我们时常会遭遇各种数据问题&#xff0c;其中“文件或目录损坏且无法读取”这一状况尤为令人头疼。无论是个人用户存储在电脑硬盘、移动硬盘、U盘等设备中的重要文档、照片、视频&#xff0c;还是企业服务器上的关键业务…

数据库如何确定或计算 LSN(日志序列号)

目录 如何确定或计算 LSN&#xff08;日志序列号&#xff09;**一、获取当前 LSN****二、确定日志解析的起始 LSN****三、LSN 与物理文件的映射****四、应用场景** 如何确定或计算 LSN&#xff08;日志序列号&#xff09; LSN&#xff08;Log Sequence Number&#xff09;是数…

[ctfshow web入门] web24

前置知识 isset&#xff1a;判断这个变量是否声明且不为NULL&#xff0c;否则返回False mt_srand&#xff1a;设置随机数种子&#xff0c;如果不手动设置&#xff0c;那么系统会自动进行一次随机种子的设置 mt_rand&#xff1a;生成一个随机数&#xff0c;这个随机数与种子有个…

习题与正则表达式

思路&#xff1a; 二分查找&#xff1a; left 1&#xff08;最小可能距离&#xff09;&#xff0c;right L&#xff08;最大可能距离&#xff09;。 每次取 mid (left right) / 2&#xff0c;判断是否可以通过增设 ≤ K 个路标使得所有相邻路标的距离 ≤ mid。 贪心验证…

最小K个数

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…

<tauri><rust><GUI>基于rust和tauri,将tauri程序打包为window系统可安装的安装包(exe、msi)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 发文平台 CSDN 环境配置 系统:windows 10平台:visual studio code语言:rust、javascript库:taur…

SAP系统采购信息记录失效

问题&#xff1a;采购信息记录失效 现象&#xff1a;最初主数据导入完成之后&#xff0c;单元测试的时采购信息记录是有效的&#xff0c;中间经过配置的变化&#xff0c;集成测试初期发现采购信息记录全部失效。 原因&#xff1a; 单元测试时发现采购订单里面的条件类型…

视频分析设备平台EasyCVR打造汽车门店经营场景安全:AI智慧安防技术全解析

一、方案背景 某电动车企业不停爆出维权新闻&#xff0c;支持和反对的声音此起彼伏&#xff0c;事情不断发酵、反转&#xff0c;每天都有新消息&#xff0c;令人目不暇接。车展、车店作为维权事件的高发场所&#xff0c;事后复盘和责任认定时&#xff0c;安防监控和视频监控平…

ecovadis认证基本概述,ecovadis认证审核有效期

EcoVadis认证基本概述 1. 什么是EcoVadis认证&#xff1f; EcoVadis是全球领先的企业可持续发展&#xff08;ESG&#xff09;评级平台&#xff0c;专注于评估企业在**环境&#xff08;E&#xff09;、劳工与人权&#xff08;S&#xff09;、商业道德&#xff08;L&#xff09…

初入Web网页开发

1、网页哪些内容 1.1 三个核心文件的作用 index.html&#xff1a;网页的骨架&#xff0c;用HTML编写网页结构和内容。 script.js&#xff1a;网页的行为&#xff0c;用JavaScript实现交互功能&#xff08;如按钮点击事件&#xff09;。 styles.css&#xff1a;网页的外观&…

CSS 符号

在 CSS 中&#xff0c;& 符号是 嵌套语法中的父选择器引用符&#xff0c;主要用于 CSS 预处理器&#xff08;如 Sass、Less、Stylus&#xff09;和 现代 CSS 嵌套语法&#xff08;CSS Nesting&#xff09;。它代表当前选择器的父级&#xff0c;用于简化嵌套规则并生成更精确…

小白入门JVM、字节码、类加载机制图解

前提知识~ JDK 基本介绍 JDK 的全称(Java Development Kit Java 开发工具包)JDK JRE java 的开发工具[java, javac,javadoc,javap 等]JDK 是提供给Java 开发人员使用的&#xff0c;其中包含了java 的开发工具&#xff0c;也包括了JRE。可开发、编译、调试…… JRE 基本介绍…

consul服务注册与发现(go)-学习笔记

参考博客 1、服务实例接口与默认实现 type ServiceInstance interface {// 获取服务实例的唯一IDGetInstanceId() string// 获取服务IDGetServiceId() string// 获取服务实例的主机名或IP地址GetHost() string// 获取服务实例的端口号GetPort() int// 判断服务实例是否使用HT…

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程&#xff08;Prompt Engineering&#xff09;是指在使用语言模型&#xff08;如 ChatGPT、文心一言等&#xff09;等人工智能工具时&#xff0c;设计和优化输入提…

Python 字典和集合(常见的映射方法)

本章内容的大纲如下&#xff1a; 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响&#xff08;什么样的数据类型可作为键、不可预知的 顺序&#xff0c;等等&#xff09; 常见的映射方法 映射类型…

对抗Prompt工程:构建AI安全护栏的攻防实践

大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例&#xff0c;揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理&#xff0c;提出融合动态意图拓扑分析&#xff08;DITA&#xff09;、对抗…

STL c++ list——模拟实现

结点类的模拟实现 list是一个带头双向循环链表 因需要实现一个节点类&#xff0c;其中包含哨兵位&#xff08;用来标识位置&#xff09;&#xff0c;节点信息&#xff08;val数据&#xff0c;prev后指针&#xff0c;next后指针&#xff09; template<class T> struct …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射

DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…

【学习自用】配置文件中的配置项

server.port服务器端口&#xff0c;常被用于指定应用程序运行时所监听的端口号spring.datasource.url用于配置数据源的数据库连接URLspring.datasource.username用于指定连接数据库的用户名spring.datasource.password用于配置数据源时设置数据库连接密码的属性mybatis.mapper-…

使用protobuf编译提示无法打开包括文件: ‘absl/log/absl_log.h’: No such file or directory

问题原因 Protobuf 依赖 Abseil&#xff1a; Protobuf 3.20 版本开始依赖 Abseil&#xff0c;但你的系统未正确安装或配置 Abseil。 头文件路径未包含&#xff1a; 编译器找不到 absl/log/absl_log.h&#xff0c;可能是因为 Abseil 未正确安装或未在项目中设置包含路径。 …