leetcode算法题--二叉树中和为某一值的路径

原题链接:https://leetcode.cn/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/description/?envType=study-plan-v2&envId=coding-interviews

/**
 * 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 
}

你可能感兴趣的:(Algorithm,算法,leetcode,职场和发展)