c++ 深度遍历 非递归
时间: 2024-01-13 17:01:40 浏览: 98
深度遍历(Depth First Search,DFS)是一种图搜索算法,它从一个起始点开始,尽可能深地搜索图的分支直到无法继续扩展,然后回溯到上一个节点,继续搜索其他未被访问的分支。传统的DFS算法通常使用递归来实现,但是我们也可以使用非递归的方式来实现DFS。
非递归的DFS算法使用栈数据结构来保存待访问的节点。具体步骤如下:
1. 创建一个栈,并将起始点入栈。
2. 当栈不为空时,执行以下步骤:
- 取出栈顶节点作为当前节点。
- 如果当前节点未被访问过,将其标记为已访问,并处理当前节点的相关操作。
- 将当前节点的未访问的邻居节点入栈。
3. 重复步骤2直到栈为空。
非递归的DFS算法与递归的DFS算法思想一致,只是在实现上使用了栈来模拟递归调用的过程。通过使用栈的先入后出特性,实现了循环的方式进行深度遍历。
非递归的DFS算法可以避免递归调用带来的函数调用开销,同时也可以避免递归调用所带来的栈溢出问题。在实际应用中,非递归的DFS算法更加高效,尤其当图的深度较大时。
需要注意的是,在非递归的DFS算法中,我们需要额外使用一个数据结构来记录节点的访问状态,以避免重复访问已经访问过的节点。常用的数据结构有hash表或者布尔数组等。
相关问题
图的深度优先遍历非递归c++
深度优先遍历(DFS)是一种非常常见的图遍历算法,可以通过递归或非递归方式实现。下面是一个非递归实现的C++代码示例:
```c++
void DFS_iterative(int start, vector<int> adj[], vector<bool>& visited) {
// 创建一个栈来存储待访问的节点
stack<int> s;
// 将起始点压入栈中
s.push(start);
while (!s.empty()) {
// 弹出栈顶元素
int cur = s.top();
s.pop();
// 如果该节点没有被访问过,则访问该节点
if (!visited[cur]) {
cout << cur << " ";
visited[cur] = true;
}
// 将所有未被访问过的邻居压入栈中
for (int neighbor : adj[cur]) {
if (!visited[neighbor]) {
s.push(neighbor);
}
}
}
}
```
在上面的代码中,我们使用了一个栈来存储待访问的节点。开始时,我们将起始节点压入栈中。然后,重复以下步骤,直到栈为空:
1. 弹出栈顶元素。
2. 如果该节点没有被访问过,则访问该节点,并将其标记为已访问。
3. 将所有未被访问过的邻居节点压入栈中。
这样,我们就可以按照深度优先的顺序遍历整个图了。
对图的深度优先遍历非递归c++
深度优先遍历(DFS)是一种遍历图的方法,可以使用递归或非递归的方式实现。下面是一个非递归的深度优先遍历的c++实现:
```c++
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
void dfs(vector<vector<int>>& graph, int start) {
stack<int> s;
vector<bool> visited(graph.size(), false);
s.push(start);
visited[start] = true;
while (!s.empty()) {
int node = s.top();
s.pop();
cout << node << " ";
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
s.push(neighbor);
visited[neighbor] = true;
}
}
}
}
int main() {
// 构造一个图
vector<vector<int>> graph = {{1, 2}, {0, 2, 3}, {0, 1, 3}, {1, 2}};
dfs(graph, 0); // 从节点0开始深度优先遍历
return 0;
}
```
该代码使用了一个栈和一个布尔数组来实现非递归的深度优先遍历。首先将起始节点放入栈中,并将其标记为已访问。然后,当栈不为空时,从栈中取出一个节点并输出它,然后将其未访问的邻居节点放入栈中,并将其标记为已访问。重复此过程,直到栈为空。
阅读全文