【leedcode】113. 路径总和 II

378 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

难度 : 中等

问题描述

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

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

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5 输出:[]

示例 3:

输入:root = [1,2], targetSum = 0 输出:[]  

提示:

树中节点总数在范围 [0, 5000] 内 -1000 <= Node.val <= 1000 -1000 <= targetSum <= 1000

解题思路

遇到以上问题,最先想到的是深度遍历(DFS)和广度遍历(BFS)以下是实现的具体代码: 以下方法并非完全自己想法,有些借鉴优秀的算法,个人认为,学会了变成自己的就是自己的了

DFS

非递归方法:

class Solution:
    def pathSum(self, root: TreeNode, sum_: int) -> List[List[int]]:
        if not root: return []
        nums = [([root.val], root)]
        res = []
        while nums:
            tmp, node = nums.pop()
            if not node.right and not node.left and sum(tmp) == sum_:
                res.append(tmp)
            if node.right:
                nums.append((tmp + [node.right.val], node.right))
            if node.left:
                nums.append((tmp + [node.left.val], node.left))
        return res

递归
class Solution:
    def pathSum(self, root: TreeNode, sum_: int) -> List[List[int]]:
        def dfs(root, tmp, sum_):
            if not root:
                return 
            if not root.left and not root.right and sum_ - root.val == 0:
                tmp += [root.val]
                res.append(tmp)
            dfs(root.left, tmp + [root.val], sum_ - root.val)
            dfs(root.right, tmp + [root.val], sum_ - root.val)
        res = []
        dfs(root, [], sum_)
        return res

BFS

class Solution:
    def pathSum(self, root: TreeNode, targetSum: int) -> List[List[int]]:
        import collections
        # 按照广度优先搜索遍历树
        def BFS(root):
            if not root:
                return []
                
            # 存放每个节点的队列,按照广度优先搜索遍历
            queue = collections.deque()
            queue.append(root)
            # 存放每个节点到根节点root的距离,当某一个叶子节点到root处的距离等于targetSum时,满足要求,此时只需获取该叶子节点到root节点的路径即可
            distance = collections.deque()
            distance.append(root.val)
            # 字典,返回的是某一结点的父亲节点,root节点的父亲节点是None。依次可找到任意节点到root节点的路径
            parent = {root:None}
            res = []
            while queue:
                node = queue.popleft()
                d = distance.popleft()
                if not node.right and not node.left:
                    if d == targetSum:
                        res.append(get_path(node, parent))
                if node.left:
                    queue.append(node.left)
                    distance.append(node.left.val + d)
                    parent[node.left] = node
                if node.right:
                    queue.append(node.right)
                    distance.append(node.right.val + d)
                    parent[node.right] = node
            return res
         
        # 由给定的node和parent字典返回其到root节点的路径,返回值为列表
        def get_path(node, parent):
            res = []
            while node:
                res.append(node.val)
                node = parent[node]
            return res[::-1]
    
        return BFS(root)