[437]路径总和 III

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

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

func pathSum(root *TreeNode, targetSum int) int {
	if root == nil {
		return 0
	}
	//使用哈希表记录节点和出现的次数
	sumCount := make(map[int]int)
	sumCount[0] = 1

	var dfs func(node *TreeNode, sum int) int
	dfs = func(node *TreeNode, sum int) int {
		if node == nil {
			return 0
		}

		//更新当前节点的前缀和
		sum += node.Val
		//如果出现过sum-targetSum,name一定有路径满足要求
		count := sumCount[sum-targetSum]
		sumCount[sum]++
		//在其父节点前缀和的基础上进行求和,判断是否存在满足sum-targetSum的节点
		count += dfs(node.Left, sum)
		count += dfs(node.Right, sum)
		//回溯,每当我们从左子节点或右子节点递归返回到当前节点时,我们需要将当前节点的节点值从 sumCount 中减去,以保证在当前节点的父节点的递归中,sumCount 中记录的是从根节点到当前节点的路径的节点值之和。
		//如果不进行回溯,而是在递归过程中不断累加节点值到 sumCount 中,会导致 sumCount 中记录的节点值之和不准确,进而影响到最终的结果。
		sumCount[sum]--
		return count
	}
	return dfs(root, 0)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值