LeetCode113 | 路径总和II

每天分享一个LeetCode题目

每天 5 分钟,一起进步

LeetCode113 路径总和II,地址: https://leetcode-cn.com/problems/path-sum-ii/

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

之前的112题目,计算的是整个路径有没有路径和为 targetSum 的路径,同样是从根结点到叶子结点。

这个题目比较麻烦的一点是需要将满足要求的路径记录下来。

下面分别用 DFS 和 BFS 来解决一下这个问题。

树结点定义

class TreeNode(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

DFS深度遍历解决

二叉树的深度遍历中,由于在计算过程中需要保存当前计算时结点的信息(包括从根结点到当前结点的结点值之和以及从根结点到当前结点的路径list)。所以在进行递归遍历的时候,需要在这两方面做计算。

targetSum的处理:递归过程中,在遍历下一个结点的时候,将当前结点值减去,直到遍历到叶子结点的时候,判断不断被减去的 targetSum剩余值是否和叶子结点的值一致。如果一致,那么,记录该路径。如果不一致,放弃该路径。

看下图的一个说明

对路径的处理:递归过程中,不断记录路径,当遍历到叶子结点的时候,如果满足条件,则将该路径保存到最终的结果集中。

看代码:

def pathSum_dfs(self, root, targetSum):
    if not root:
        return
    res = []

    def dfs(root, target_sum, path, res_path):
        """
        :param root: 当前根结点
        :param target_sum: 当前目标值
        :param path: 当前路径列表
        :param res_path: 当前最终结果路径列表
        :return:
        """
        if not root:
            return
        if not root.left and not root.right and target_sum == root.val:
            res_path.append(path + [root.val])
        dfs(root.left, target_sum - root.val, path + [root.val], res_path)
        dfs(root.right, target_sum - root.val, path + [root.val], res_path)

    dfs(root, targetSum, [], res)
    return res

重点就是在tagetSum方面做了一些文章,仔细看看,其实就是一个先序遍历的过程。

BFS处理

BFS的处理思路是非常清晰的,详细可以看这篇文章:https://mp.weixin.qq.com/s/9U4P5zZIFppiJO_XK2QFDA

关于 BFS 处理树结构是非常清楚的。

思路就是在层序遍历过程中,遍历到各自结点的时候,记录当前信息。

如下:

图片来自(https://mp.weixin.qq.com/s/9U4P5zZIFppiJO_XK2QFDA)

很清晰的说明了在遍历到不同的结点的时候,记录:

当前结点

根结点到当前结点路径和

根结点到当前结点路径list

看本题代码:

def pathSum_bfs(self, root, targetSum):
    if not root:
        return
    res = collections.deque() # 保存最后结果list
    queue = collections.deque()
    queue.appendleft((root, root.val, [root.val])) # (结点,根到当前结点累加和,根到当前结点路径)

    while(queue):
        node, node_val, node_path = queue.pop()
        if not node.left and not node.right and node_val == targetSum:
            res.appendleft(node_path)
        if node.left:
            queue.appendleft((node.left, node_val+node.left.val, node_path+[node.left.val]))
        if node.right:
            queue.appendleft((node.right, node_val+node.right.val, node_path+[node.right.val]))
    return list(res)

下一篇来看看《路径总和III》,到时候对这类型题目会更加熟练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值