二叉树题目:路径总和 III

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:路径总和 III

出处:437. 路径总和 III

难度

5 级

题目描述

要求

给你二叉树的根结点 root \texttt{root} root 和一个表示目标和的整数 targetSum \texttt{targetSum} targetSum,返回结点值总和等于目标和 targetSum \texttt{targetSum} targetSum 的路径的数目。

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

示例

示例 1:

示例 1

输入: root   =   [10,5,-3,3,2,null,11,3,-2,null,1],   targetSum   =   8 \texttt{root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8} root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出: 3 \texttt{3} 3
解释:和等于 8 \texttt{8} 8 的路径如图所示。

示例 2:

输入: root   =   [5,4,8,11,null,13,4,7,2,null,null,5,1],   targetSum   =   22 \texttt{root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22} root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出: 3 \texttt{3} 3

数据范围

  • 树中结点数目在范围 [0,   1000] \texttt{[0, 1000]} [0, 1000]
  • -10 9 ≤ Node.val ≤ 10 9 \texttt{-10}^\texttt{9} \le \texttt{Node.val} \le \texttt{10}^\texttt{9} -109Node.val109
  • -1000 ≤ targetSum ≤ 1000 \texttt{-1000} \le \texttt{targetSum} \le \texttt{1000} -1000targetSum1000

解法一

思路和算法

定义路径的开始结点是路径中的层数最小(即和根结点距离最小)的结点,结束结点是路径中的层数最大(即和根结点距离最大)的结点。

如果二叉树为空,则不存在结点值总和等于目标和的路径,返回 0 0 0

当二叉树不为空时,遍历二叉树中的每个结点,分别将每个结点作为开始结点,寻找所有结点值总和等于目标和的路径。寻找路径的做法是,在开始结点为根结点的子树中深度优先搜索,假设开始结点值为 val \textit{val} val,则对于开始结点的每个非空子树,子树中的每一条结点值总和等于 targetSum − val \textit{targetSum} - \textit{val} targetSumval 的路径都对应从开始结点出发的一条结点值总和等于 targetSum \textit{targetSum} targetSum 的路径。

由于计算非空子树中的结点值总和等于特定值的路径数目可以使用同样的方法,因此计算路径数目的过程是一个递归的过程。递归的终止条件是二叉树为空,此时路径数目是 0 0 0。对于其余情况,执行如下操作。

  1. 如果根结点值等于目标和,则以根结点为结束结点的路径为结点值总和等于目标和的路径,将路径数目加 1 1 1;如果根结点值不等于目标和,则路径数目不变。

  2. 对左子树和右子树递归地计算路径数目。

代码

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return 0;
        }
        int count = countPaths(root, targetSum);
        count += pathSum(root.left, targetSum);
        count += pathSum(root.right, targetSum);
        return count;
    }

    public int countPaths(TreeNode node, long targetSum) {
        if (node == null) {
            return 0;
        }
        int count = 0;
        if (node.val == targetSum) {
            count++;
        }
        count += countPaths(node.left, targetSum - node.val);
        count += countPaths(node.right, targetSum - node.val);
        return count;
    }
}

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是二叉树的结点数。需要对每个结点计算路径数目,每个结点需要 O ( n ) O(n) O(n) 的时间计算路径数目,因此总时间复杂度是 O ( n 2 ) O(n^2) O(n2)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

解法一存在重复计算,因此时间复杂度较高。如果可以存储已经计算过的结果,则可以避免重复计算,降低时间复杂度。

假设从根结点到结点 node 1 \textit{node}_1 node1 的路径上的结点值总和为 sum 1 \textit{sum}_1 sum1,在同一条路径上存在不同于结点 node 1 \textit{node}_1 node1 的结点 node 2 \textit{node}_2 node2,从根结点到结点 node 2 \textit{node}_2 node2 的路径上的结点值总和为 sum 2 \textit{sum}_2 sum2,则该路径上从结点 node 2 \textit{node}_2 node2 的子结点到结点 node 1 \textit{node}_1 node1 的子路径(注意子路径包含 node 1 \textit{node}_1 node1,不包含结点 node 2 \textit{node}_2 node2)上的结点值总和为 sum 1 − sum 2 \textit{sum}_1 - \textit{sum}_2 sum1sum2。如果 sum 1 − sum 2 = targetSum \textit{sum}_1 - \textit{sum}_2 = \textit{targetSum} sum1sum2=targetSum,则找到一条结点值总和等于 targetSum \textit{targetSum} targetSum 的路径。

基于上述分析,可以记录从根结点出发的路径中的每个结点值总和的出现次数,达到优化时间复杂度的目的。以下将从根结点出发的路径中的每个结点值总和称为「根路径和」。

