1- # Approach 2 - Breadth First Search
1+ # Approach 1: Depth First Search
22
3- # Time: O(N + M), N = no. of nodes, M = no. of edges
4- # Space: O(N)
3+ # n = no. of nodes, m = no. of edges
4+ # Time: O(n + m)
5+ # Space: O(n)
56
67"""
78# Definition for a Node.
@@ -11,28 +12,24 @@ def __init__(self, val = 0, neighbors = None):
1112 self.neighbors = neighbors if neighbors is not None else []
1213"""
1314
14- from collections import deque
15-
15+ from typing import Optional
1616class Solution :
17- def cloneGraph (self , node : 'Node' ) -> 'Node' :
17+ def __init__ (self ):
18+ self .visited = {} # {node: clone_node}
19+
20+ def cloneGraph (self , node : Optional ['Node' ]) -> Optional ['Node' ]:
1821 if not node :
1922 return node
20-
21- visited = {} # node: clone
22-
23- queue = deque ([node ])
24-
25- visited [node ] = Node (node .val , [])
26-
27- while queue :
28- n = queue .popleft ()
29-
30- for neighbor in n .neighbors :
31- if neighbor not in visited :
32- visited [neighbor ] = Node (neighbor .val , [])
33- queue .append (neighbor )
34-
35- visited [n ].neighbors .append (visited [neighbor ])
36-
37- return visited [node ]
23+
24+ if node in self .visited :
25+ return self .visited [node ]
26+
27+ clone_node = Node (node .val , [])
28+
29+ self .visited [node ] = clone_node
30+
31+ if node .neighbors :
32+ clone_node .neighbors = [self .cloneGraph (n ) for n in node .neighbors ]
33+
34+ return clone_node
3835
0 commit comments