/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, target int) [][]int {
res, ok := dfs(root, target, 0)
if ok {
return res
}
return nil
}
func dfs(root *TreeNode, target, sum int) ([][]int, bool) {
res := make([][]int, 0)
if root == nil {
return res, false
}
if root.Left == nil && root.Right == nil {
tmp := []int{root.Val}
res = append(res, tmp)
if sum+root.Val == target {
return res, true
} else {
return res, false
}
}
if root.Left != nil {
lefts, ok := dfs(root.Left, target, sum+root.Val)
if ok {
for _, left := range lefts {
tmp1 := []int{}
tmp1 = append(tmp1, root.Val)
tmp1 = append(tmp1, left...)
res = append(res, tmp1)
}
}
}
if root.Right != nil {
rights, ok := dfs(root.Right, target, sum+root.Val)
if ok {
for _, right := range rights {
tmp2 := []int{}
tmp2 = append(tmp2, root.Val)
tmp2 = append(tmp2, right...)
res = append(res, tmp2)
}
}
}
if len(res) > 0 {
return res, true
}
return res, false
}
其实用不着返回这么多状态,
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, target int) [][]int {
res := [][]int{}
path := []int{}
var dfs func(root *TreeNode, legacy int)
dfs = func(root *TreeNode, legacy int) {
if root == nil {
return
}
legacy -= root.Val
path = append(path, root.Val)
defer func() {
path = path[:len(path)-1]
}()
if root.Left == nil && root.Right == nil && legacy == 0 {
tmp := make([]int, len(path))
copy(tmp, path)
res = append(res, tmp)
return
}
dfs(root.Left, legacy)
dfs(root.Right, legacy)
return
}
dfs(root, target)
return res
}