这是我现在在Python3中做的编码问题:
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_paths(root, targetSum):
allPaths = []
dfs(root, targetSum, [], allPaths)
return allPaths
def dfs(node, targetSum, currentPath, result):
if not node:
return
currentPath.append(node.val)
if node.val == targetSum:
if not node.left and not node.right:
result.append(list(currentPath))
else:
dfs(node.left, targetSum - node.val, currentPath, result)
dfs(node.right, targetSum - node.val, currentPath, result)
# backtrack here
del currentPath[-1]
def main():
root = TreeNode(12)
root.left = TreeNode(7)
root.right = TreeNode(1)
root.left.left = TreeNode(4)
root.right.left = TreeNode(10)
root.right.right = TreeNode(5)
required_sum = 23
print(find_paths(root, required_sum))
main()
问题是这行就在这里:
result.append(list(currentPath))
它打印出:
[[12, 7, 4], [12, 1, 10]]
但是如果你把:
result.append(currentPath)
它将打印出来:
[[], []]
我尝试打印出"currentPath"的类型,它已经是一个列表。当列表已经是列表类型时,为什么它是必不可少的?
因为这个:
del currentPath[-1]
换句话说:您正在将currentPath
对象添加到结果对象,但稍后对其进行了修改。修改反映在您的result
中。使用list(…)
创建列表的副本。
在您的情况下,如果您这样做
result.append(currentPath)
然后将对象追加currentPath
。实际上,您可以将其视为将指针附加到对象currentPath
。这意味着result
实际上将持有currentPath
而不是currentPath
的内容。
因此,当你会做
del currentPath[-1]
您将更改currentPath
对象。由于result
具有实际的currentPath
,因此result
也会被修改。
但!
当你在做
result.append(list(currentPath))
您正在附加一个新对象,具有currentPath
的内容。这会导致result
具有不同的对象,而不是实际的currentPath
。这是因为list()
将从currentPath
的内容创建一个新列表。
因此,当您currentPath
使用
del currentPath[-1]
不会修改result
。
要自行验证,您可以检查
id(result[0])
id(currentPath)
使用.append(list(currentPath))
和使用.append(currentPath)
时。