@@ -64,28 +64,42 @@ def dfs_recursive(graph, start, visited):
64
64
### 4.1 基于堆栈实现的深度优先搜索实现步骤
65
65
66
66
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 ` 。
70
70
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 ` 为空。
73
78
74
79
### 4.2 基于堆栈实现的深度优先搜索实现代码
75
80
76
81
``` Python
77
82
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
+
81
87
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()
89
103
```
90
104
91
105
## 5. 深度优先搜索应用
0 commit comments