二叉树的每个叶子的路径
Path to each Leaf of a Binary Tree
上面的函数 AllPaths()
将包含二叉树每个叶子的路径的数组追加到全局数组 res
。
代码工作正常,但我想删除全局变量 res
并将函数 return 改为数组。我该怎么做?
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
res = []
def allPaths(node, arr=[]):
if node:
tmp = [*arr, node.value]
if not node.left and not node.right: # Leaf
res.append(tmp)
allPaths(node.left, tmp)
allPaths(node.right, tmp)
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
"""
1 <-- root
/ \
2 3
/ \ \
4 5 6 <-- leaves
"""
allPaths(root)
print(res)
# Output : [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
一种让您完全避免使用内部列表和全局列表的简单方法是制作一个生成器,在值出现时生成值。然后你可以将它传递给 list
以获得最终结果:
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
def allPaths(node):
if node:
if not node.left and not node.right: # Leaf
yield [node.value]
else:
yield from ([node.value] + arr for arr in allPaths(node.left))
yield from ([node.value] + arr for arr in allPaths(node.right))
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
g = allPaths(root)
list(g)
# [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
一种方法是回溯:
def allPaths(node, partial_res, res):
if not node:
return
if not node.left and not node.right:
res.append(partial_res[:] + [node.value])
return
partial_res.append(node.value)
allPaths(node.left, partial_res, res)
allPaths(node.right, partial_res, res)
partial_res.pop()
res = []
allPaths(root, [], res)
print(res)
你可以在递归中传递当前路径:
def allPaths(node,path=[]):
if not node: return # no node, do nothing
fullPath = path + [node.value]
if node.left or node.right: # node is not a leaf, recurse down
yield from allPaths(node.left, fullPath) # left leaves if any
yield from allPaths(node.right, fullPath) # right leaves if any
else:
yield fullPath # leaf node, return final path
我提供另一种选择。
def allPaths(root, path=[]):
tmp = []
if root.left:
tmp.extend(allPaths(root.left, path + [root.value]))
if root.right:
tmp.extend(allPaths(root.right, path + [root.value]))
if not root.left and not root.right:
tmp.append(path + [root.value])
return tmp
tree = allPaths(root)
print(tree)
输出为:
[[1, 2, 4], [1, 2, 5], [1, 3, 6]]
上面的函数 AllPaths()
将包含二叉树每个叶子的路径的数组追加到全局数组 res
。
代码工作正常,但我想删除全局变量 res
并将函数 return 改为数组。我该怎么做?
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
res = []
def allPaths(node, arr=[]):
if node:
tmp = [*arr, node.value]
if not node.left and not node.right: # Leaf
res.append(tmp)
allPaths(node.left, tmp)
allPaths(node.right, tmp)
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
"""
1 <-- root
/ \
2 3
/ \ \
4 5 6 <-- leaves
"""
allPaths(root)
print(res)
# Output : [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
一种让您完全避免使用内部列表和全局列表的简单方法是制作一个生成器,在值出现时生成值。然后你可以将它传递给 list
以获得最终结果:
class Node:
def __init__(self, value, left=None, right=None) -> None:
self.value = value
self.left = left
self.right = right
def allPaths(node):
if node:
if not node.left and not node.right: # Leaf
yield [node.value]
else:
yield from ([node.value] + arr for arr in allPaths(node.left))
yield from ([node.value] + arr for arr in allPaths(node.right))
root = Node(1)
root.left = Node(2);
root.left.left = Node(4);
root.left.right = Node(5);
root.right = Node(3);
root.right.right = Node(6);
g = allPaths(root)
list(g)
# [[1, 2, 4], [1, 2, 5], [1, 3, 6]]
一种方法是回溯:
def allPaths(node, partial_res, res):
if not node:
return
if not node.left and not node.right:
res.append(partial_res[:] + [node.value])
return
partial_res.append(node.value)
allPaths(node.left, partial_res, res)
allPaths(node.right, partial_res, res)
partial_res.pop()
res = []
allPaths(root, [], res)
print(res)
你可以在递归中传递当前路径:
def allPaths(node,path=[]):
if not node: return # no node, do nothing
fullPath = path + [node.value]
if node.left or node.right: # node is not a leaf, recurse down
yield from allPaths(node.left, fullPath) # left leaves if any
yield from allPaths(node.right, fullPath) # right leaves if any
else:
yield fullPath # leaf node, return final path
我提供另一种选择。
def allPaths(root, path=[]):
tmp = []
if root.left:
tmp.extend(allPaths(root.left, path + [root.value]))
if root.right:
tmp.extend(allPaths(root.right, path + [root.value]))
if not root.left and not root.right:
tmp.append(path + [root.value])
return tmp
tree = allPaths(root)
print(tree)
输出为:
[[1, 2, 4], [1, 2, 5], [1, 3, 6]]