47
47
48
48
### 思路 1:深度优先搜索
49
49
50
- 1 . 使用哈希表 ` visitedDict ` 来存储原图中被访问过的节点和克隆图中对应节点,键值对为 原图被访问过的节点:克隆图中对应节点。
50
+ 1 . 使用哈希表 ` visited ` 来存储原图中被访问过的节点和克隆图中对应节点,键值对为 原图被访问过的节点:克隆图中对应节点。
51
51
2 . 从给定节点开始,以深度优先搜索的方式遍历原图。
52
52
1 . 如果当前节点被访问过,则返回隆图中对应节点。
53
53
2 . 如果当前节点没有被访问过,则创建一个新的节点,并保存在哈希表中。
@@ -61,14 +61,14 @@ class Solution:
61
61
def cloneGraph (self , node : ' Node' ) -> ' Node' :
62
62
if not node:
63
63
return node
64
- visitedDict = dict ()
64
+ visited = dict ()
65
65
66
66
def dfs (node : ' Node' ) -> ' Node' :
67
- if node in visitedDict :
68
- return visitedDict [node]
67
+ if node in visited :
68
+ return visited [node]
69
69
70
70
clone_node = Node(node.val, [])
71
- visitedDict [node] = clone_node
71
+ visited [node] = clone_node
72
72
for neighbor in node.neighbors:
73
73
clone_node.neighbors.append(dfs(neighbor))
74
74
return clone_node
@@ -81,3 +81,44 @@ class Solution:
81
81
- ** 时间复杂度** :$O(n)$。其中 $n$ 为图中节点数量。
82
82
- ** 空间复杂度** :$O(n)$。
83
83
84
+ ### 思路 2:广度优先搜索
85
+
86
+ 1 . 使用哈希表 ` visited ` 来存储原图中被访问过的节点和克隆图中对应节点,键值对为 原图被访问过的节点:克隆图中对应节点。使用队列` queue ` 存放节点。
87
+ 2 . 根据起始节点,创建一个新的节点,并将其添加到哈希表 ` visited ` 中,即 ` visited[node] = Node(node.val, []) ` 。然后将起始节点放入队列 ` queue ` 中,即 ` queue.append(node) ` 。
88
+ 3 . 从队列中取出第一个节点 ` node_u ` 。访问节点 ` node_u ` 。
89
+ 4 . 遍历与节点 ` node_u ` 相连并构成边的节点 ` node_v ` 。
90
+ 1 . 如果 ` node_v ` 没有被访问过(即 ` node_v ` 不在 ` visited ` 中):
91
+ 1 . 则根据 ` node_v ` 创建一个新的节点,并将其添加到哈希表 ` visited ` 中,即 ` visited[node_v] = Node(node_v.val, []) ` 。
92
+ 2 . 然后将 ` node_v ` 节点放入队列 ` queue ` 中,即 ` queue.append(node_v) ` 。
93
+ 5 . 重复步骤 3 ~ 4,直到队列 ` queue ` 为空。
94
+ 6 . 广度优先搜索结束,返回起始节点的克隆节点(即 ` visited[node] ` )。
95
+
96
+ ### 思路 2:代码
97
+
98
+ ``` Python
99
+ class Solution :
100
+ def cloneGraph (self , node : ' Node' ) -> ' Node' :
101
+ if not node:
102
+ return node
103
+
104
+ visited = dict ()
105
+ queue = collections.deque()
106
+
107
+ visited[node] = Node(node.val, [])
108
+ queue.append(node)
109
+
110
+ while queue:
111
+ node_u = queue.popleft()
112
+ for node_v in node_u.neighbors:
113
+ if node_v not in visited:
114
+ visited[node_v] = Node(node_v.val, [])
115
+ queue.append(node_v)
116
+ visited[node_u].neighbors.append(visited[node_v])
117
+
118
+ return visited[node]
119
+ ```
120
+
121
+ ### 思路 2:复杂度分析
122
+
123
+ - ** 时间复杂度** :$O(n)$。其中 $n$ 为图中节点数量。
124
+ - ** 空间复杂度** :$O(n)$。
0 commit comments