data-structure-typed 1.50.6 → 1.50.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -18
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +155 -155
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/binary-tree.js +13 -9
  10. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/bst.js +17 -17
  12. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +2 -8
  14. package/dist/cjs/data-structures/binary-tree/rb-tree.js +7 -16
  15. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  16. package/dist/cjs/types/common.d.ts +6 -0
  17. package/dist/cjs/types/common.js +8 -1
  18. package/dist/cjs/types/common.js.map +1 -1
  19. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
  20. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
  21. package/dist/mjs/data-structures/binary-tree/binary-tree.js +13 -9
  22. package/dist/mjs/data-structures/binary-tree/bst.js +17 -17
  23. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +2 -8
  24. package/dist/mjs/data-structures/binary-tree/rb-tree.js +8 -17
  25. package/dist/mjs/types/common.d.ts +6 -0
  26. package/dist/mjs/types/common.js +7 -0
  27. package/dist/umd/data-structure-typed.js +48 -42
  28. package/dist/umd/data-structure-typed.min.js +2 -2
  29. package/dist/umd/data-structure-typed.min.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +5 -1
  32. package/src/data-structures/binary-tree/avl-tree.ts +1 -1
  33. package/src/data-structures/binary-tree/binary-tree.ts +12 -10
  34. package/src/data-structures/binary-tree/bst.ts +18 -18
  35. package/src/data-structures/binary-tree/rb-tree.ts +11 -22
  36. package/src/types/common.ts +7 -0
  37. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +4 -1
  38. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +266 -266
  39. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +247 -235
@@ -8,136 +8,136 @@ const isDebug = isDebugTest;
8
8
  // const isDebug = true;
9
9
 
