1
+ /**
2
+ * https://leetcode.com/problems/clone-graph
3
+ * T.C. O(N)
4
+ * S.C. O(N)
5
+ */
6
+ function cloneGraph ( node : _Node | null ) : _Node | null {
7
+ if ( ! node ) return null ;
8
+
9
+ const map = new Map < number , _Node > ( ) ;
10
+ return dfs ( node ) ;
11
+
12
+ function dfs ( node : _Node ) : _Node {
13
+ if ( map . has ( node . val ) ) return map . get ( node . val ) ! ;
14
+
15
+ const newNode = new _Node ( node . val ) ;
16
+ map . set ( node . val , newNode ) ;
17
+
18
+ for ( let neighbor of node . neighbors ) {
19
+ newNode . neighbors . push ( dfs ( neighbor ) ) ;
20
+ }
21
+
22
+ return newNode ;
23
+ }
24
+ }
25
+
26
+ /**
27
+ * T.C. O(N)
28
+ * S.C. O(N)
29
+ */
30
+ function cloneGraph ( node : _Node | null ) : _Node | null {
31
+ if ( ! node ) return null ;
32
+
33
+ const map = new Map < number , _Node > ( ) ;
34
+ const stack = [ node ] ;
35
+ const newNode = new _Node ( node . val ) ;
36
+ map . set ( node . val , newNode ) ;
37
+
38
+ while ( stack . length ) {
39
+ const node = stack . pop ( ) ! ;
40
+ const newNode = map . get ( node . val ) ! ;
41
+
42
+ for ( let neighbor of node . neighbors ) {
43
+ if ( ! map . has ( neighbor . val ) ) {
44
+ stack . push ( neighbor ) ;
45
+ const newNeighbor = new _Node ( neighbor . val ) ;
46
+ map . set ( neighbor . val , newNeighbor ) ;
47
+ }
48
+ newNode . neighbors . push ( map . get ( neighbor . val ) ! ) ;
49
+ }
50
+ }
51
+
52
+ return newNode ;
53
+ }
54
+
55
+ class _Node {
56
+ val : number ;
57
+ neighbors : _Node [ ] ;
58
+
59
+ constructor ( val ?: number , neighbors ?: _Node [ ] ) {
60
+ this . val = val === undefined ? 0 : val ;
61
+ this . neighbors = neighbors === undefined ? [ ] : neighbors ;
62
+ }
63
+ }
0 commit comments