给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
广度优先
记录从根节点到当前节点的路径和,广度优先保证每个节点只进入一次,防止重复计算。这样我们使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。 时间复杂度:O(n),其中 n 是树的节点数 空间复杂度:O(n),其中 n 是树的节点数。空间复杂度主要取决于队列的开销,队列中的元素个数不会超过树的节点数。
class Solution:
def bfs(self, root, target):
if not root:
return False
queue = []
queue_sum = []
queue.append(root)
queue_sum.append(root.val)
while queue and queue[0]:
size = len(queue)
for _ in range(size):
cur =queue.pop(0)
cur_sum = queue_sum.pop(0)
if (not cur.left) and (not cur.right) and (cur_sum == target):
return True
if cur.left:
queue.append(cur.left)
queue_sum.append(cur_sum + cur.left.val)
if cur.right:
queue.append(cur.right)
queue_sum.append(cur_sum + cur.right.val)
return False
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
return self.bfs(root, targetSum)
递归 对根节点来说,当前节点的值是 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 target - val, 也就是把子节点作为递归函数的根节点,把target-val作为递归函数的目标。边界是,若当前节点就是叶子节点其值为val,是否存在从当前节点的子节点到叶子的路径,满足其路径和为 target - val=0
时间复杂度:O(n),其中 n 是树的节点数 空间复杂度:O(logn),其中 n 是树的节点数。空间复杂度主要取决递归栈
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False
if (not root.left) and (not root.right):
return root.val == targetSum
return self.hasPathSum(root.left, targetSum-root.val) or self.hasPathSum(root.right, targetSum-root.val)
|