深度优先遍历dfs非递归
时间: 2023-12-07 12:04:27 浏览: 93
以下是深度优先遍历DFS的非递归实现方法,使用栈来代替递归调用:
```python
def dfs_non_recursive(graph, start):
visited = set() # 用集合来存储已经访问过的节点
stack = [start] # 用列表来模拟栈,将起始节点加入栈中
while stack:
vertex = stack.pop() # 取出栈顶元素
if vertex not in visited:
visited.add(vertex) # 将该节点标记为已访问
stack.extend(graph[vertex] - visited) # 将该节点的未访问邻居节点加入栈中
return visited
```
其中,graph是一个字典,表示图的邻接表,start是起始节点。
相关问题
图的深度优先遍历的非递归算法
图的深度优先遍历的非递归算法可以使用栈来实现。具体步骤如下:
1. 首先将起始节点压入栈中,并将其标记为已访问。
2. 当栈非空时,取出栈顶节点,并遍历其所有未访问的邻居节点。
3. 将每个未访问的邻居节点压入栈中,并将其标记为已访问。
4. 重复步骤2和3,直到栈为空。
下面是一个示例代码:
```
void dfs_non_recursive(int start, int n, vector<int> adj[]) {
bool visited[n];
memset(visited, false, sizeof(visited));
stack<int> s;
s.push(start);
visited[start] = true;
while (!s.empty()) {
int v = s.top();
s.pop();
cout << v << " ";
for (auto u : adj[v]) {
if (!visited[u]) {
visited[u] = true;
s.push(u);
}
}
}
}
```
其中,`start` 表示起始节点,`n` 表示节点总数,`adj` 是邻接表表示的图。`visited` 数组用于标记节点是否已经被访问过。在遍历过程中,每访问一个节点就将其标记为已访问,并将其邻居节点压入栈中。最终,栈中的节点就是按照深度优先遍历的顺序排列的。
给出图的深度优先遍历的非递归算法,并与广度优先遍历算法比较java实现
以下是深度优先遍历的非递归算法:
1. 创建一个空栈,将根节点入栈。
2. 循环执行以下步骤,直到栈为空:
a. 弹出栈顶节点,并访问该节点。
b. 将该节点的所有未访问的子节点按照从右到左的顺序入栈。
与广度优先遍历算法相比,深度优先遍历算法更容易实现,因为它只需要一个栈来实现。而广度优先遍历算法需要一个队列来实现。另外,深度优先遍历算法通常会更快地找到解决方案,因为它更加倾向于深入搜索,而广度优先遍历算法则会逐层扩展搜索。
以下是Java实现深度优先遍历的非递归算法:
```java
public void dfs(Node root) {
Stack<Node> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
Node node = stack.pop();
System.out.print(node.val + " ");
List<Node> children = node.children;
if (children != null && !children.isEmpty()) {
for (int i = children.size() - 1; i >= 0; i--) {
stack.push(children.get(i));
}
}
}
}
```
其中,`Node` 表示树节点,`val` 表示节点的值,`children` 表示节点的子节点列表。这个算法使用了一个栈来实现深度优先遍历,每次将节点的子节点按照从右到左的顺序入栈。
阅读全文