在你的 Go 代码中,pathSum
函数的实现目标是计算二叉树中路径和等于 targetSum
的路径数量。你使用了一个递归函数 Recursion
来遍历树,并使用一个 map 来存储从当前节点到达的所有路径和的频率。
根据你提供的代码,有几个地方需要注意:
结果初始化:每次调用
pathSum
时,你都将result
初始化为0。但是在递归过程中,可能会多次对同一节点进行访问,从而重复计算。这意味着最终得到的路径总数可能不正确。考虑在Recursion
函数内返回并累加符合条件的路径数量,而不是全局变量。合并左子树与右子树结果时需要处理零和:当从左右子树合并后,需要考虑如果某个子树为空,则相应计数会丢失,因此要确保即使某一边没有值也能正常工作。
返回 map 逻辑需要保证完整性:在创建新 map 时,应该同时加入根节点值,如果根节点存在,它可能也是一个新的起点。
以下是经过修改后的代码示例:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, targetSum int) int {
return helper(root, targetSum, make(map[int]int), 0)
}
func helper(node *TreeNode, targetSum int, prefixSums map[int]int, currentSum int) int {
if node == nil {
return 0
}
// 当前前缀和加上当前节点值
currentSum += node.Val
// 当前前缀和是否有对应的路径(currentSum - targetSum)
count := prefixSums[currentSum-targetSum]
// 更新前缀和字典
prefixSums[currentSum]++
// 继续向下遍历左、右子树
count += helper(node.Left, targetSum, prefixSums, currentSum)
count += helper(node.Right, targetSum, prefixSums, currentSum)
// 回溯,减少当前节点值以便于其他路径判断
prefixSums[currentSum]--
return count
}
修改说明:
- 使用了局部变量来传递当前和及前缀和值,使其更具可读性。
- 删除了全局变量,以防止重入问题。
- 使用回溯法来正确更新状态,使得算法可以正确运行。
这段代码现在能够有效地计算出目标和等于给定值的所有路径数量。
内容由零声教学AI助手提供,问题来源于学员提问