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, [])