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