Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python N元树遍历,包括到内部节点的路径_Python_Recursion_Tree - Fatal编程技术网

Python 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,

以下帖子中接受的答案提供了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, 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
的下方,并且只保留一份副本。(功能等效。)