我尝试过并尝试过;搜索和搜索,但无法找到解决我的问题的算法。我想枚举树中的所有路径(不仅仅是简单的路径)那些以叶子节点开始和结束的路径(虽然这是一个简单的约束)。
例如,对于树;
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等路径。
有没有什么方法可以指导我,也许是任何算法?
答案 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