刷剑指offer 二叉树中和为某一值的路径时,提交代码发现通过不了。
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def __init__(self):
self.path = []
self.res = []
def FindPath(self, root, expectNumber):
# write code here
if not root:
return []
self.CheckSum(root, expectNumber, 0)
print(self.res)
return self.res
def CheckSum(self, root, expectNumber, cur):
self.path.append(root.val)
if not root.left and not root.left:
if expectNumber == cur + root.val:
print(self.path)
self.res.append(self.path)
if root.left:
self.CheckSum(root.left, expectNumber, cur + root.val)
if root.right:
self.CheckSum(root.right, expectNumber, cur + root.val)
self.path.pop()
调试发现时python列表append时出了问题
a = [1,2,3]
b = []
b.append(a)
print(b)
a.pop()
print(b)
输出结果为
[[1, 2, 3]]
[[1, 2]]
原因是因为b.append()时,是使用了a的引用,当a发生改变的时候,例子中b[0]的值也会收到影响。
将上述代码修改为:
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def __init__(self):
self.path = []
self.res = []
def FindPath(self, root, expectNumber):
# write code here
if not root:
return []
self.CheckSum(root, expectNumber, 0)
print(self.res)
return self.res
def CheckSum(self, root, expectNumber, cur):
self.path.append(root.val)
if not root.left and not root.left:
if expectNumber == cur + root.val:
print(self.path)
#self.res.append(self.path)
self.res.append(self.path[:])
if root.left:
self.CheckSum(root.left, expectNumber, cur + root.val)
if root.right:
self.CheckSum(root.right, expectNumber, cur + root.val)
self.path.pop()
即可通过测试