【二叉树】Leetcode 437. 路径总和 III【中等】

路径总和 III

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

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

示例1:
在这里插入图片描述
**输入:**root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
**输出:**3
**解释:**和等于 8 的路径有 3 条,如图所示。

解题思路

可以使用深度优先搜索(DFS)进行解决。

  • 1、对于每个节点,可以该节点作为起点,向下递归搜索路径,并计算路径和是否等于目标和 targetSum。
  • 2、对于每个节点,计算从该节点开始的路径中和为目标和targetSum的路径数量。
  • 3、对于每个节点,分别计算从左子树和右子树开始的路径中和为目标和targetSum的路径数量。
  • 4、最终结果为当前节点路径数量加上左子树路径数量和右子树路径数量的总和。

Java实现(int类型大数会有计算溢出问题过不了leetcode官方测试)

public class PathSumIII {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}public int pathSum(TreeNode root, int targetSum) {if (root == null) {return 0;}// 从当前节点开始的路径数目 + 从左子树开始的路径数目 + 从右子树开始的路径数目return countPath(root, targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);}//计算该节点符合路径数private int countPath(TreeNode node, int targetSum) {if (node == null) {return 0;}int count = 0;if (node.val == targetSum) {count++;}count += countPath(node.left, targetSum - node.val);count += countPath(node.right, targetSum - node.val);return count;}// 示例测试public static void main(String[] args) {PathSumIII solution = new PathSumIII();//                 10
//                /  \
//               5   -3
//               / \    \
//              3   2   11
//             / \
//            3  -2
//                /
//               1// 构造二叉树TreeNode root = new TreeNode(10);root.left = new TreeNode(5);root.right = new TreeNode(-3);root.left.left = new TreeNode(3);root.left.right = new TreeNode(2);root.right.right = new TreeNode(11);root.left.left.left = new TreeNode(3);root.left.left.right = new TreeNode(-2);root.left.right.right = new TreeNode(1);int targetSum = 8;System.out.println(solution.pathSum(root, targetSum)); // 输出 3}
}

Java实现2(节点计算时转为long类型计算)

public class PathSumIII {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}public int pathSum(TreeNode root, int targetSum) {if (root == null) {return 0;}// 从当前节点开始的路径数目 + 从左子树开始的路径数目 + 从右子树开始的路径数目return countPath(root, (long) targetSum) + pathSum(root.left, targetSum) + pathSum(root.right, targetSum);}//计算该节点符合路径数private int countPath(TreeNode node, long targetSum) {if (node == null) {return 0;}int count = 0;if (node.val == targetSum) {count++;}//leetcode 官方测试案例会溢出不过,targetSum和node.val 改为long进行计算long longNodeValue = node.val;count += countPath(node.left, targetSum - longNodeValue);count += countPath(node.right, targetSum - node.val);return count;}// 示例测试public static void main(String[] args) {PathSumIII solution = new PathSumIII();//                 10
//                /  \
//               5   -3
//               / \    \
//              3   2   11
//             / \
//            3  -2
//                /
//               1// 构造二叉树//        TreeNode root = new TreeNode(10);
//        root.left = new TreeNode(5);
//        root.right = new TreeNode(-3);
//        root.left.left = new TreeNode(3);
//        root.left.right = new TreeNode(2);
//        root.right.right = new TreeNode(11);
//        root.left.left.left = new TreeNode(3);
//        root.left.left.right = new TreeNode(-2);
//        root.left.right.right = new TreeNode(1);
//        int targetSum = 8;//        [1000000000,1000000000,null,294967296,null,1000000000,null,1000000000,null,1000000000]TreeNode root = new TreeNode(1000000000);root.left = new TreeNode(1000000000);root.left.left = new TreeNode(294967296);root.left.left.left = new TreeNode(1000000000);root.left.left.left.left = new TreeNode(1000000000);root.left.left.left.left.left = new TreeNode(1000000000);int targetSum = 0;System.out.println(solution.pathSum(root, targetSum)); // 输出 3}
}

室间空间复杂度

  • 时间复杂度:O(n^2),其中n是二叉树中的节点数,每个节点需要遍历一次,并且需要额外的时间计算从当前节点开始的路径数量。
  • 空间复杂度:O(n),递归调用栈的深度为二叉树的高度。

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

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

相关文章

DOTS:Burst

目录 一:简介 1.1 Getting started 1.2 C# language support 1.2.1 HPC# overview 1.2.1.1 Exception expressions 1.2.1.2 Foreach and While 1.2.1.3 Unsupported C# features in HPC# 1.2.2 Static read-only fields and static constructor support 1.…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化: 2.数据库设计与规划 1.提前估计数据量,使用什么存储引擎 2.数据库服务器专机专用,避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器,以达到稳定、高效的效果。主从同步、…

PPP+VPN综合实验

一、实验拓扑 二、实验划分 三、实验需求 四、实验结果 1.配置各端口和pc的IP: pc1: pc2: pc3: pc4: R1: [r1]inter g0/0/0 [r1-GigabitEthernet0/0/0]ip ad 192.168.1.2 24 [r1-GigabitEthernet0/0/0]int s4/0/0…

网站HTTPS证书是什么?有用吗?

什么是HTTPS证书? HTTPS证书,全称为安全套接层证书或传输层安全证书,是数字证书的一种。它由受信任的证书颁发机构签发,用于证明网站的身份,并为网站启用HTTPS(超文本传输安全协议)。 HTTPS证书…

天生强运的属龙人,在本命年要非常谨慎

​ 辰龙是十二生肖之一,地支的第五位。龙是一个神化了的象征,气宇轩昂,威武智慧,代表着神圣与无上、尊严与强大是不可战胜的。多数生肖属龙的人都是温文尔雅,风度翩翩的。无论在什么场合只要得到肯定,他们…

【Redis】redis集群模式

概述 Redis集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。实际使用中集群一般由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护&#…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

【css】文本过长溢出一行不换行普通css以及antd实现

.text-box { white-space: nowrap; /* 防止文字换行 */ overflow: hidden; /* 隐藏超出div的内容 */ text-overflow: ellipsis; /* 当内容超出时,显示省略号 */ max-width: calc(100% - 80px); /* 假设按钮宽度为80px,则设置div的最大宽度为容器宽度…

ts 中数据约束类型

在 swagger 等接口文档中,查看 json代码,复制 将其导入到 json.cn,便于查看 在api文件夹下,新建一个定义ts类型的文件 type.ts。 定义数据类型 ---> export interface Bbb {} 调用数据类型----> export type Xxx Bbb[]…

《编程菜鸟学 Python 数据分析》让工作自动化起来!

随着我国企业数字化和信息化的深入,企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式,通过提供强大丰富的库文件包,极大地简化了应用开发过程,降低了技术门槛。Python开发有哪些优势、挑战以及…

【PFA树脂交换柱】实验室高纯PFA材质过滤柱耐受电子级氢氟酸含氟树脂层析柱

PFA离子交换柱,也叫PFA层析柱、PFA过滤柱等,其原理是利用吸附剂对不同化合物有不同吸附作用和不同化合物在溶剂中的不同溶解度,用适应溶剂使混合物在填有吸附剂的柱内通过,使复杂的混合物达到分离和提纯的目的。 柱体为透明PFA材…

165.乐理基础-关系大小调、同主音调、小调的调号判断

如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里,这里面有五线谱对应的音名,对比着看 如果不认识调号去看112.五线谱的调号(一)113.五线谱的调号(二)114.快速识…