枚举树中的所有路径

时间:2011-05-01 09:45:54

标签: algorithm tree enumeration depth-first-search breadth-first-search

我尝试过并尝试过;搜索和搜索,但无法找到解决我的问题的算法。我想枚举树中的所有路径(不仅仅是简单的路径)那些以叶子节点开始和结束的路径(虽然这是一个简单的约束)。

例如,对于树;

      1
    /   \ 
   2     3
  / \   / \
 4   5 6   7

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

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等路径。

有没有什么方法可以指导我,也许是任何算法?

2 个答案:

答案 0 :(得分:0)

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

在我看来,你只希望每次访问“一次”。因此,采用图形的“对偶”,将路径视为一系列边缘而不是一系列顶点。这样,边缘成为您的“顶点”,顶点变为“边缘”

这可以减少您生成图表的简单路径的问题,这是您已经知道该怎么做的问题。

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)

答案 1 :(得分:0)

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

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