算法1.从起始节点,以递归的方式逐渐查找子节点,记录走过的路径,直到走到尾节点后,生成的路径就是从起始节点到尾节点所有的可能路径。
算法适用于树的路径查找,从明确的起始点走到叶子节点,即树形结构;
def get_path_bfs(start_node,path=[]):
if start_node 不是叶子节点
for node in start_node.childrens:
get_path(node,path+[start_node,node])
else:
当前path存储从头结点到尾结点的所有路径
2.图结构中存在多个起始结点,查找所有起始结点到尾结点的路径
可以遍历每个结点,每个结点按算法1获取相应的路径,问题,结点重复遍历,影响性能;
采用深度优先算法,由尾结点逐渐向上遍历,生成从从起始结点到为结点的路径
nodes_dict={}
visited=[0 ]*(nodes.length)
def travel_dfs:
for i in range(nodes.length)
if visited[i]==0:
cur_path=[]
for node in nodes[i].childrens
child_node=dfs(node)
"""
保存数据格式的统一,如果node不是叶子节点返回的数据为[[(a,b),(c,d)],[(a,d)]],如果是也是结点返回为[],
当前路径为[(nodes[i],node)]
"""
if child_node:
cur_path.extend([[(nodes[i],node)]+d for d in child_node])
else:
cur_path.append([(nodes[i],node)])
visited[i]=1
nodes_dict[i]=cur_path
def dfs(node_i):
if node 是叶子节点
return []
if visited[node_i]==0:
cur_path = []
for node in nodes[node_i].childrens
child_node = dfs(node)
if child_node:
cur_path.extend([[(nodes[node_i], node)] + d for d in child_node])
else:
cur_path.append([(nodes[i], node)])
visited[node_i] = 1
nodes_dict[node_i] = cur_path
return cur_path
else:
return nodes_dict[node]