在你的 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助手提供,问题来源于学员提问


        
        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                