1. 深度优先
深度优先遍历的非递归算法
def dfs_nonrec(graph, v0): vnum = graph.vertex_num() visited = [0]*vnum visited[v0] = 1 st = [] # 作为堆栈使用 dfs_seq = [] st.append((0, graph.out_edges(v0))) while len(st) > 0: i, edges = st.pop() st.append((i+1, edges)) v, e = edges[i] if not visited[v]: dfs_seq.append(v) visited[v] = 1 st.append((0, graph.out_edges(v)))
堆栈中的元素形式为为 (i, edges),其中 edges 表示是某个顶点的出边表(比如 graph.out_edges(v0)),i 是目前访问的边表的下标,因为是深度优先,先访问 v0 的第一个出边,v0 的第一个出边能够达到的点全部遍历完毕之后,回过头来(回溯) v0 的第二个出边;