【问题标题】:Python: Algorithm Traverse Tree that expands at each nodePython:在每个节点处扩展的算法遍历树
【发布时间】:2011-11-09 04:06:23
【问题描述】:

我有一个字典,其中包含 id 和每个 ID 的多个字符串值。对于每个 Id 中的每个值,我都会进行数据库查询并获得设置的结果:

{111: Run, Jump, swim}
{222: Eat, drink}

所以对于每个值,假设运行我执行一个查询,它返回另一组数据,然后选择该组的每个值并运行查询,这将给出另一组,最后我到达一个点,只有一个项目得到返回。一旦我完成获得Run 的每个子元素的最后一个元素,然后我移动到Jump 并继续。

我之前问过这个问题,但没有得到任何结果,所以人们告诉我删除代码并再次问这个问题。这是我几天前问的同一问题的link。我需要实现类似 disjoin set 的东西吗?

【问题讨论】:

    标签: python algorithm disjoint-sets


    【解决方案1】:

    您可以将类别/子类别视为在每个节点有 N 个分支的树(取决于您有多少类别)。据我所知,您基本上想生成一个有序的树叶列表。

    一种简单的方法是通过生成器(使用原始问题中的术语):

    def lookup(elem):
        # do your SQL call here for a given category 'elem' and return
        # a list of it's subcategories
        return []
    
    def leaves(lst):
        if lst:
            for elem in lst:                          # for every category
                for sublist in leaves(lookup(elem)):  # enumerate it's sub categories
                    yield sublist                     # and return it
                yield elem                            # once lookup(elem) is [] return elem
    
    d = { 111: [Run, Jump, swim] , 222: [Eat, drink] }
    
    for key, lst in d.items():
        print key, [elem for elem in leaves(lst)]
    

    如果您不熟悉生成器,它们只是“产生”值而不是返回值的迭代器构造。不同之处在于,yielding 只会在该位置暂停迭代器,当请求下一个值时,它会在停止的地方继续。

    通过生成器内部的一些巧妙递归,您可以简单地解析整个树。

    [elem for elem in leaves(lst)] 是一个列表推导式,它只是为leaves 迭代的每个元素构建一个包含elem 的列表。

    【讨论】:

    • 非常感谢,我想知道您是否有机会查看我在原始问题中的尝试,我在此处放置了链接..?
    • 对不起,最后一行应该是打印键,[elem for elem in inorder(lst)] 编辑了上面的代码
    • 上面的代码现在应该是正确的。它基本上为每个键创建一个叶子列表,初始列表说 key=111 和 lst=[Run, Jump, Swim] 应该输出“111 [RunLeaf1, RunLeaf2, RunLeaf3, JumpLeaf1, JumpLeaf2, SwimLeaf1, SwimLeaf2 ...]” “222 ...”等等
    • 例如前提是 Run -> [ RunChild1, RunChild2, ...] and RunChild1 -> [RunLeaf1] and RunChild2 -> [RunLeaf2, RunLeaf3] 等等...
    • 如果你得到最大递归深度,那么看起来你的数据结构实际上不是一棵树,它可能有后边(例如,叶子指向它的一些父节点)在这种情况下你可以进入无限循环,在这种情况下,这种方法显然行不通,你必须适应。
    【解决方案2】:

    这看起来像普通的树遍历。您可以使用BFSDFS

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 2020-01-27
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多