437. 路径总和 III

  1. 路径总和 III

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

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

示例 1:
在这里插入图片描述

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

示例 2:

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

解题思路

首先想到的解法是穷举所有的可能,我们访问每一个节点 node,检测以 node 为起始节点且向下延深的路径有多少种。我们递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。

  • 我们首先定义 rootSum(p,val) 表示以节点 p 为起点向下且满足路径总和为 val 的路径数目。我们对二叉树上每个节点 p 求出 rootSum(p,targetSum),然后对这些路径数目求和即为返回结果。
  • 我们对节点 p 求 rootSum(p,targetSum) 时,以当前节点 p 为目标路径的起点递归向下进行搜索。假设当前的节点 p 的值为 val,我们对左子树和右子树进行递归搜索,对节点 p 的左孩子节点 pl​ 求出 rootSum(pl​,targetSum−val),以及对右孩子节点 pr​ 求出 rootSum(pr​,targetSum−val)。节点 p 的 rootSum(p,targetSum) 即等于 rootSum(pl​,targetSum−val) 与 rootSum(pr​,targetSum−val) 之和,同时我们还需要判断一下当前节点 p 的值是否刚好等于 targetSum。
  • 我们采用递归遍历二叉树的每个节点 p,对节点 p 求 rootSum(p,val),然后将每个节点所有求的值进行相加求和返回。
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 递归
def pathSum(root: TreeNode, targetSum: int) -> int:
	def rootSum(node, targetSum):
		if not node:
			return 0
		res = 0
		if node.val == targetSum:
			ret += 1
		res += rootSum(node.left, targetSum - node.val)
		res += rootSum(node.right, targetSum - node.val)
		return res
	if not root:
		return 0
	res = rootSum(root, targetSum)
	res += pathSum(root.left, targetSum)
	res += pathSum(root.right, targetSum)
	return res


# 前缀和
import collections
def pathSum2(root: TreeNode, targetSum: int) -> int:
    prefix = collections.defaultdict(int)
    prefix[0] = 1

    def dfs(root, curr):
        if not root:
            return 0
        
        ret = 0
        curr += root.val
        ret += prefix[curr - targetSum]
        prefix[curr] += 1
        ret += dfs(root.left, curr)
        ret += dfs(root.right, curr)
        prefix[curr] -= 1

        return ret

    return dfs(root, 0)
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,这是一个简单的Java路径总和算法。只需要把给定路径中的数字相加即可: public int pathSum(int[] path) { int sum = 0; for (int i = 0; i < path.length; i++) { sum += path[i]; } return sum; } ### 回答2: 当Java中的路径总和算法是一种用于查找从根节点到叶节点的路径上所有节点值之和等于给定目标值的算法。以下是一个简单的Java代码示例: ```java // 树节点定义 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public class PathSum { public static boolean hasPathSum(TreeNode root, int targetSum) { if (root == null) { return false; // 如果根节点为空,直接返回false } if (root.left == null && root.right == null && root.val == targetSum) { return true; // 如果是叶节点且节点值等于目标值,返回true } // 递归遍历左子树和右子树 return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val); } public static void main(String[] args) { // 创建一个二叉树 TreeNode root = new TreeNode(5); root.left = new TreeNode(4); root.right = new TreeNode(8); root.left.left = new TreeNode(11); root.left.left.left = new TreeNode(7); root.left.left.right = new TreeNode(2); root.right.left = new TreeNode(13); root.right.right = new TreeNode(4); root.right.right.right = new TreeNode(1); int targetSum = 22; boolean hasPath = hasPathSum(root, targetSum); System.out.println("是否存在路径的节点和等于目标值:" + hasPath); } } ``` 以上代码中,首先定义了一个TreeNode类来表示二叉树的节点,其中包含节点的值以及左右子节点。然后,定义了PathSum类来实现路径总和的算法。在该类中,使用递归的方式遍历二叉树,如果节点为空,则返回false;如果是叶节点且节点值等于目标值,则返回true;否则,递归遍历左子树和右子树,将目标值减去当前节点的值。 在main方法中,创建了一个二叉树,并设置目标值为22,然后调用hasPathSum方法来检查是否存在路径的节点和等于目标值。最后,输出结果显示是否存在这样的路径。 ### 回答3: 当你说路径总和算法时,我理解为在一个二叉树中查找是否存在一条从根节点到叶子节点的路径,使得路径上所有节点值的和等于给定的目标值。以下是一个基于深度优先搜索(DFS)的Java实现: ```java // 定义二叉树节点 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public class PathSum { public boolean hasPathSum(TreeNode root, int sum) { if (root == null) { return false; } if (root.left == null && root.right == null && sum - root.val == 0) { return true; // 找到满足条件的路径 } return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val); } public static void main(String[] args) { // 构建二叉树 TreeNode root = new TreeNode(5); root.left = new TreeNode(4); root.right = new TreeNode(8); root.left.left = new TreeNode(11); root.left.left.left = new TreeNode(7); root.left.left.right = new TreeNode(2); root.right.left = new TreeNode(13); root.right.right = new TreeNode(4); root.right.right.right = new TreeNode(1); int targetSum = 22; PathSum pathSum = new PathSum(); boolean hasSum = pathSum.hasPathSum(root, targetSum); System.out.println("是否存在路径和为" + targetSum + "的路径?" + hasSum); } } ``` 以上的代码实现了一个二叉树路径总和算法。首先,在`hasPathSum`方法中,我们根据是否为叶子节点和路径和是否等于给定的目标值进行判断。如果同时满足这两个条件,即找到了一条满足路径总和路径。接着,递归调用方法,在左右子树中寻找新的路径总和。最后,在`main`方法中,我们构建了一个示例二叉树,并调用`hasPathSum`方法进行计算。输出将显示是否存在路径和为目标值的路径。 希望上述解答能对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值