2
2
* @link Problem export functioninition [[docs/hackerrank/interview_preparation_kit/search/swap-nodes-algo.md]]
3
3
*/
4
4
5
- import { logger as console } from '../../../logger.js' ;
6
5
import { Node } from '../../lib/Node.js' ;
7
6
8
7
// CONSTANTS
@@ -11,137 +10,104 @@ export const __ROOT_VALUE__ = 1;
11
10
export const __LEAF_VALUE__ = - 1 ;
12
11
const __RADIX__ = 10 ;
13
12
14
- export function callbackCollectNodes ( root , collect , level ) {
15
- if ( root ) {
16
- if ( collect ?. [ level ] === undefined ) {
17
- // eslint-disable-next-line no-param-reassign
18
- collect [ level ] = [ root ] ;
19
- } else {
20
- collect [ level ] . push ( root ) ;
21
- }
22
- }
23
- }
13
+ export class Tree {
14
+ root ;
24
15
25
- export function traverseInOrderCollector ( root , collect , level , callbackFn ) {
26
- if ( root ?. left !== null ) {
27
- traverseInOrderCollector ( root ?. left , collect , level + 1 , callbackFn ) ;
28
- }
16
+ nodeCollector ;
29
17
30
- callbackFn ( root , collect , level ) ;
18
+ constructor ( indexes ) {
19
+ this . root = new Node ( __ROOT_VALUE__ ) ;
20
+ this . nodeCollector = { } ;
21
+ this . nodeCollector [ __INITIAL_LEVEL__ ] = [ this . root ] ;
31
22
32
- if ( root ?. right !== null ) {
33
- traverseInOrderCollector ( root ?. right , collect , level + 1 , callbackFn ) ;
23
+ this . buildTree ( indexes ) ;
34
24
}
35
25
36
- return collect ;
37
- }
26
+ buildTree ( indexes ) {
27
+ const indexesCopy = [ ...indexes ] ;
28
+ let currentLevel = __INITIAL_LEVEL__ ;
38
29
39
- export function buildTree ( indexes ) {
40
- const indexesCopy = [ ...indexes ] ;
41
- const root = new Node ( __ROOT_VALUE__ ) ;
42
- let currentLevel = 1 ;
43
- const nodeCollector = { } ;
44
- nodeCollector [ currentLevel ] = [ root ] ;
45
-
46
- while ( indexesCopy . length > 0 ) {
47
- nodeCollector = { } ;
48
-
49
- traverseInOrderCollector (
50
- root ,
51
- nodeCollector ,
52
- __INITIAL_LEVEL__ ,
53
- callbackCollectNodes
54
- ) ;
55
-
56
- const lastLevel = parseInt (
57
- Object . keys ( nodeCollector )
58
- . sort ( ( a , b ) => parseInt ( b , __RADIX__ ) - parseInt ( a , __RADIX__ ) )
59
- . shift ( ) ,
60
- __RADIX__
61
- ) ;
62
-
63
- const levelSize = Math . min (
64
- indexesCopy . length ,
65
- nodeCollector [ currentLevel ] ?. length
66
- ) ;
67
-
68
- const nextLevel = currentLevel + 1 ;
69
-
70
- if ( levelSize > 0 ) {
71
- nodeCollector [ nextLevel ] = [ ] ;
72
- }
30
+ while ( indexesCopy . length > 0 ) {
31
+ const levelSize = Math . min (
32
+ indexesCopy . length ,
33
+ this . nodeCollector [ currentLevel ] ?. length
34
+ ) ;
73
35
74
- for ( let i = 0 ; i < levelSize ; i ++ ) {
75
- const currentNode = nodeCollector [ currentLevel ] [ i ] ;
76
- const newElement = indexesCopy . shift ( ) ;
36
+ const nextLevel = currentLevel + 1 ;
77
37
78
- if ( ( newElement ?. [ 0 ] ?? __LEAF_VALUE__ ) !== __LEAF_VALUE__ ) {
79
- currentNode . left = new Node ( newElement [ 0 ] ) ;
80
- nodeCollector [ nextLevel ] . push ( currentNode . left ) ;
38
+ if ( levelSize > 0 ) {
39
+ this . nodeCollector [ nextLevel ] = [ ] ;
81
40
}
82
- if ( ( newElement ?. [ 1 ] ?? __LEAF_VALUE__ ) !== __LEAF_VALUE__ ) {
83
- currentNode . right = new Node ( newElement [ 1 ] ) ;
84
- nodeCollector [ nextLevel ] . push ( currentNode . right ) ;
41
+
42
+ for ( let i = 0 ; i < levelSize ; i ++ ) {
43
+ const currentNode = this . nodeCollector [ currentLevel ] [ i ] ;
44
+ const newElement = indexesCopy . shift ( ) ;
45
+
46
+ if ( ( newElement ?. [ 0 ] ?? __LEAF_VALUE__ ) !== __LEAF_VALUE__ ) {
47
+ currentNode . left = new Node ( newElement [ 0 ] ) ;
48
+ this . nodeCollector [ nextLevel ] . push ( currentNode . left ) ;
49
+ }
50
+ if ( ( newElement ?. [ 1 ] ?? __LEAF_VALUE__ ) !== __LEAF_VALUE__ ) {
51
+ currentNode . right = new Node ( newElement [ 1 ] ) ;
52
+ this . nodeCollector [ nextLevel ] . push ( currentNode . right ) ;
53
+ }
85
54
}
86
- }
87
55
88
- if ( nodeCollector [ nextLevel ] . length > 0 ) {
89
- currentLevel = nextLevel ;
56
+ if ( this . nodeCollector [ nextLevel ] . length > 0 ) {
57
+ currentLevel = nextLevel ;
58
+ }
90
59
}
60
+
61
+ return this ;
91
62
}
92
63
93
- return root ;
94
- }
64
+ getRoot ( ) {
65
+ return this . root ;
66
+ }
95
67
96
- export function flatTree ( root ) {
97
- const nodeCollector = [ ] ;
68
+ getCollector ( ) {
69
+ return this . nodeCollector ;
70
+ }
98
71
99
- function traverseInOrderFlat ( node ) {
100
- if ( node ?. left !== null ) {
101
- traverseInOrderFlat ( node ?. left ) ;
102
- }
72
+ flatTree ( ) {
73
+ const flatTreeCollector = [ ] ;
103
74
104
- if ( node ) {
105
- nodeCollector . push ( node ) ;
106
- }
75
+ function traverseInOrderFlat ( node ) {
76
+ if ( node ?. left !== null ) {
77
+ traverseInOrderFlat ( node ?. left ) ;
78
+ }
107
79
108
- if ( node ?. right !== null ) {
109
- traverseInOrderFlat ( node ?. right ) ;
80
+ if ( node ) {
81
+ flatTreeCollector . push ( node ) ;
82
+ }
83
+
84
+ if ( node ?. right !== null ) {
85
+ traverseInOrderFlat ( node ?. right ) ;
86
+ }
110
87
}
111
- }
112
88
113
- traverseInOrderFlat ( root ) ;
89
+ traverseInOrderFlat ( this . root ) ;
114
90
115
- const output = [ ] ;
116
- nodeCollector . forEach ( ( node ) => {
117
- output . push ( node . data ) ;
118
- } ) ;
91
+ const output = [ ] ;
92
+ flatTreeCollector . forEach ( ( node ) => {
93
+ output . push ( node . data ) ;
94
+ } ) ;
119
95
120
- return output ;
96
+ return output ;
97
+ }
121
98
}
122
99
123
100
export function swapNodes ( indexes , queries ) {
124
- const tree = buildTree ( indexes ) ;
101
+ const tree = new Tree ( indexes ) ;
102
+ let nodeCollector = tree . getCollector ( ) ;
125
103
const output = [ ] ;
126
- let nodeCollector = { } ;
127
-
128
- traverseInOrderCollector (
129
- tree ,
130
- nodeCollector ,
131
- __INITIAL_LEVEL__ ,
132
- callbackCollectNodes
133
- ) ;
134
104
135
105
nodeCollector = Object . fromEntries (
136
106
Object . entries ( nodeCollector ) . sort (
137
107
( [ a ] , [ b ] ) => parseInt ( a , __RADIX__ ) - parseInt ( b , __RADIX__ )
138
108
)
139
109
) ;
140
110
141
- let flattenedTree = flatTree ( tree ) ;
142
-
143
- console . debug ( `Plain tree: ${ flattenedTree } ` ) ;
144
-
145
111
for ( const query of queries ) {
146
112
for ( const [ level , nodeList ] of Object . entries ( nodeCollector ) ) {
147
113
const tLevel = parseInt ( level , __RADIX__ ) ;
@@ -154,8 +120,7 @@ export function swapNodes(indexes, queries) {
154
120
}
155
121
}
156
122
157
- flattenedTree = flatTree ( tree ) ;
158
- output . push ( flattenedTree ) ;
123
+ output . push ( tree . flatTree ( ) ) ;
159
124
}
160
125
161
126
return output ;
0 commit comments