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

写在题首的话:
欢迎来到我的个人博客,更多内容请点击blog.devilwst.top

题目

leetcode:113

代码与解析

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

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

递归三部曲:

  • 确定参数和返回值
    要传入 当前节点, 和总和, 不需要返回值

  • 确定终止条件
    如果当前节点没有叶子结点,并且和等于target. 那么添加进res, 并返回
    如果当前节点没有叶子结点, 就返回

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

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值