【问题标题】:RETURN all paths from root to leaf in n-ary tree返回 n 叉树中从根到叶的所有路径
【发布时间】:2021-04-11 20:56:34
【问题描述】:

关于如何打印一棵树中从根到叶的所有路径有很多,但我正在尝试返回它们。每个节点都有一个子节点列表,我需要返回一个字符串列表,其中每个字符串代表一个路径。即与树

   A
  /\
  B F
/ | \
C D  E 

我应该返回 ['A, B, C', 'A,B,D', 'A,B,E', 'A,F'] 该函数必须是递归的并在 python 中完成。我已经尝试了这个功能一段时间,但我被困在递归周围。即,如果我的函数以 path="" 开头,那么每次我回忆起该函数时,我都会丢失该路径...

*编辑:在@flakes 的回答和修改yield [root.value] + pathyield [root.value+", "+path[0]) 的帮助下解决了

【问题讨论】:

标签: python


【解决方案1】:

首先为您的节点结构定义一个类。它应该有一个值和一个子节点列表:

class Node:
    def __init__(self, value, children=None):
        self.value = value
        self.children = children or []

对于从递归函数返回数据,我喜欢使用generators,因为它们可以大大简化逻辑。

第一个用例是没有孩子的时候。结果应该是[value]

当有子项时,您希望循环子项列表中的每个子项,找到它们各自的路径,并为每条路径将当前的[value] 附加到它们的结果中。

你可能会得到这样的东西:

def find_paths(root):
    if len(root.children) == 0:
        yield [root.value]

    for child in root.children:
        for path in find_paths(child):
            yield [root.value] + path

测试用例:

tree = Node('a', [Node('b', [Node('c'), Node('d'), Node('e')]), Node('f')])

for path in find_paths(tree):
    print(path)
['a', 'b', 'c']
['a', 'b', 'd']
['a', 'b', 'e']
['a', 'f']

如果您需要它作为一个平面列表,那么我会在调用后将结果展平:

output = [value for path in find_paths(tree) for value in path]

【讨论】:

  • 必须从数据类中导入数据类
  • @AminGuermazi 你知道,我会去掉类型提示和数据类以使其更简单
  • @flakes 谢谢!但我需要返回一个长列表中的所有路径
  • @JacobMitrani list(find_paths(tree))
  • @flakes 非常感谢 - 但我需要输出为 ['a, b, c', 'a, b, d'...],即每个路径作为一个字符串其中节点用逗号分隔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2011-10-31
  • 2021-09-19
  • 1970-01-01
  • 2016-08-29
相关资源
最近更新 更多