Python 多路树与结构

Python 多路树与结构,python,data-structures,multiway-tree,Python,Data Structures,Multiway Tree,我有一个应用数学的问题,它几乎可以完美地映射为在多路树中找到最长的路径 我有一个函数child(),它提供子节点(空间中满足条件的点)。唯一需要注意的是,child()需要连接到它的所有以前的节点,包括根节点。在这里,我正努力递归地编写代码。到目前为止,我有下面这样的东西 def multitree(node): tmp_list = child(node) for child2 in tmp_list: if len(child(child2)))==

我有一个应用数学的问题,它几乎可以完美地映射为在多路树中找到最长的路径

我有一个函数child(),它提供子节点(空间中满足条件的点)。唯一需要注意的是,child()需要连接到它的所有以前的节点,包括根节点。在这里,我正努力递归地编写代码。到目前为止,我有下面这样的东西

def multitree(node):
     tmp_list = child(node)
     for child2 in tmp_list:
           if len(child(child2)))==0:       #if you hit a leaf (dead end), go to next element
                 continue
           else:
                 multitree(child2)
但在这一点上,我不确定该返回什么。我基本上想要绘制整个多路树,直到我找到一片叶子为止。有什么想法或建议吗?谢谢各位

编辑:

更新1:为了完整起见,我大致了解了input child()需要什么:基本上,要找到由箭头标记的节点的子节点,child()需要根节点和节点本身之间的节点列表,即用红点标记的节点

更新2:

我已经编写了如下的子节点(node),我目前正在处理它--


你可以这样做来获得最长的路径。在这里,它为您提供了一个节点列表,您可以从中提取任何相关信息:

def longest_path(node):
    children = child(node)

    if not children: # leaf node
        return [node]

    children_vals = [longest_path(c) for c in children]
    longest = max(children_vals, key=len)
    return [node] + longest
不处理领带,或者随意选择一个选项


(注意:半测试)

我想我已经找到了问题所在。因为我想保留一个所有节点的运行列表,您可以找到其子节点(您可以跟踪您行走的路径,请参见imgur图片)。我通过添加

children_vals = [longest_path(node+[c]) for c in children]

通过这种方式,可以递归地将每个父级与其子级连接起来

你只是想找到最长的路径,还是获取所有路径并从中找到最长的路径?有没有理由不使用标准的深度优先搜索或广度优先搜索返回树中的所有路径,然后只
max(path,key=len)
?顺便说一句:我发现使用简单的堆栈或队列与递归来进行这些搜索更简单。如果运行时没有明显不同,我希望看到除最长路径之外的所有路径。在上述情况下,我将如何实现DFS或BFS?我所看到的每一个DFS或BFS的例子都是已经“映射”的树。在这种情况下,我只能递归地找到子节点,直到找到一个叶子。我还有一个警告,child()不仅要接受节点的输入,还要接受它和根节点之间的所有节点的输入。在有向无环图中寻找最长路径有一个线性时间解决方案(你的似乎是)。但是,在一个有向无环图中生成所有路径是一个不同的问题,而且可能需要花费更多的时间。请看一个小建议:
如果不是儿童
被认为比
如果len(children)=0
更像蟒蛇。我实际上得到了一个“cmp中超过最大再融合深度”的错误。有什么想法吗?这意味着最大长度比最大递归深度长。你用的树有多大?如果它们非常大,您可能需要尝试类似这样的方法。在my child()例程中发现一个错误。相应地进行了更新,并重新提交了作业。我会让你知道结果的。根节点本身有170个子节点。并且它后面的每个节点都有越来越少的错误。这次根节点只有18个子节点。
children_vals = [longest_path(node+[c]) for c in children]