ZBLOG

/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ var result int func Recursion(root *TreeNode, targetSum int) map[int]int { if root == nil { return...

在你的 Go 代码中,pathSum 函数的实现目标是计算二叉树中路径和等于 targetSum 的路径数量。你使用了一个递归函数 Recursion 来遍历树,并使用一个 map 来存储从当前节点到达的所有路径和的频率。

根据你提供的代码,有几个地方需要注意:

  1. 结果初始化:每次调用 pathSum 时,你都将 result 初始化为0。但是在递归过程中,可能会多次对同一节点进行访问,从而重复计算。这意味着最终得到的路径总数可能不正确。考虑在 Recursion 函数内返回并累加符合条件的路径数量,而不是全局变量。

  2. 合并左子树与右子树结果时需要处理零和:当从左右子树合并后,需要考虑如果某个子树为空,则相应计数会丢失,因此要确保即使某一边没有值也能正常工作。

  3. 返回 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19843

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?