0220601/LeetCode
# 437. Path Sum III
题目描述
给定一个二叉树和一个数字,返回二叉树中与给定数字相加等于目标和的所有路径的数目。路径可能从任意节点出发,但不能与任何其他节点重合。
例如,给定一个二叉树:
`````` 5
/ \
4 11
/ \ / \
4 2 1 5
``````
和数字 `22`,返回 `3`。返回的路径如下:
``````2 + 4 + 2 + 5
4 + 4 + 2 + 2 + 4
11 + 1 + 5
``````
解题思路
递归
这道题可以使用递归的方法来解决。我们定义一个 `helper` 函数,用于从根节点开始递归地遍历树,并且在遍历时检查当前节点值是否与目标值相加等于目标和。
在遍历过程中,我们需要维护两个变量,一个是当前路径的和,另一个是当前路径的长度。当当前路径的长度等于路径长度时,我们将当前路径的和与目标和进行比较,如果相等,则计数器加一。
在递归过程中,我们首先递归遍历左子树,然后递归遍历右子树。遍历完左右子树后,我们将当前节点值从路径中去掉,并递归地调用 `helper` 函数。
代码实现
``````class Solution:
def pathSum(self, root: TreeNode, sum: int) -> int:
if not root:
return 0
self.ans = 0
self.helper(root, sum, 0, [])
return self.ans
def helper(self, root, target, cur, path):
path.append(root.val)
cur += root.val
if not root.left and not root.right and cur == target:
self.ans += 1
if root.left:
self.helper(root.left, target, cur, path)
path.pop()
if root.right:
self.helper(root.right, target, cur, path)
path.pop()
``````
复杂度分析
• 时间复杂度: O(n^2)。在最坏情况下,我们需要遍历每个节点,并且对每个节点,我们都要进行一次路径比较。
• 空间复杂度: O(n)。递归调用栈的深度最多为树的高度,最坏情况下为O(n)。