你的代码中出现重复路径计数的问题,主要是因为在递归调用时,你对左子树和右子树的遍历方法不正确。
在每次递归中,当你进入一个节点时,你应该从当前节点开始计算路径,而不是总是从根节点或子树的根开始。在你的代码里,调用 Backtrace
方法的时候,对左右子树都传入了 0
作为 curSum
。这样做会导致在每次进入新的子树时重新计算路径和,从而漏掉一些有效的路径。
下面是修正后的代码:
var result int
func Backtrace(root *TreeNode, targetSum, curSum int) {
if root == nil {
return
}
curSum += root.Val
// Check if the current path sum equals to target sum
if curSum == targetSum {
result++
}
// Continue traversing down the tree, carrying along the current sum
Backtrace(root.Left, targetSum, curSum)
Backtrace(root.Right, targetSum, curSum)
}
func pathSum(root *TreeNode, targetSum int) int {
if root == nil {
return 0
}
// Reset result for each invocation of pathSum
result = 0
// Start backtracking from the current node and also check paths from left and right children.
Backtrace(root, targetSum, 0)
// Recursively call pathsum for left and right subtrees to ensure all paths are counted.
pathSum(root.Left, targetSum)
pathSum(root.Right, targetSum)
return result
}
修复点:
- 遍历逻辑:移除了将
curSum
重置为0
的调用,这样我们可以保持当前路径的累加值。 - 递归调用:添加了对左、右子树的额外递归调用,确保每个节点都被当作起点来检查可能的路径。
这样,每次都会从当前节点继续向下查找所有可能的路径,并统计符合条件的路径数量。这就能避免因为重置 curSum
而导致的漏计问题。
内容由零声教学AI助手提供,问题来源于学员提问