开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
437.路径总和
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa…
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例 1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。
示例 2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:3
提示:
- 二叉树的节点个数的范围是 [0,1000]
- <= Node.val <=
- -1000 <= targetSum <= 1000
解法
- 递归: 树的问题一般用递归求解,正好本题可以用递归方式,从根节点起,分别递归左子节点和右子节点,最后将结果相加即可
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def pathSum(self, root, targetSum):
"""
:type root: TreeNode
:type targetSum: int
:rtype: int
"""
if root is None:
return 0
return self.dfs(root, targetSum) + self.pathSum(root.left, targetSum) + self.pathSum(root.right, targetSum)
def dfs(self, root, sum):
if not root:
return 0
'''每一次都要减去当前层的节点值'''
sum -= root.val
'''
(1 if path==0 else 0):说明找到了路径
self.dfs(root.left, path) self.dfs(root.right, path):
此时path更新过,这是因为当前点既可以往左走找path,也可以往右走,是或的关系,只要有一边找到了路径,最终结果都会为1
'''
return (1 if sum==0 else 0) + self.dfs(root.left, sum) + self.dfs(root.right, sum)
复杂度分析
-
时间复杂度:, 其中 N 为该二叉树节点的个数。对于每一个节点,求以该节点为起点的路径数目时,则需要遍历以该节点为根节点的子树的所有节点,因此求该路径所花费的最大时间为 O(N),我们会对每个节点都求一次以该节点为起点的路径数目,因此时间复杂度为 O(N^{2})
-
空间复杂度:O(N),考虑到递归需要在栈上开辟空间