给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
第一次代码:
递归计算路径和,满足要求时,加入列表av。
但我就不懂了,v=v+[r.val]换成v.append(r.val)之后,v添加了所有的节点值,并没有分别递归添加,找到原因了:使用append实际是修改原列表,使用+实际是创建一个新的列表,而新列表用来递归,因为如果选择append方式修改原列表v,看似没区别,但是在递归右树的时候,左树的值还在v中。
def sum1(x):#设置求和函数sum1
c=0
for i in x:
c=c+i
return c
av=[]
def c(r,v):
v=v+[r.val]#v.append(r.val)就不行
print(v)
if not r.left and not r.right:
if sum1(v)==sum:
av.append(v)
return
if r.left :
c(r.left,v)
if r.right:
c(r.right,v)
if not root :
return av
c(root,[])
return av
112ms,排名23%
做减法要更快一些,就不用设置sum1函数了:
av=[]
def c(r,v,l):
if v==0 and not r.left and not r.right:#满足要求
av.append(l)
if r.left :#注意是将节点值添加到迭代而不是节点
c(r.left,v-r.left.val,l+[r.left.val])
if r.right:
c(r.right,v-r.right.val,l+[r.right.val])
if not root :
return av
c(root,sum-root.val,[root.val])#先把初始root节点添加为初始条件
return av
80ms,排名56%