Python N元树遍历,包括到内部节点的路径
以下帖子中接受的答案提供了n元树中的所有根到叶路径:。您如何修改上述答案(也包括在下面)中的代码,使其包含从根节点到内部节点的路径?例如,在文章中提供的树中,完整列表将是:Python N元树遍历,包括到内部节点的路径,python,recursion,tree,Python,Recursion,Tree,以下帖子中接受的答案提供了n元树中的所有根到叶路径:。您如何修改上述答案(也包括在下面)中的代码,使其包含从根节点到内部节点的路径?例如,在文章中提供的树中,完整列表将是: [10, 2] #path from root to internal node [10, 4] #path from root to internal node [10, 2, 15] #path from root to leaf [10, 2, 20] #... [10, 2, 25] [10, 2, 30] [10,
[10, 2] #path from root to internal node
[10, 4] #path from root to internal node
[10, 2, 15] #path from root to leaf
[10, 2, 20] #...
[10, 2, 25]
[10, 2, 30]
[10, 4, 45]
[10, 4, 50]
[10, 4, 55]
[10, 4, 60]
您如何修改此程序以完成此任务
def traverse(node, path = []):
path.append(node.data)
if len(node.child) == 0:
print(path)
path.pop()
else:
for child in node.child:
traverse(child, path)
path.pop()
这是一个非常简单的修改;保留DFS,但在每个节点打印,而不是仅打印叶子。对于每个递归调用帧,推送根节点,生成路径,在每个子节点上递归,然后在访问所有子节点后弹出根节点
遍历
是一个糟糕的函数名,因为它没有描述正在进行的遍历类型
def all_tree_paths(node, path=[]):
path.append(node)
yield path[:]
for child in node.child:
yield from all_tree_paths(child, path)
path.pop()
if __name__ == "__main__":
from collections import namedtuple
Node = namedtuple("Node", "data child")
""" a
/ | \
b c d
/ / \
e f g
"""
tree = Node(
"a",
[
Node(
"b",
[
Node("e", [])
]
),
Node("c", []),
Node(
"d",
[
Node("f", []),
Node("g", [])
]
)
]
)
print([[x.data for x in path] for path in all_tree_paths(tree)])
输出:
['a']
['a', 'b']
['a', 'b', 'e']
['a', 'c']
['a', 'd']
['a', 'd', 'f']
['a', 'd', 'g']
考虑到这一点,我认为原文更为清晰:
def all_root_to_leaf_paths(node, path=[]):
path.append(node)
if not node.child:
yield path[:]
for child in node.child:
yield from traverse(child, path)
path.pop()
如果len(node.child)==0:
应该是如果node.child
;else
是多余的path.pop()
只需要在函数末尾调用,而不是在每个分支中调用一次;而且更喜欢返回生成器而不是生成类似的打印,这会削弱可重用性。将打印
移到if
语句上方(并缩进)。谢谢!这非常有效。我不知道我怎么没听清楚。另外,代码也不需要复制path.pop()
调用。最好将其移动到if else
的下方,并且只保留一份副本。(功能等效。)