Skip to content

Commit ff52ec1

Browse files
committed
Update 01.Stack-DFS.md
1 parent c3e9c17 commit ff52ec1

File tree

1 file changed

+29
-15
lines changed

1 file changed

+29
-15
lines changed

Contents/03.Stack/02.Stack-DFS/01.Stack-DFS.md

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,28 +64,42 @@ def dfs_recursive(graph, start, visited):
6464
### 4.1 基于堆栈实现的深度优先搜索实现步骤
6565

6666
1. `start` 为开始节点。定义 `visited` 为标记访问节点的 set 集合变量。定义 `stack` 用于存放临时节点的栈结构。
67-
2. 首先将起始节点放入栈中,并标记访问。即 `visited = set(start)``stack = [start]`
68-
3. `stack` 中取出第一个节点 `node_u`
69-
4. 访问节点 `node_u`,并对节点进行相关操作(看具体题目要求)
67+
2. 首先访问起始节点,并对节点进行相关操作(看具体题目要求)
68+
3. 然后将起始节点放入栈中,并标记访问。即 `visited = set(start)``stack = [start]`
69+
4. 如果栈不为空,取 `stack` 栈顶元素 `node_u`
7070
5. 遍历与节点 `node_u` 相连并构成边的节点 `node_v`
71-
- 如果 `node_v` 没有被访问过,则将 `node_v` 节点放入栈中,并标记访问,即 `stack.append(node_v)``visited.add(node_v)`
72-
6. 重复步骤 3 ~ 5,直到 `stack` 为空。
71+
- 如果 `node_v` 没有被访问过,则:
72+
- 访问节点 `node_v`,并对节点进行相关操作(看具体题目要求)。
73+
-`node_v` 节点放入栈中,并标记访问,即 `stack.append(node_v)``visited.add(node_v)`
74+
- 跳出遍历 `node_v` 的循环。
75+
- 继续遍历 `node_v`
76+
6. 如果 `node_u` 相邻的节点都访问结束了,从栈顶弹出 `node_u`,即 `stack.pop()`
77+
7. 重复步骤 4 ~ 6,直到 `stack` 为空。
7378

7479
### 4.2 基于堆栈实现的深度优先搜索实现代码
7580

7681
```Python
7782
def dfs_stack(graph, start):
78-
visited = set(start)
79-
stack = [start]
80-
83+
print(start) # 访问节点 start
84+
visited = set(start) # 使用 visited 标记访问过的节点,先标记 start
85+
stack = [start] # 创建一个栈,并将 start 加入栈中
86+
8187
while stack:
82-
node_u = stack.pop()
83-
# 访问节点
84-
print(node_u)
85-
for node_v in graph[node_u]:
86-
if node_v not in visited:
87-
stack.append(node_v)
88-
visited.add(node_v)
88+
node_u = stack[-1] # 取栈顶元素
89+
90+
i = 0
91+
while i < len(graph[node_u]): # 遍历栈顶元素,遇到未访问节点,访问节点并跳出。
92+
node_v = graph[node_u][i]
93+
94+
if node_v not in visited: # node_v 未访问过
95+
print(node_v) # 访问节点 node_v
96+
stack.append(node_v) # 将 node_v 加入栈中
97+
visited.add(node_v) # 标记为访问过 node_v
98+
break
99+
i += 1
100+
101+
if i == len(graph[node_u]): # node_u 相邻的节点都访问结束了,弹出 node_u
102+
stack.pop()
89103
```
90104

91105
## 5. 深度优先搜索应用

0 commit comments

Comments
 (0)