图的深度优先遍历非递归算法实现 - 邻接表存储结构
图的深度优先遍历非递归算法实现 - 邻接表存储结构
本文将详细介绍如何利用邻接表作为图的存储结构,设计一个非递归算法实现从指定顶点出发对图进行深度优先遍历。
算法步骤:
- 创建一个栈,并将起始节点
v入栈。 - 创建一个数组
visited,用于记录每个节点是否被访问过,将v对应的visited[v]置为true。 - 当栈不为空时,执行以下步骤:
- 取出栈顶元素
top。 - 对于
top的每个邻接点,如果该邻接点未被访问过,则将其入栈,并将visited数组对应位置置为true。
- 取出栈顶元素
- 遍历结束。
实现代码:
void DFS_iterative(Graph g, int v) {
int* visited = (int*)malloc(g.num_vertices * sizeof(int));
for (int i = 0; i < g.num_vertices; i++) {
visited[i] = 0;
}
Stack s = create_stack();
push(s, v);
visited[v] = 1;
while (!is_empty(s)) {
int top = pop(s);
printf("%d ", top);
for (int i = 0; i < g.adj_list[top].size(); i++) {
int neighbor = g.adj_list[top][i];
if (!visited[neighbor]) {
push(s, neighbor);
visited[neighbor] = 1;
}
}
}
}
代码解释:
DFS_iterative函数接收图g和起始节点v作为参数,并返回遍历结果。visited数组用于记录每个节点是否已经被访问过,初始值为0,表示未访问过,当访问过该节点时,将对应的visited数组元素置为1。- 使用
Stack数据结构来模拟递归过程,将当前节点的邻接点入栈,并按栈的先进后出的顺序进行访问。 - 当栈不为空时,从栈顶弹出元素,打印其值,并检查该节点的邻接点是否被访问过,若未被访问过,则将其入栈。
总结:
本文详细介绍了使用邻接表存储结构的图,如何实现从指定顶点出发进行深度优先遍历的非递归算法。通过栈和访问标记数组,该算法能够有效地遍历图的所有可达节点。
原文地址: https://www.cveoy.top/t/topic/nF9v 著作权归作者所有。请勿转载和采集!