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)。