112. 路径总和
题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/path-sum
题目
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
解题思路
思路:递归、广度优先搜索
在这里先讲 递归,这个解法的思路是从根节点往下找,找到叶子节点。
先假设跟节点到当前节点的路径和为 val,那么将问题转变一下,是否能够找到从当前节点到叶子节点的路径和为 sum - val
,这符合递归的性质。
那么也就是说从根节点往下找到叶子节点,如果确定当前节点是叶子节点,那么判断 sum 是否等于当前节点的 val 值即可。如果不是叶子节点,那么将继续向下查找。
具体的代码实现见【代码实现 # 递归】
同样的这道题中,我们也可以使用 广度优先搜索 的思路来解决。在这里我们使用队列,存储节点以及根节点到某个节点的路径和。
以题目所给示例,具体的实现过程如下图所示:
具体实现代码见【代码实现 # 广度优先搜索】
代码实现
# 递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
if not root.left and not root.right:
return sum == root.val
return self.hasPathSum(root.left, sum - root.val) or self.hasPathSum(root.right, sum - root.val)
# 广度优先搜索
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
from collections import deque
# 队列存储节点和路径和
queue = deque()
queue.append((root, root.val))
while queue:
# 出队,开始搜索
node, path = queue.popleft()
# 如果叶子节点,路径和等于目标值时,直接返回 True
if not node.left and not node.right and path == sum:
return True
if node.left:
queue.append((node.left, path + node.left.val))
if node.right:
queue.append((node.right, path + node.right.val))
return False
实现结果
递归
广度优先搜索