枚举树中的所有路径

| 我想知道如何最好地实现树数据结构,以便能够枚举所有级别的路径。让我用以下示例进行说明:
     A
   /   \\
   B    C
   |    /\\
   D   E  F
我希望能够生成以下内容:
A
B
C
D
E
F
A-B
A-C
B-D
C-E
C-F
A-B-D
A-C-E
A-C-F
到目前为止,我正在对使用字典构建的数据结构执行不同深度的深度优先搜索,并记录看到的唯一节点,但我想知道是否有更好的方法来进行这种遍历。有什么建议么?     
已邀请:
每当您在树上发现问题时,只需使用递归:D
def paths(tree):
  #Helper function
  #receives a tree and 
  #returns all paths that have this node as root and all other paths

  if tree is the empty tree:
    return ([], [])
  else: #tree is a node
    root = tree.value
    rooted_paths = [[root]]
    unrooted_paths = []
    for subtree in tree.children:
        (useable, unueseable) = paths(subtree)
        for path in useable:
            unrooted_paths.append(path)
            rooted_paths.append([root]+path)
        for path in unuseable:
            unrooted_paths.append(path)
    return (rooted_paths, unrooted_paths)

def the_function_you_use_in_the_end(tree):
   a,b = paths(tree)
   return a+b
    
首先使用深度搜索找到树的每个节点的路径,然后调用
enumerate-paths(Path p)
,其中
p
是从根到节点的路径。假设路径“ 4”是节点“ 6”的数组,其中“ 7”是根,而“ 8”是当前节点。
enumerate-paths(p) {
    for i = 0 .. n  
        output p[n - i] .. p[n] as a path. 
}
这些路径中的每一个都不相同,并且它们中的每一个都与树的任何其他节点返回的结果都不同,因为没有其他路径以“ 8”结尾。显然,它是完整的,因为任何路径都是从一个节点到其与根之间的某个节点。这也是最佳选择,因为它仅查找和输出每个路径一次。 顺序与您的顺序略有不同,但是您始终可以创建一个路径列表数组,其中
A[x]
是长度为
x
的路径列表。然后,您可以按路径的长度顺序输出路径,尽管这会占用O(n)的存储空间。     
只是另一种方式: 树中没有重复的每条路径都由其开始和结束来唯一描述。 因此,枚举路径的一种方法是枚举每对可能的顶点。对于每一对,都比较容易找到路径(找到共同祖先并经过它)。     

要回复问题请先登录注册