从根结点开始深度优先搜索,使用哈希表记录每个根路径和的出现次数。对于每一条从根结点出发的路径,按照层数递增的顺序依次访问每个结点,访问每个结点时更新当前结点的根路径和,并在哈希表中将当前结点的根路径和的出现次数加 1 1 1。对于访问到的每个结点,如果当前结点的根路径和为 sum \textit{sum} sum,则从哈希表中得到根路径和 sum − targetSum \textit{sum} - \textit{targetSum} sumtargetSum 的出现次数,该出现次数即为以当前结点为结束结点的结点值总和等于 targetSum \textit{targetSum} targetSum 的路径数目。在访问当前结点之后,继续访问当前结点的非空结点。

实现方面有两点需要注意。

  • 由于结点值总和等于 targetSum \textit{targetSum} targetSum 的路径可能从根结点出发,因此需要预处理空路径,空路径的结点值总和等于 0 0 0,在搜索之前将根路径和 0 0 0 出现 1 1 1 次存入哈希表。

  • 深度优先搜索的过程中,当访问完一个子树并退出该子树时,需要撤销对根路径和以及哈希表的更新,避免当前子树的根路径和信息对其他子树的结果造成影响。

代码

class Solution {
    Map<Long, Integer> sumCountMap = new HashMap<Long, Integer>();

    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return 0;
        }
        sumCountMap.put(0L, 1);
        return getCounts(root, root.val, targetSum);
    }

    public int getCounts(TreeNode node, long sum, int targetSum) {
        int count = sumCountMap.getOrDefault(sum - targetSum, 0);
        sumCountMap.put(sum, sumCountMap.getOrDefault(sum, 0) + 1);
        TreeNode left = node.left, right = node.right;
        if (left != null) {
            count += getCounts(left, sum + left.val, targetSum);
        }
        if (right != null) {
            count += getCounts(right, sum + right.val, targetSum);
        }
        sumCountMap.put(sum, sumCountMap.get(sum) - 1);
        return count;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间以及哈希表空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程地址空间

在C/C程序员眼中&#xff0c;对内存有着明确的分区&#xff0c;例如堆区、栈区等等&#xff0c; 那么这些谈论的东西&#xff0c;跟我们在系统中的内存是一个东西吗&#xff1f; 今天我们来探讨这一知识。文章目录 1.对内存分区的认识1). 栈区的使用特点2). 内存区域的划分3). …

Arcmap制图绘制显著性区域

类似于下图这种&#xff0c;为分析结果添加显著性区域&#xff0c;该如何实现呢&#xff1f; 实现方式多种多样&#xff0c;比如&#xff1a; 1、代码。Python、R、Matlab都有实现方式&#xff0c;但是绘制一幅优美的地图&#xff0c;用代码绘制&#xff0c;需要添加很多控制语…

进阶JAVA篇-了解 File 文件的常用API

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 1.0 File 文件的说明 2.0 如何创建 File 类的对象 2.1 需要注意的事项 3.0 File 类的常用 API 3.1 如何创建文件或文件夹 3.2 如何查询文件和文件夹的信息 3.3 如何删除文件和…

微信定时发圈,快人一步不落索

现在的社交媒体运营已经成为了私域流量获取的重要手段&#xff0c;而微信作为最大的社交平台之一&#xff0c;更是吸引了众多使用者。但是&#xff0c;你是否曾经感叹过每天手动发朋友圈的繁琐&#xff1f;是否希望能够事先设置好定时发送的功能&#xff0c;让你的朋友圈自动更…

检查Python中的变量是否为字符串

我们将通过示例介绍两种不同的方法来检查 Python 中的变量是否为字符串。 检查Python中的变量是否为字符串 在 Python 中&#xff0c;每个变量都有一个数据类型。 数据类型表示变量内部存储的数据类型。 数据类型是编程语言最重要的特征&#xff0c;用于区分我们可以存储的不…

本科生学深度学习-Attention机制

很久没有写了,今天想学习下Bert ,发现其中一个很重要的机制是self-Attention,在查self-attention的时候又回归到Attention机制,记录下。 1、Attention 是什么 Attention(注意力)机制核心逻辑就是「从关注全部到关注重点」。 attention机制是模仿人类注意力而提出的一种…

Mybatis-Plus通用枚举功能 [MyBatis-Plus系列] - 第493篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 S…

AS/400-对象管理-01

对象管理 对象对象构图 AS/400中的库命令Display Library List (DSPLIBL)Create Library (CRTLIB)Display library (DSPLIB)Edit Library List (EDTLIBL) Source physical file 物理文件创建物理文件的命令 &#xff1a; CRTSRCPF 物理文件查看所有物理文件的源文件创建源文件…

2023年中国冷风机分类、销量及市场规模分析[图]

冷风机通常是指一种设备&#xff0c;用于通过冷却空气来调节室内或工业环境的温度。这些设备通过循环空气并通过冷却元件&#xff08;如冷却盘或冷凝器&#xff09;来降低空气的温度&#xff0c;从而实现温度控制。冷风机在家庭、商业和工业领域都有广泛的应用&#xff0c;可以…

geoserver去除tif影像黑色的背景的方法

geoserver加载某些tif文件的时候,tif文件本身有黑色的背景,怎么去掉呢? 只要在geoserver中设置就行。 处理方法: 1.新建数据源时要选择ImageMosaic数据源 2,设置"Output Transparent Color" 设置"Output Transparent Color"为黑色(000000),在…

Postgresql在jdbc处理bit字段的解决方案

问题&#xff1a; bit如果长度为1&#xff0c;则会默认为布尔型&#xff08;1-true 0-false&#xff09;&#xff1b; bit如果长度大于1&#xff0c;则会默认为bit类型&#xff0c;但是代码中以前常用的两种set方式&#xff0c;会报错 第一种方式&#xff1a; ps.setObject(i1,…

【工具】FreePic2PDF+PdgCntEditor|PDF批量添加书签(Windows)

这俩软件都不大&#xff0c;比较便携。 FreePic2PDF&#xff1a; 我下载的来源&#xff1a;https://www.52pojie.cn/thread-1317140-1-1.html&#xff08;包含下载链接https://www.lanzoui.com/it4x6j4hbvc&#xff09;下载的结果&#xff1a;https://pan.baidu.com/s/1r8n5G42…

win 下安装 nvm 的使用与配置

nvm 全名 node.js version management&#xff0c;是一个 nodejs 的版本管理工具。通过它可以安装和切换不同版本的 nodejs。 注&#xff1a;如果已经安装了 nodejs 需先卸载后再安装 nvm 为了确保 nodejs 已彻底删除&#xff0c;可以看看安装目录中是否有 node 文件夹&#x…

解密人工智能:决策树 | 随机森林 | 朴素贝叶斯

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、决策树2.1 优点2.2 缺点 三、随机森林四、Naive Bayes&#xff08;朴素贝叶斯&#xff09;五、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法&#xff0c;通过对…

js的小题

//闭包实例代码 function fn1() {let a 1;function fn2() {a;console.log(a);}console.log(a,a) } fn1(); 执行结果: 1 a 现在思考怎么调用里面的fn2函数呢? 答案是: //闭包实例代码 function fn1() {let a 1;function fn2() {a;console.log(a);}console.log(a,a)return f…

安卓核心板_天玑700、天玑720、天玑900_5G模块规格参数

5G安卓核心板是采用新一代蜂窝移动通信技术的重要设备。它支持万物互联、生活云端化和智能交互的特性。5G技术使得各类智能硬件始终处于联网状态&#xff0c;而物联网则成为5G发展的主要动力。物联网通过传感器、无线网络和射频识别等技术&#xff0c;实现了物体之间的互联。而…

正点原子嵌入式linux驱动开发——Linux RTC驱动

RTC也就是实时时钟&#xff0c;用于记录当前系统时间&#xff0c;对于Linux系统而言时间是非常重要的&#xff0c;就和使用Windows电脑或手机查看时间一样&#xff0c;在使用Linux设备的时候也需要查看时间。本章就来学习一下如何编写Linux下的RTC驱动程序。 Linux内核RTC驱动…

算法笔记【8】-合并排序算法

文章目录 一、前言二、合并排序算法基本原理三、实现步骤四、优缺点分析 一、前言 合并排序算法通过采用分治策略和递归思想&#xff0c;实现了高效、稳定的排序功能。本文将深入探讨合并排序算法的原理、实现步骤&#xff0c;并讨论其优缺点。 二、合并排序算法基本原理 合…

一文看懂完整的研究生生活规划

很多人在刚从本科步入研究生生活的时候,总是对于自己三年的研究生生活没有清晰的规划,总是在各种浪费时间,没有拿到想要的东西,也没有学到想学的东西,亦或是没有找到理想的工作,最后草草的毕业。这个时候我们就应该对于自己的研究生生活有个清晰的规划,帮助我们不留遗憾…

人大与加拿大女王大学金融管理硕士项目:开启国际视野,成就金融领袖

生活中&#xff0c;我们总会遇到各种各样的困难和挑战。有时候&#xff0c;我们会感到沮丧、迷茫甚至绝望。但是&#xff0c;正是这些困难和挑战&#xff0c;让我们变得更加坚强、勇敢和成熟。在这个职场竞争愈发激烈的时代&#xff0c;不断地充实自己是非常重要的。如果你从事…