10
10
  describe('RedBlackTree 1', () => {
11
- let tree: RedBlackTree<number>;
11
+ let rbTree: RedBlackTree<number>;
12
12
 
13
13
  beforeEach(() => {
14
- tree = new RedBlackTree<number>();
14
+ rbTree = new RedBlackTree<number>();
15
15
  });
16
16
 
17
17
  describe('add and getNode', () => {
18
- it('should add and find a node in the tree', () => {
19
- tree.add(10);
20
- tree.add(20);
21
- tree.add(5);
22
-
23
- expect(tree.getNode(10)).toBeInstanceOf(RedBlackTreeNode);
24
- expect(tree.getNode(20)).toBeInstanceOf(RedBlackTreeNode);
25
- expect(tree.getNode(5)).toBeInstanceOf(RedBlackTreeNode);
26
- expect(tree.getNode(15)).toBe(undefined);
18
+ it('should add and find a node in the rbTree', () => {
19
+ rbTree.add(10);
20
+ rbTree.add(20);
21
+ rbTree.add(5);
22
+
23
+ expect(rbTree.getNode(10)).toBeInstanceOf(RedBlackTreeNode);
24
+ expect(rbTree.getNode(20)).toBeInstanceOf(RedBlackTreeNode);
25
+ expect(rbTree.getNode(5)).toBeInstanceOf(RedBlackTreeNode);
26
+ expect(rbTree.getNode(15)).toBe(undefined);
27
27
  });
28
28
 
29
29
  it('should add and find nodes with negative keys', () => {
30
- tree.add(-10);
31
- tree.add(-20);
30
+ rbTree.add(-10);
31
+ rbTree.add(-20);
32
32
 
33
- expect(tree.getNode(-10)).toBeInstanceOf(RedBlackTreeNode);
34
- expect(tree.getNode(-20)).toBeInstanceOf(RedBlackTreeNode);
33
+ expect(rbTree.getNode(-10)).toBeInstanceOf(RedBlackTreeNode);
34
+ expect(rbTree.getNode(-20)).toBeInstanceOf(RedBlackTreeNode);
35
35
  });
36
36
  });
37
37
 
38
38
  describe('deleteNode', () => {
39
- it('should delete a node from the tree', () => {
40
- tree.add(10);
41
- tree.add(20);
42
- tree.add(5);
43
- tree.delete(20);
39
+ it('should delete a node from the rbTree', () => {
40
+ rbTree.add(10);
41
+ rbTree.add(20);
42
+ rbTree.add(5);
43
+ rbTree.delete(20);
44
44
 
45
- expect(tree.getNode(20)).toBe(undefined);
45
+ expect(rbTree.getNode(20)).toBe(undefined);
46
46
  });
47
47
 
48
48
  it('should handle deleting a non-existent node', () => {
49
- tree.add(10);
50
- tree.add(20);
51
- tree.add(5);
52
- tree.delete(15);
49
+ rbTree.add(10);
50
+ rbTree.add(20);
51
+ rbTree.add(5);
52
+ rbTree.delete(15);
53
53
 
54
- expect(tree.getNode(15)).toBe(undefined);
54
+ expect(rbTree.getNode(15)).toBe(undefined);
55
55
  });
56
56
  });
57
57
 
58
58
  describe('minimum', () => {
59
- it('should find the minimum node in the tree', () => {
60
- tree.add(10);
61
- tree.add(20);
62
- tree.add(5);
63
- tree.add(15);
64
- tree.add(3);
65
-
66
- const minNode = tree.getLeftMost(tree.root);
59
+ it('should find the minimum node in the rbTree', () => {
60
+ rbTree.add(10);
61
+ rbTree.add(20);
62
+ rbTree.add(5);
63
+ rbTree.add(15);
64
+ rbTree.add(3);
65
+
66
+ const minNode = rbTree.getLeftMost(rbTree.root);
67
67
  expect(minNode?.key).toBe(3);
68
68
  });
69
69
 
70
- it('should handle an empty tree', () => {
71
- const minNode = tree.getLeftMost(tree.root);
72
- expect(minNode).toBe(tree.SENTINEL);
70
+ it('should handle an empty rbTree', () => {
71
+ const minNode = rbTree.getLeftMost(rbTree.root);
72
+ expect(minNode).toBe(rbTree.SENTINEL);
73
73
  });
74
74
  });
75
75
 
76
76
  describe('getRightMost', () => {
77
- it('should find the getRightMost node in the tree', () => {
78
- tree.add(10);
79
- tree.add(20);
80
- tree.add(5);
81
- tree.add(15);
82
- tree.add(25);
83
-
84
- const maxNode = tree.getRightMost(tree.root);
77
+ it('should find the getRightMost node in the rbTree', () => {
78
+ rbTree.add(10);
79
+ rbTree.add(20);
80
+ rbTree.add(5);
81
+ rbTree.add(15);
82
+ rbTree.add(25);
83
+
84
+ const maxNode = rbTree.getRightMost(rbTree.root);
85
85
  expect(maxNode?.key).toBe(25);
86
86
  });
87
87
 
88
- it('should handle an empty tree', () => {
89
- const maxNode = tree.getRightMost(tree.root);
90
- expect(maxNode).toBe(tree.SENTINEL);
88
+ it('should handle an empty rbTree', () => {
89
+ const maxNode = rbTree.getRightMost(rbTree.root);
90
+ expect(maxNode).toBe(rbTree.SENTINEL);
91
91
  });
92
92
  });
93
93
 
94
94
  describe('getSuccessor', () => {
95
95
  it('should find the getSuccessor of a node', () => {
96
- tree.add(10);
97
- tree.add(20);
98
- tree.add(5);
99
- tree.add(15);
100
- tree.add(25);
96
+ rbTree.add(10);
97
+ rbTree.add(20);
98
+ rbTree.add(5);
99
+ rbTree.add(15);
100
+ rbTree.add(25);
101
101
 
102
- const node = tree.getNode(15);
103
- const successorNode = tree.getSuccessor(node!);
102
+ const node = rbTree.getNode(15);
103
+ const successorNode = rbTree.getSuccessor(node!);
104
104
 
105
105
  expect(successorNode?.key).toBe(20);
106
106
  });
107
107
 
108
108
  it('should handle a node with no getSuccessor', () => {
109
- tree.add(10);
110
- tree.add(5);
109
+ rbTree.add(10);
110
+ rbTree.add(5);
111
111
 
112
- const node = tree.getNode(10);
113
- const successorNode = tree.getSuccessor(node!);
114
- // TODO not sure if it should be undefined or tree.SENTINEL
112
+ const node = rbTree.getNode(10);
113
+ const successorNode = rbTree.getSuccessor(node!);
114
+ // TODO not sure if it should be undefined or rbTree.SENTINEL
115
115
  expect(successorNode).toBe(undefined);
116
116
  });
117
117
  });
118
118
 
119
119
  describe('getPredecessor', () => {
120
120
  it('should find the getPredecessor of a node', () => {
121
- tree.add(10);
122
- tree.add(20);
123
- tree.add(5);
124
- tree.add(15);
125
- tree.add(25);
121
+ rbTree.add(10);
122
+ rbTree.add(20);
123
+ rbTree.add(5);
124
+ rbTree.add(15);
125
+ rbTree.add(25);
126
126
 
127
- const node = tree.getNode(20);
128
- const predecessorNode = tree.getPredecessor(node!);
127
+ const node = rbTree.getNode(20);
128
+ const predecessorNode = rbTree.getPredecessor(node!);
129
129
 
130
130
  expect(predecessorNode?.key).toBe(15);
131
131
  });
132
132
 
133
133
  it('should handle a node with no getPredecessor', () => {
134
- tree.add(10);
135
- tree.add(20);
134
+ rbTree.add(10);
135
+ rbTree.add(20);
136
136
 
137
- const node = tree.getNode(20);
138
- const predecessorNode = tree.getPredecessor(node!);
139
- // TODO not sure if it should be tree.SENTINEL or something else.
140
- expect(predecessorNode).toBe(tree.getNode(20));
137
+ const node = rbTree.getNode(20);
138
+ const predecessorNode = rbTree.getPredecessor(node!);
139
+ // TODO not sure if it should be rbTree.SENTINEL or something else.
140
+ expect(predecessorNode).toBe(rbTree.getNode(20));
141
141
  });
142
142
  });
143
143
 
@@ -180,83 +180,83 @@ describe('RedBlackTree 1', () => {
180
180
  });
181
181
 
182
182
  describe('RedBlackTree 2', () => {
183
- let tree: RedBlackTree<number>;
183
+ let rbTree: RedBlackTree<number>;
184
184
 
185
185
  beforeEach(() => {
186
- tree = new RedBlackTree<number>();
186
+ rbTree = new RedBlackTree<number>();
187
187
  });
188
188
 
189
- it('should add nodes into the tree', () => {
190
- tree.add(10);
191
- expect(tree.getNode(10)).toBeDefined();
192
- tree.add(20);
193
- expect(tree.getNode(20)).toBeDefined();
194
- tree.add(5);
195
- expect(tree.getNode(5)).toBeDefined();
189
+ it('should add nodes into the rbTree', () => {
190
+ rbTree.add(10);
191
+ expect(rbTree.getNode(10)).toBeDefined();
192
+ rbTree.add(20);
193
+ expect(rbTree.getNode(20)).toBeDefined();
194
+ rbTree.add(5);
195
+ expect(rbTree.getNode(5)).toBeDefined();
196
196
  });
197
197
 
198
- it('should delete nodes from the tree', () => {
199
- tree.add(10);
200
- tree.add(20);
201
- tree.add(5);
202
- tree.delete(20);
203
- expect(tree.getNode(20)).toBe(undefined);
198
+ it('should delete nodes from the rbTree', () => {
199
+ rbTree.add(10);
200
+ rbTree.add(20);
201
+ rbTree.add(5);
202
+ rbTree.delete(20);
203
+ expect(rbTree.getNode(20)).toBe(undefined);
204
204
  });
205
205
 
206
206
  it('should get the successor of a node', () => {
207
- tree.add(10);
208
- tree.add(20);
209
- const node = tree.getNode(10);
210
- const successor = tree.getSuccessor(node!);
207
+ rbTree.add(10);
208
+ rbTree.add(20);
209
+ const node = rbTree.getNode(10);
210
+ const successor = rbTree.getSuccessor(node!);
211
211
  expect(successor?.key).toBe(20);
212
212
  });
213
213
 
214
214
  it('should get the predecessor of a node', () => {
215
- tree.add(10);
216
- tree.add(20);
217
- const node = tree.getNode(20);
218
- const predecessor = tree.getPredecessor(node!);
215
+ rbTree.add(10);
216
+ rbTree.add(20);
217
+ const node = rbTree.getNode(20);
218
+ const predecessor = rbTree.getPredecessor(node!);
219
219
  expect(predecessor?.key).toBe(20);
220
220
  });
221
221
 
222
222
  it('should rotate nodes to the left', () => {
223
- tree.add(10);
224
- tree.add(20);
225
- tree.add(5);
226
- const node = tree.getNode(10);
227
- tree.add(15);
223
+ rbTree.add(10);
224
+ rbTree.add(20);
225
+ rbTree.add(5);
226
+ const node = rbTree.getNode(10);
227
+ rbTree.add(15);
228
228
  // Verify that rotation has occurred
229
229
  expect(node?.left?.key).toBe(5);
230
230
  expect(node?.right?.key).toBe(20);
231
231
  });
232
232
 
233
233
  it('should rotate nodes to the right', () => {
234
- tree.add(10);
235
- tree.add(20);
236
- tree.add(5);
237
- const node = tree.getNode(20);
238
- tree.add(25);
234
+ rbTree.add(10);
235
+ rbTree.add(20);
236
+ rbTree.add(5);
237
+ const node = rbTree.getNode(20);
238
+ rbTree.add(25);
239
239
  // Verify that rotation has occurred
240
240
  expect(node?.left?.key).toBeNaN();
241
241
  expect(node?.right?.key).toBe(25);
242
242
  });
243
243
 
244
- it('should all node attributes fully conform to the red-black tree standards.', () => {
245
- tree.add(10);
246
- tree.add(20);
247
- tree.add(5);
248
- tree.add(15);
249
- tree.add(21);
250
- tree.add(6);
251
- tree.add(2);
252
-
253
- let node10F = tree.getNode(10);
254
- let node20F = tree.getNode(20);
255
- let node5F = tree.getNode(5);
256
- let node15F = tree.getNode(15);
257
- let node21F = tree.getNode(21);
258
- let node6F = tree.getNode(6);
259
- let node2F = tree.getNode(2);
244
+ it('should all node attributes fully conform to the red-black rbTree standards.', () => {
245
+ rbTree.add(10);
246
+ rbTree.add(20);
247
+ rbTree.add(5);
248
+ rbTree.add(15);
249
+ rbTree.add(21);
250
+ rbTree.add(6);
251
+ rbTree.add(2);
252
+
253
+ let node10F = rbTree.getNode(10);
254
+ let node20F = rbTree.getNode(20);
255
+ let node5F = rbTree.getNode(5);
256
+ let node15F = rbTree.getNode(15);
257
+ let node21F = rbTree.getNode(21);
258
+ let node6F = rbTree.getNode(6);
259
+ let node2F = rbTree.getNode(2);
260
260
  expect(node10F?.key).toBe(10);
261
261
  expect(node10F?.color).toBe(RBTNColor.BLACK);
262
262
  expect(node10F?.left).toBe(node5F);
@@ -274,37 +274,37 @@ describe('RedBlackTree 2', () => {
274
274
  expect(node5F?.parent).toBe(node10F);
275
275
  expect(node15F?.key).toBe(15);
276
276
  expect(node15F?.color).toBe(RBTNColor.RED);
277
- expect(node15F?.left).toBe(tree.SENTINEL);
278
- expect(node15F?.right).toBe(tree.SENTINEL);
277
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
278
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
279
279
  expect(node15F?.parent).toBe(node20F);
280
280
  expect(node21F?.key).toBe(21);
281
281
  expect(node21F?.color).toBe(RBTNColor.RED);
282
- expect(node21F?.left).toBe(tree.SENTINEL);
283
- expect(node21F?.right).toBe(tree.SENTINEL);
282
+ expect(node21F?.left).toBe(rbTree.SENTINEL);
283
+ expect(node21F?.right).toBe(rbTree.SENTINEL);
284
284
  expect(node21F?.parent).toBe(node20F);
285
285
  expect(node6F?.key).toBe(6);
286
286
  expect(node6F?.color).toBe(RBTNColor.RED);
287
- expect(node6F?.left).toBe(tree.SENTINEL);
288
- expect(node6F?.right).toBe(tree.SENTINEL);
287
+ expect(node6F?.left).toBe(rbTree.SENTINEL);
288
+ expect(node6F?.right).toBe(rbTree.SENTINEL);
289
289
  expect(node6F?.parent).toBe(node5F);
290
290
  expect(node2F?.key).toBe(2);
291
291
  expect(node2F?.color).toBe(RBTNColor.RED);
292
- expect(node2F?.left).toBe(tree.SENTINEL);
293
- expect(node2F?.right).toBe(tree.SENTINEL);
292
+ expect(node2F?.left).toBe(rbTree.SENTINEL);
293
+ expect(node2F?.right).toBe(rbTree.SENTINEL);
294
294
  expect(node2F?.parent).toBe(node5F);
295
295
  expect(node15F?.key).toBe(15);
296
296
  expect(node15F?.color).toBe(RBTNColor.RED);
297
- expect(node15F?.left).toBe(tree.SENTINEL);
298
- expect(node15F?.right).toBe(tree.SENTINEL);
297
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
298
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
299
299
  expect(node15F?.parent).toBe(node20F);
300
- tree.delete(5);
301
- node10F = tree.getNode(10);
302
- node20F = tree.getNode(20);
303
- node5F = tree.getNode(5);
304
- node15F = tree.getNode(15);
305
- node21F = tree.getNode(21);
306
- node6F = tree.getNode(6);
307
- node2F = tree.getNode(2);
300
+ rbTree.delete(5);
301
+ node10F = rbTree.getNode(10);
302
+ node20F = rbTree.getNode(20);
303
+ node5F = rbTree.getNode(5);
304
+ node15F = rbTree.getNode(15);
305
+ node21F = rbTree.getNode(21);
306
+ node6F = rbTree.getNode(6);
307
+ node2F = rbTree.getNode(2);
308
308
  expect(node10F?.key).toBe(10);
309
309
  expect(node10F?.color).toBe(RBTNColor.BLACK);
310
310
  expect(node10F?.left).toBe(node6F);
@@ -318,37 +318,37 @@ describe('RedBlackTree 2', () => {
318
318
  expect(node5F).toBe(undefined);
319
319
  expect(node15F?.key).toBe(15);
320
320
  expect(node15F?.color).toBe(RBTNColor.RED);
321
- expect(node15F?.left).toBe(tree.SENTINEL);
322
- expect(node15F?.right).toBe(tree.SENTINEL);
321
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
322
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
323
323
  expect(node15F?.parent).toBe(node20F);
324
324
  expect(node21F?.key).toBe(21);
325
325
  expect(node21F?.color).toBe(RBTNColor.RED);
326
- expect(node21F?.left).toBe(tree.SENTINEL);
327
- expect(node21F?.right).toBe(tree.SENTINEL);
326
+ expect(node21F?.left).toBe(rbTree.SENTINEL);
327
+ expect(node21F?.right).toBe(rbTree.SENTINEL);
328
328
  expect(node21F?.parent).toBe(node20F);
329
329
  expect(node6F?.key).toBe(6);
330
330
  expect(node6F?.color).toBe(RBTNColor.BLACK);
331
331
  expect(node6F?.left).toBe(node2F);
332
- expect(node6F?.right).toBe(tree.SENTINEL);
332
+ expect(node6F?.right).toBe(rbTree.SENTINEL);
333
333
  expect(node6F?.parent).toBe(node10F);
334
334
  expect(node2F?.key).toBe(2);
335
335
  expect(node2F?.color).toBe(RBTNColor.RED);
336
- expect(node2F?.left).toBe(tree.SENTINEL);
337
- expect(node2F?.right).toBe(tree.SENTINEL);
336
+ expect(node2F?.left).toBe(rbTree.SENTINEL);
337
+ expect(node2F?.right).toBe(rbTree.SENTINEL);
338
338
  expect(node2F?.parent).toBe(node6F);
339
339
  expect(node15F?.key).toBe(15);
340
340
  expect(node15F?.color).toBe(RBTNColor.RED);
341
- expect(node15F?.left).toBe(tree.SENTINEL);
342
- expect(node15F?.right).toBe(tree.SENTINEL);
341
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
342
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
343
343
  expect(node15F?.parent).toBe(node20F);
344
- tree.delete(20);
345
- node10F = tree.getNode(10);
346
- node20F = tree.getNode(20);
347
- node5F = tree.getNode(5);
348
- node15F = tree.getNode(15);
349
- node21F = tree.getNode(21);
350
- node6F = tree.getNode(6);
351
- node2F = tree.getNode(2);
344
+ rbTree.delete(20);
345
+ node10F = rbTree.getNode(10);
346
+ node20F = rbTree.getNode(20);
347
+ node5F = rbTree.getNode(5);
348
+ node15F = rbTree.getNode(15);
349
+ node21F = rbTree.getNode(21);
350
+ node6F = rbTree.getNode(6);
351
+ node2F = rbTree.getNode(2);
352
352
  expect(node10F?.key).toBe(10);
353
353
  expect(node10F?.color).toBe(RBTNColor.BLACK);
354
354
  expect(node10F?.left).toBe(node6F);
@@ -358,167 +358,167 @@ describe('RedBlackTree 2', () => {
358
358
  expect(node5F).toBe(undefined);
359
359
  expect(node15F?.key).toBe(15);
360
360
  expect(node15F?.color).toBe(RBTNColor.RED);
361
- expect(node15F?.left).toBe(tree.SENTINEL);
362
- expect(node15F?.right).toBe(tree.SENTINEL);
361
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
362
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
363
363
  expect(node15F?.parent).toBe(node21F);
364
364
  expect(node21F?.key).toBe(21);
365
365
  expect(node21F?.color).toBe(RBTNColor.BLACK);
366
366
  expect(node21F?.left).toBe(node15F);
367
- expect(node21F?.right).toBe(tree.SENTINEL);
367
+ expect(node21F?.right).toBe(rbTree.SENTINEL);
368
368
  expect(node21F?.parent).toBe(node10F);
369
369
  expect(node6F?.key).toBe(6);
370
370
  expect(node6F?.color).toBe(RBTNColor.BLACK);
371
371
  expect(node6F?.left).toBe(node2F);
372
- expect(node6F?.right).toBe(tree.SENTINEL);
372
+ expect(node6F?.right).toBe(rbTree.SENTINEL);
373
373
  expect(node6F?.parent).toBe(node10F);
374
374
  expect(node2F?.key).toBe(2);
375
375
  expect(node2F?.color).toBe(RBTNColor.RED);
376
- expect(node2F?.left).toBe(tree.SENTINEL);
377
- expect(node2F?.right).toBe(tree.SENTINEL);
376
+ expect(node2F?.left).toBe(rbTree.SENTINEL);
377
+ expect(node2F?.right).toBe(rbTree.SENTINEL);
378
378
  expect(node2F?.parent).toBe(node6F);
379
379
  expect(node15F?.key).toBe(15);
380
380
  expect(node15F?.color).toBe(RBTNColor.RED);
381
- expect(node15F?.left).toBe(tree.SENTINEL);
382
- expect(node15F?.right).toBe(tree.SENTINEL);
381
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
382
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
383
383
  expect(node15F?.parent).toBe(node21F);
384
384
  });
385
385
 
386
- it('should fix the tree after insertion', () => {
387
- tree.add(1);
388
- tree.add(2);
389
- tree.add(5);
390
- tree.add(15);
391
- const node15F = tree.getNode(15);
392
- expect(node15F?.left).toBe(tree.SENTINEL);
393
- expect(node15F?.right).toBe(tree.SENTINEL);
394
- expect(node15F?.parent).toBe(tree.getNode(5));
395
-
396
- tree.add(25);
397
- tree.add(10);
398
- tree.add(8);
399
- tree.add(28);
400
- tree.add(111);
401
- tree.add(12);
402
- tree.delete(2);
403
- tree.add(22);
404
- tree.add(50);
405
- tree.add(155);
406
- tree.add(225);
407
- const node225F = tree.getNode(225);
408
- expect(node225F?.left).toBe(tree.SENTINEL);
409
- expect(node225F?.right).toBe(tree.SENTINEL);
386
+ it('should fix the rbTree after insertion', () => {
387
+ rbTree.add(1);
388
+ rbTree.add(2);
389
+ rbTree.add(5);
390
+ rbTree.add(15);
391
+ const node15F = rbTree.getNode(15);
392
+ expect(node15F?.left).toBe(rbTree.SENTINEL);
393
+ expect(node15F?.right).toBe(rbTree.SENTINEL);
394
+ expect(node15F?.parent).toBe(rbTree.getNode(5));
395
+
396
+ rbTree.add(25);
397
+ rbTree.add(10);
398
+ rbTree.add(8);
399
+ rbTree.add(28);
400
+ rbTree.add(111);
401
+ rbTree.add(12);
402
+ rbTree.delete(2);
403
+ rbTree.add(22);
404
+ rbTree.add(50);
405
+ rbTree.add(155);
406
+ rbTree.add(225);
407
+ const node225F = rbTree.getNode(225);
408
+ expect(node225F?.left).toBe(rbTree.SENTINEL);
409
+ expect(node225F?.right).toBe(rbTree.SENTINEL);
410
410
  expect(node225F?.parent?.key).toBe(155);
411
- tree.add(7);
412
- isDebug && tree.print();
411
+ rbTree.add(7);
412
+ isDebug && rbTree.print();
413
413
 
414
- const node15S = tree.getNode(15);
414
+ const node15S = rbTree.getNode(15);
415
415
  expect(node15S?.left?.key).toBe(10);
416
416
  expect(node15S?.right?.key).toBe(25);
417
- expect(tree.root).toBe(tree.getNode(8));
417
+ expect(rbTree.root).toBe(rbTree.getNode(8));
418
418
  expect(node15S?.parent?.key).toBe(28);
419
- tree.delete(15);
420
- expect(tree.root?.key).toBe(8);
421
- expect(tree.root?.parent).toBe(undefined);
419
+ rbTree.delete(15);
420
+ expect(rbTree.root?.key).toBe(8);
421
+ expect(rbTree.root?.parent).toBe(undefined);
422
422
 
423
- const node15T = tree.getNode(15);
423
+ const node15T = rbTree.getNode(15);
424
424
  expect(node15T).toBe(undefined);
425
425
 
426
- tree.add(23);
427
- tree.add(33);
428
- tree.add(15);
426
+ rbTree.add(23);
427
+ rbTree.add(33);
428
+ rbTree.add(15);
429
429
 
430
- const nodeLM = tree.getLeftMost();
430
+ const nodeLM = rbTree.getLeftMost();
431
431
  expect(nodeLM?.key).toBe(1);
432
432
 
433
- const node50 = tree.getNode(50);
433
+ const node50 = rbTree.getNode(50);
434
434
  expect(node50?.key).toBe(50);
435
435
  expect(node50?.left?.key).toBe(33);
436
- expect(node50?.right).toBe(tree.SENTINEL);
437
- const node15Fo = tree.getNode(15);
436
+ expect(node50?.right).toBe(rbTree.SENTINEL);
437
+ const node15Fo = rbTree.getNode(15);
438
438
 
439
439
  expect(node15Fo?.key).toBe(15);
440
- expect(node15Fo?.left).toBe(tree.SENTINEL);
441
- const node225S = tree.getNode(225);
442
- expect(node225S?.left).toBe(tree.SENTINEL);
443
- expect(node225S?.right).toBe(tree.SENTINEL);
440
+ expect(node15Fo?.left).toBe(rbTree.SENTINEL);
441
+ const node225S = rbTree.getNode(225);
442
+ expect(node225S?.left).toBe(rbTree.SENTINEL);
443
+ expect(node225S?.right).toBe(rbTree.SENTINEL);
444
444
  expect(node225S?.parent?.key).toBe(155);
445
445
  // TODO
446
- // expect(tree.getNode(0)).toBe(undefined);
447
- tree.add(2);
448
- tree.add(3);
449
- tree.add(4);
450
- tree.add(6);
451
- tree.add(9);
452
- tree.add(11);
453
- tree.add(13);
454
- tree.add(14);
455
- tree.add(16);
456
- tree.add(17);
457
- tree.add(18);
458
- tree.add(19);
459
- tree.add(110);
460
-
461
- isDebug && tree.print();
462
-
463
- expect(tree.dfs()).toEqual([
446
+ // expect(rbTree.getNode(0)).toBe(undefined);
447
+ rbTree.add(2);
448
+ rbTree.add(3);
449
+ rbTree.add(4);
450
+ rbTree.add(6);
451
+ rbTree.add(9);
452
+ rbTree.add(11);
453
+ rbTree.add(13);
454
+ rbTree.add(14);
455
+ rbTree.add(16);
456
+ rbTree.add(17);
457
+ rbTree.add(18);
458
+ rbTree.add(19);
459
+ rbTree.add(110);
460
+
461
+ isDebug && rbTree.print();
462
+
463
+ expect(rbTree.dfs()).toEqual([
464
464
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 25, 28, 33, 50, 110, 111, 155, 225
465
465
  ]);
466
466
 
467
- expect(tree.isBST()).toBe(true);
467
+ expect(rbTree.isBST()).toBe(true);
468
468
  });
469
469
 
470
- it('should fix the tree after insertion and deletion', () => {
470
+ it('should fix the rbTree after insertion and deletion', () => {
471
471
  for (let i = 0; i < 100; i++) {
472
- tree.add(i);
472
+ rbTree.add(i);
473
473
  }
474
474
  for (let i = 0; i < 49; i++) {
475
- tree.delete(i);
475
+ rbTree.delete(i);
476
476
  }
477
477
 
478
- expect(tree.size).toBe(51);
479
- expect(tree.isBST()).toBe(true);
480
- expect(tree.isBST(tree.root, IterationType.RECURSIVE)).toBe(true);
478
+ expect(rbTree.size).toBe(51);
479
+ expect(rbTree.isBST()).toBe(true);
480
+ expect(rbTree.isBST(rbTree.root, IterationType.RECURSIVE)).toBe(true);
481
481
 
482
- expect(tree.dfs(n => n.key, 'in', tree.root, IterationType.ITERATIVE)).toEqual([
482
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.ITERATIVE)).toEqual([
483
483
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
484
484
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
485
485
  ]);
486
- expect(tree.dfs(n => n.key, 'in', tree.root, IterationType.RECURSIVE)).toEqual([
486
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.RECURSIVE)).toEqual([
487
487
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
488
488
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
489
489
  ]);
490
490
  });
491
491
 
492
- it('should fix the tree after large scale insertion and deletion', () => {
492
+ it('should fix the rbTree after large scale insertion and deletion', () => {
493
493
  for (let i = 0; i < 10000; i++) {
494
- tree.add(i);
494
+ rbTree.add(i);
495
495
  }
496
496
  for (let i = 0; i < 10000; i++) {
497
- tree.delete(i);
497
+ rbTree.delete(i);
498
498
  }
499
499
 
500
- expect(tree.size).toBe(0);
501
- expect(tree.isBST()).toBe(true);
502
- expect(tree.dfs(n => n.key, 'in', tree.root, IterationType.ITERATIVE)).toEqual([]);
500
+ expect(rbTree.size).toBe(0);
501
+ expect(rbTree.isBST()).toBe(true);
502
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.ITERATIVE)).toEqual([]);
503
503
 
504
- tree.clear();
504
+ rbTree.clear();
505
505
  for (let i = 0; i < 1000; i++) {
506
- tree.add(getRandomInt(-100, 1000));
507
- tree.delete(getRandomInt(-100, 1000));
506
+ rbTree.add(getRandomInt(-100, 1000));
507
+ rbTree.delete(getRandomInt(-100, 1000));
508
508
  }
509
509
 
510
- // TODO there is a bug when dfs the tree with SENTINEL node
511
- // expect(tree.isBST()).toBe(true);
510
+ // TODO there is a bug when dfs the rbTree with SENTINEL node
511
+ // expect(rbTree.isBST()).toBe(true);
512
512
  });
513
513
  const { HUNDRED_THOUSAND } = magnitude;
514
514
  const arr = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND, true);
515
515
  const competitor = new OrderedMap<number, number>();
516
516
 
517
- it('should fix the tree after large scale insertion and deletion', () => {
518
- tree.clear();
517
+ it('should fix the rbTree after large scale insertion and deletion', () => {
518
+ rbTree.clear();
519
519
  const tS = performance.now();
520
520
  for (let i = 0; i < arr.length; i++) {
521
- tree.add(arr[i]);
521
+ rbTree.add(arr[i]);
522
522
  }
523
523
  isDebug && console.log(performance.now() - tS);
524
524
 
@@ -531,20 +531,20 @@ describe('RedBlackTree 2', () => {
531
531
  });
532
532
 
533
533
  it('duplicates', () => {
534
- tree.addMany([9, 8, 7, 8, 8, 8, 2, 3, 6, 5, 5, 4]);
535
- isDebug && tree.print();
536
-
537
- expect(tree.size).toBe(8);
538
- expect(tree.isBST()).toBe(true);
539
- expect(tree.isAVLBalanced()).toBe(true);
540
- tree.addMany([10, 5, 2, 11]);
541
- expect(tree.size).toBe(10);
542
- expect(tree.isBST()).toBe(true);
543
- expect(tree.isAVLBalanced()).toBe(true);
544
-
545
- tree.clear();
546
- tree.addMany([10, 20, 30, 40, 50, 60]);
547
- expect(tree.isAVLBalanced()).toBe(false);
534
+ rbTree.addMany([9, 8, 7, 8, 8, 8, 2, 3, 6, 5, 5, 4]);
535
+ isDebug && rbTree.print();
536
+
537
+ expect(rbTree.size).toBe(8);
538
+ expect(rbTree.isBST()).toBe(true);
539
+ expect(rbTree.isAVLBalanced()).toBe(true);
540
+ rbTree.addMany([10, 5, 2, 11]);
541
+ expect(rbTree.size).toBe(10);
542
+ expect(rbTree.isBST()).toBe(true);
543
+ expect(rbTree.isAVLBalanced()).toBe(true);
544
+
545
+ rbTree.clear();
546
+ rbTree.addMany([10, 20, 30, 40, 50, 60]);
547
+ expect(rbTree.isAVLBalanced()).toBe(false);
548
548
  });
549
549
 
550
550
  describe('RedBlackTree delete test', function () {
@@ -598,7 +598,7 @@ describe('RedBlackTree 2', () => {
598
598
  if (rbTree.root) dfs(rbTree.root);
599
599
 
600
600
  expect(rbTree.size).toBe(0);
601
- expect(rbTree.getHeight()).toBe(0);
601
+ expect(rbTree.getHeight()).toBe(-1);
602
602
  expect(nanCount).toBeLessThanOrEqual(inputSize);
603
603
 
604
604
  isDebug && rbTree.print();
@@ -633,7 +633,7 @@ describe('RedBlackTree 2', () => {
633
633
  expect(mockCallback.mock.calls[2]).toEqual(['c', 3]);
634
634
  });
635
635
 
636
- test('filter should return a new tree with filtered elements', () => {
636
+ test('filter should return a new rbTree with filtered elements', () => {
637
637
  const filteredTree = rbTree.filter((value, key) => key > 1);
638
638
  expect(filteredTree.size).toBe(2);
639
639
  expect([...filteredTree]).toEqual([
@@ -642,7 +642,7 @@ describe('RedBlackTree 2', () => {
642
642
  ]);
643
643
  });
644
644
 
645
- test('map should return a new tree with modified elements', () => {
645
+ test('map should return a new rbTree with modified elements', () => {
646
646
  const mappedTree = rbTree.map((value, key) => (key * 2).toString());
647
647
  expect(mappedTree.size).toBe(3);
648
648
  expect([...mappedTree]).toEqual([