LeetCode 437. 路径总和 III
题目描述
思路分析
前缀和 + 回溯
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func pathSum(root *TreeNode, targetSum int) int {
prefixSum := map[int]int{0: 1}
res := 0
var dfs func(*TreeNode, int)
dfs = func(cur *TreeNode, curSum int) {
if cur == nil {
return
}
// 更新当前路径和
curSum += cur.Val
// 查找是否有满足条件的路径
res += prefixSum[curSum-targetSum]
// 更新哈希表中的前缀和
prefixSum[curSum]++
// 递归左右子树
dfs(cur.Left, curSum)
dfs(cur.Right, curSum)
// 回溯,恢复前缀和的状态
prefixSum[curSum]--
}
dfs(root, 0)
return res
}
- 时间复杂度:O(n),每个节点只遍历一次。
- 空间复杂度:O(h),其中 h 是树的高度。
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用