首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举树中的所有路径

枚举树中的所有路径
EN

Stack Overflow用户
提问于 2011-05-01 17:45:54
回答 2查看 2.2K关注 0票数 1

我试了又试;找了又找,但没有真正找到一个算法来解决我的问题。我想枚举树中的所有路径,(不仅仅是简单的路径)那些以叶节点开始和结束的路径(虽然这是一个简单的约束)。

例如,对于一棵树;

代码语言:javascript
复制
      1
    /   \ 
   2     3
  / \   / \
 4   5 6   7

我希望能够生成以下路径:

代码语言:javascript
复制
4
4-2-5
4-2-5-2-1-3-6
4-2-5-2-1-3-7
4-2-5-2-1-3-6-3-7
4-2-1-3-6
4-2-1-3-7
4-2-1-3-6-3-7
5
5-2-1-3-6
5-2-1-3-7
5-2-1-3-6-3-7
6
6-3-7
7

我想这就是全部。

我已经尝试了以下解决方案Complexity of finding all simple paths using depth first search?。但是,这只能找到简单的路径,因此找不到4-2-5-2-1-3-6这样的路径。

你有没有任何方法可以指导我,或者任何算法?

EN

回答 2

Stack Overflow用户

发布于 2011-05-01 23:32:08

像4-2-1-2-5这样的路径算数吗?如果是这样的话,我想我有答案了:

在我看来,你只想让每条边被访问“一次”。因此,以图的“对偶”为例,将路径视为边的序列,而不是顶点的序列。这样,顶点边就变成了你的“顶点”,而顶点变成了“边”。

这应该会将您的问题减少到生成简单的图路径,这是一个您已经知道如何做的问题。

代码语言:javascript
复制
traverse(path, edg):
    mark edg as visited
    print path
    for each edge (e2) sharing a vertex with edg:
        traverse(e2, path+e2)

(with some sort of precaution to avoid duplicate paths being printed)
票数 0
EN

Stack Overflow用户

发布于 2011-05-02 03:34:13

如果你的树是二叉树,这里有一个相当简单的递归算法。在Python中:

代码语言:javascript
复制
def lchild(u):
    return 2 * u

def rchild(u):
    return 2 * u + 1

def paths(u, depth):
    if depth <= 0:
        yield ((), (u,), ())
    else:
        for ldown, lpath, lup in paths(lchild(u), depth - 1):
            yield ((u,) + ldown, lpath, lup + (u,))
        for ldown, lpath, lup in paths(lchild(u), depth - 1):
            for rdown, rpath, rup in paths(rchild(u), depth - 1):
                yield ((u,) + ldown, lpath + lup + (u,) + rdown + rpath, rup + (u,))
        for rdown, rpath, rup in paths(rchild(u), depth - 1):
            yield ((u,) + rdown, rpath, rup + (u,))

if __name__ == '__main__':
    for down, path, up in paths(1, 2):
        print path
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5847654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档