LeetCode-路徑總和-多種類型

1、路徑總和

給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。

說明: 葉子節點是指沒有子節點的節點。

示例: 給定如下二叉樹,以及目標和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1
返回 true, 因爲存在目標和爲 22 的根節點到葉子節點的路徑 5->4->11->2。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/path-sum/

def hasPathSum(root, sum):
    def dfs(sums, target, root):
        if not root:
            return sums == target

        if not root.right:
            return dfs(sums + root.val, target, root.left)

        if not root.left:
            return dfs(sums + root.val, target, root.right)

        return dfs(sums + root.val, target, root.left) or dfs(sums + root.val, target, root.right)

    if not root:
        return False

    return dfs(0, sum, root)

2、路徑總和 II

給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:給定如下二叉樹,以及目標和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回: [ [5,4,11,2],  [5,8,4,5]]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/path-sum-ii/


def pathSum(root, sum):

    def dfs(root, cur, path, sum, res):
        if not root:
            return
        path.append(root.val)
        if not root.left and not root.right:
            if cur + root.val == sum: res.append(list(path))
        else:
            dfs(root.left, cur + root.val, path, sum, res)
            dfs(root.right, cur + root.val, path, sum, res)
        path.pop()
        return res

    return dfs(root, 0, [], sum, [])

3、路徑總和 III 

給定一個二叉樹,它的每個結點都存放着一個整數值。

找出路徑和等於給定數值的路徑總數。

路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。

示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等於 8 的路徑有:

1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/path-sum-iii/

def pathSum(root, sum):
    def dfs(root, sums):
        if not root:
            return 0
        sums = [root.val] + list(map(lambda x: x + root.val, sums))
        return sums.count(sum) + dfs(root.left, sums) + dfs(root.right, sums)

    return dfs(root, [])

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章