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