路径总和 III

news/2024/12/29 16:19:13/

题目链接

路径总和 III

题目描述


注意点

  • 二叉树的节点个数的范围是 [0,1000]
  • 求该二叉树里节点值之和等于 targetSum 的 路径 的数目

解答思路

  • 可根据前缀和的思路解决本题,前缀和表示从根节点开始,往左或往右组成的路径和,统计从根节点开始的所有的前缀和以及前缀和出现的次数,当遍历到任意一个节点时,可根据加上该节点值形成的当前值与目标值的差值(也就是currSum - targetSum)在前缀和中出现的次数推出加上该节点时路径和为targetSum的路径数
  • 因为路径方向必须是向下的(只能从父节点到子节点),所以父节点的前缀和只会影响其对应的左右子树,所以在前缀和映射中加上当前节点后递归其左右子树进行相同的操作,且在递归完左右子树后,需要将前缀和映射恢复,防止左右两个子树互相造成影响

代码

class Solution {public int pathSum(TreeNode root, int targetSum) {// key为前缀和的值,value为前缀和为key时的路径数量Map<Long, Integer> map = new HashMap<>();// 没有任何节点时前缀和为0,保证根节点为targetSum也能正确统计路径数map.put(0L, 1);return recursionPathSum(root, map, 0L, targetSum);}public int recursionPathSum(TreeNode root, Map<Long, Integer> map, Long currSum, int targetSum) {if (root == null) {return 0;}int res = 0;currSum += root.val;// 根据前一层的前缀和的值推出加上此节点时结果为targetSum的路径数res += map.getOrDefault(currSum - targetSum, 0);// 增加新的前缀和映射进入下一层对左右子树进行递归map.put(currSum, map.getOrDefault(currSum, 0) + 1);res += recursionPathSum(root.left, map, currSum, targetSum);res += recursionPathSum(root.right, map, currSum, targetSum);// 恢复状态,防止左右子树的前缀和各自产生影响map.put(currSum, map.get(currSum) - 1);return res;}
}

关键点

  • 前缀和的思想
  • 父节点的前缀和映射只会对其下方的子树判断路径总和有影响,而不会对同层或更高层的节点产生影响,所以在对子树递归后,还要将该节点的前缀和映射进行恢复

http://www.ppmy.cn/news/1142550.html

相关文章

【华为OD机考B卷 | 100分】五子棋迷(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 张兵和王武是五子棋迷&#xff0c;工作之余经常切磋棋艺。走了一会儿&#xff0c;轮到张兵了&#xff0c;他对着一条线思…

利用互斥锁实现多个线程写一个文件

代码 #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h>FILE *fp;//线程函数1 void *wrfunc1(void *arg); //线程函数2 void *wrfunc2(void *arg); //线程函数3 void *wrfunc3(void *arg);//静态创建互斥锁 pthread_…

EM@指数函数和幂函数

文章目录 abstract指数函数基本性质 幂函数性质互为反函数的幂函数 refs abstract 指数函数和幂函数定义和性质 指数函数 一般地,函数 y a x ya^{x} yax, a > 0 , a ≠ 1 , x ∈ R a>0,a\neq{1},x\in{\mathbb{R}} a>0,a1,x∈R解析式中 a a a是非1的正数,不讨论负…

Vuex的介绍

介绍 :::warning 注意 在阅读此文章之前请确保你已经掌握了组件中的选项 data、计算属性 computed、methods 方法等相关知识。 ::: 什么是 Vuex&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以…

Springboot知识点必知必会(一)

mvc设计模式 MVC设计模式是Model-View-Controller的缩写&#xff0c;它是一种用于设计用户界面的软件设计模式。Spring MVC是Spring框架的一个模块&#xff0c;它提供了一种基于Java的方式来实现MVC设计模式。 以下是Spring MVC中MVC设计模式的组成部分和工作原理&#xff1a; …

小程序搭建的技巧|网站建设|软件定制APP开发

小程序搭建的技巧|网站建设|软件定制APP开发 首先&#xff0c;我们要知道小程序是一个非常方便的工具&#xff0c;它可以让我们在手机上运行一些应用&#xff0c;不用下载安装&#xff0c;非常方便。小程序可以分为两种&#xff1a;一种是代码开发&#xff0c;另一种是模板开发…

javaee SpringMVC中json的使用

jsp <%--Created by IntelliJ IDEA.User: 呆萌老师:QQ:2398779723Date: 2019/12/6Time: 15:55To change this template use File | Settings | File Templates. --%> <% page contentType"text/html;charsetUTF-8" language"java" %> <%St…

敏捷项目管理解锁:2023年使用YouTrack的全面指南

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