【问题标题】:What is the most efficient way to traverse a tree in Python?在 Python 中遍历树的最有效方法是什么?
【发布时间】:2011-02-13 21:26:49
【问题描述】:

假设我有一个包含以下字段的对象列表

父母

价值

这定义了一个树结构,类似于目录树。

我想以预订方式遍历列表。最有效的方法是什么?

通常,在其他(更重要的)语言中,我会迭代这些值,找到没有父对象的值,然后为每个对象再次迭代其父对象是我当前正在查看的对象的每个对象,依此类推,但是有没有更聪明的方法在 Python 中做到这一点?

【问题讨论】:

    标签: python tree traversal


    【解决方案1】:

    我会首先创建一个更合适的数据结构——捕获从父级到子级的链接:

    children = {}
    for obj in tree:
        children.setdefault(obj.parent, []).append(obj)
    
    def preorder(root, children):
        yield root.value
        for child in children.get(root, []):
            for value in preorder(child, children):
                yield value
    
    for root in children[None]:
        for value in preorder(root, children):
            print value
    

    你也可以在这里使用collections.defaultdict

    【讨论】:

    • 我认为如果没有特殊的套管 obj.parent is not None 在遍历中会更好。它的代码更少,速度更快,并且可以处理森林而不是树(children[None] 是所有树根的列表)。
    • 太棒了!我要补充一点,您可以更改: def preorder(root, children,depth): yield [root.value,depth] for child in children.get(root, []): for value in preorder(child, children,depth+ 1):产生价值,这样您不仅可以看到预购结果,还可以看到每个节点的深度。请注意,第一次调用应该是 preorder(root,children,0) 非常感谢! 编辑:呃。回复时代码看起来很乱。
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多