看完题目的第一反应就是用剪枝的思想来穷举. 如果只考虑到所有 Node 都是正数的情况的话,其实可以快很多. 不过考虑到有一些 node 是负数,因此每次都要遍历完整个树.

一般的剪枝思想其实不会动 root. 但是这个题目是要列出来所有的可能, 这样的话就是用每个 node 都为根来进行穷举. 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def pathSum(self, root: TreeNode, sum_: int) -> int:
if not root:
return 0
ans = []
current_vals = []
def travel(node, target_num, current_vals, ans):
if node is None:
return
current_vals.append(node.val)
if sum(current_vals) == target_num:
ans.append(current_vals.copy())
travel(node.left, target_num, current_vals, ans)
if node.left:
current_vals.pop()
travel(node.right, target_num, current_vals, ans)
if node.right:
current_vals.pop()
queue = [root]
while queue:
node = queue.pop(-1)
travel(node, sum_, [], ans)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return len(ans)

考虑到树的很多枝其实是经过多次计算的, 因此可以用动态规划在继续优化