题目

leetcode:113

路径总和 leetcode——递归+回溯_go

代码与解析

这道题可以看做leetcode112和leetcode257合体

这道题要遍历整棵树, 把所有符合条件的路径添加进去, 所以不需要返回值

递归三部曲:

  • 确定参数和返回值
    要传入 当前节点, 和总和, 不需要返回值
  • 确定终止条件
    如果当前节点没有叶子结点,并且和等于target. 那么添加进res, 并返回
    如果当前节点没有叶子结点, 就返回

  • 确定单层递归逻辑
    我采用的前序遍历, 先处理中间节点,把当前节点添加进path,如果当前节点没有叶子结点,并且和等于target. 那么添加进res, 并返回,
    然后判断做节点左节点是否为空, 不空就遍历,并且加上回溯,遍历完恢复原样,我代码里写到逻辑这里是两处回溯,一个是path, 一个是sum,右节点也是如此
  • 路径总和 leetcode——递归+回溯_go_02

func pathSum(root *TreeNode, targetSum int) [][]int {
    res := [][]int{}
    if root==nil{
        return res
    }
    path := []int{}
    var traversal func(root *TreeNode, sum int)
    traversal = func(root *TreeNode, sum int){
        path = append(path, root.Val)
		// 如果当前节点没有叶子结点,并且和等于target. 那么添加进res, 并返回
        if sum ==targetSum&&root.Left==nil&&root.Right==nil{
            tmp := []int{}
            for _, value:=range path{
                tmp = append(tmp, value)
            }
            res = append(res, tmp)
            return 
        }
		// 如果当前节点没有叶子结点, 就返回
        if root.Left==nil&&root.Right==nil{
            return
        }
        if root.Left!=nil{
			// 一个回溯是sum, 一个是path
            traversal(root.Left, sum+root.Left.Val)
            path = path[:len(path)-1]
        }
        if root.Right!=nil{
            traversal(root.Right, sum+root.Right.Val)
            path = path[:len(path)-1]
        }
    }
    traversal(root, root.Val)
    return res
}