题目-简单难度
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
提示:
- 树中节点的数目在范围 [0, 5000] 内
- -1000 <= Node.val <= 1000
- -1000 <= targetSum <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. bfs
时间
44ms
击败 95.11%使用 Python3 的用户
内存
16.99MB
击败 63.43%使用 Python3 的用户
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
# 如果所有根节点到叶子节点都没有找到与目标和相同的路径, 返回False
if not root: return False
# 只有递归到了叶子节点, 才会判断当前节点的值是否满足目标和的要求
if not root.left and not root.right:
return targetSum == root.val
# 递归判断左右节点是否存在满足条件的路径
return self.hasPathSum(root.left,targetSum-root.val) or self.hasPathSum(root.right,targetSum-root.val)
2. dfs
时间
64ms
击败 12.66%使用 Python3 的用户
内存
17.15MB
击败 5.47%使用 Python3 的用户
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
# 没有根节点直接返回False
if not root: return False
# li用于遍历不同深度的节点
li = [root]
# res用于存储不同深度节点的值
res = [root.val]
# 当li不为空, 代表还有下一个深度的节点
while li:
# 遍历当前深度
for _ in range(len(li)):
# 由于li和res是同步的,所以同时pop两个list
a = li.pop(0)
v = res.pop(0)
# 判断是否是最后一个子节点
if not a.left and not a.right:
# 如果是, 判断当前节点的值是否达到目标和
if targetSum == v:
return True
# 如果有左节点, 添加节点到li, res统计路径上的节点和
if a.left:
li.append(a.left)
res.append(v+a.left.val)
# 右节点同上
if a.right:
li.append(a.right)
res.append(v+a.right.val)
# 如果遍历完没发现目标, 返回False
return False