路径总和 III - 回溯
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
var (
ans int
theTarget int
sums []int
)
func pathSum(root *TreeNode, targetSum int) int {
ans = 0
theTarget = targetSum
sums = []int{}
process(root)
return ans >> 1
}
func process(root *TreeNode) {
for _, sum := range sums {
if sum == theTarget {
ans++
}
}
if root == nil {
return
}
for i := range sums {
sums[i] += root.Val
}
sums = append(sums, root.Val)
process(root.Left)
process(root.Right)
sums = sums[:len(sums) - 1]
for i := range sums {
sums[i] -= root.Val
}
}
路径总和 III - 深度优先遍历
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, targetSum int) int {
if root == nil {
return 0
}
ans := rootSum(root, targetSum)
ans += pathSum(root.Left, targetSum)
ans += pathSum(root.Right, targetSum)
return ans
}
// 以节点 root 为起点向下且满足路径总和为 targetSum 的路径数目
func rootSum(root *TreeNode, targetSum int) (ans int) {
if root == nil {
return
}
sub := targetSum - root.Val
if sub == 0 {
ans++
}
ans += rootSum(root.Left, sub)
ans += rootSum(root.Right, sub)
return
}
路径总和 III - 前缀和
先序遍历、前缀和 + map 记录
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, targetSum int) int {
// key: sum
// val: 次数
preSum := map[int]int{ 0: 1 }
ans := 0
var dfs func(node *TreeNode, curSum int)
dfs = func(node *TreeNode, curSum int) {
if node == nil {
return
}
curSum += node.Val
ans += preSum[curSum - targetSum]
preSum[curSum]++
dfs(node.Left, curSum)
dfs(node.Right, curSum)
preSum[curSum]--
}
dfs(root, 0)
return ans
}