data-structure-typed 1.50.7 → 1.50.8

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 (53) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +27 -19
  3. package/benchmark/report.html +1 -37
  4. package/benchmark/report.json +16 -394
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -2
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -4
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +3 -3
  9. package/dist/cjs/data-structures/binary-tree/binary-tree.js +23 -24
  10. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/bst.d.ts +7 -5
  12. package/dist/cjs/data-structures/binary-tree/bst.js +59 -38
  13. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/rb-tree.js +6 -7
  15. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -2
  17. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +1 -1
  18. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  19. package/dist/cjs/types/common.d.ts +5 -28
  20. package/dist/cjs/types/common.js +0 -40
  21. package/dist/cjs/types/common.js.map +1 -1
  22. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -2
  23. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -4
  24. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +3 -3
  25. package/dist/mjs/data-structures/binary-tree/binary-tree.js +23 -24
  26. package/dist/mjs/data-structures/binary-tree/bst.d.ts +7 -5
  27. package/dist/mjs/data-structures/binary-tree/bst.js +59 -38
  28. package/dist/mjs/data-structures/binary-tree/rb-tree.js +7 -8
  29. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -2
  30. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +2 -2
  31. package/dist/mjs/types/common.d.ts +5 -28
  32. package/dist/mjs/types/common.js +1 -39
  33. package/dist/umd/data-structure-typed.js +86 -118
  34. package/dist/umd/data-structure-typed.min.js +2 -2
  35. package/dist/umd/data-structure-typed.min.js.map +1 -1
  36. package/package.json +6 -6
  37. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +3 -4
  38. package/src/data-structures/binary-tree/binary-tree.ts +23 -26
  39. package/src/data-structures/binary-tree/bst.ts +59 -36
  40. package/src/data-structures/binary-tree/rb-tree.ts +6 -6
  41. package/src/data-structures/binary-tree/tree-multi-map.ts +2 -2
  42. package/src/types/common.ts +5 -29
  43. package/test/integration/all-in-one.test.ts +2 -2
  44. package/test/integration/avl-tree.test.ts +1 -1
  45. package/test/integration/bst.test.ts +2 -2
  46. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +13 -22
  47. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +8 -16
  48. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +4 -4
  49. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +118 -65
  50. package/test/unit/data-structures/binary-tree/bst.test.ts +12 -12
  51. package/test/unit/data-structures/binary-tree/overall.test.ts +7 -7
  52. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +10 -5
  53. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +7 -15
@@ -11,23 +11,25 @@ const randomArray = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND - 1,
11
11
  const cOrderedMap = new OrderedMap<number, number>();
12
12
 
13
13
  suite
14
- .add(`${HUNDRED_THOUSAND.toLocaleString()} add orderly`, () => {
14
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
15
+ rbTree.clear();
15
16
  for (let i = 0; i < randomArray.length; i++) rbTree.add(i);
16
17
  })
17
- .add(`${HUNDRED_THOUSAND.toLocaleString()} delete orderly`, () => {
18
- for (let i = 0; i < randomArray.length; i++) rbTree.delete(i);
19
- })
20
- .add(`${HUNDRED_THOUSAND.toLocaleString()} add randomly`, () => {
21
- rbTree.clear();
22
- for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
18
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} get`, () => {
19
+ for (let i = 0; i < randomArray.length; i++) rbTree.get(randomArray[i]);
23
20
  })
24
- .add(`${HUNDRED_THOUSAND.toLocaleString()} delete randomly`, () => {
25
- for (let i = 0; i < randomArray.length; i++) rbTree.delete(randomArray[i]);
21
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} iterator`, () => {
22
+ const entries = [...rbTree];
23
+ return entries.length === HUNDRED_THOUSAND;
26
24
  })
27
- .add(`${HUNDRED_THOUSAND.toLocaleString()} add orderly`, () => {
25
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete orderly`, () => {
26
+ rbTree.clear();
28
27
  for (let i = 0; i < randomArray.length; i++) rbTree.add(i);
28
+ for (let i = 0; i < randomArray.length; i++) rbTree.delete(i);
29
29
  })
30
- .add(`${HUNDRED_THOUSAND.toLocaleString()} delete randomly`, () => {
30
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete randomly`, () => {
31
+ rbTree.clear();
32
+ for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
31
33
  for (let i = 0; i < randomArray.length; i++) rbTree.delete(randomArray[i]);
32
34
  });
33
35
 
@@ -37,15 +39,4 @@ if (isCompetitor) {
37
39
  });
38
40
  }
39
41
 
40
- suite.add(`${HUNDRED_THOUSAND.toLocaleString()} getNode randomly`, () => {
41
- for (let i = 0; i < randomArray.length; i++) rbTree.getNode(randomArray[i]);
42
- });
43
-
44
- suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add & iterator`, () => {
45
- rbTree.clear();
46
- for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
47
- const entries = [...rbTree];
48
- return entries.length === HUNDRED_THOUSAND;
49
- });
50
-
51
42
  export { suite };
@@ -1,12 +1,4 @@
1
- import {
2
- AVLTreeMultiMap,
3
- AVLTreeMultiMapNode,
4
- AVLTreeNode,
5
- BinaryTreeNode,
6
- BSTNode,
7
- CP,
8
- IterationType
9
- } from '../../../../src';
1
+ import { AVLTreeMultiMap, AVLTreeMultiMapNode, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
10
2
  import { isDebugTest } from '../../../config';
11
3
 
12
4
  const isDebug = isDebugTest;
@@ -36,7 +28,7 @@ describe('AVLTreeMultiMap count', () => {
36
28
  [3, 3]
37
29
  ]);
38
30
  tm.add([2, 2], undefined, 10);
39
- tm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 1);
31
+ tm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
40
32
  tm.delete(2);
41
33
  expect(tm.count).toBe(12);
42
34
  expect(tm.getMutableCount()).toBe(16);
@@ -102,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
102
94
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
103
95
  expect(subTreeSum).toBe(31);
104
96
  let lesserSum = 0;
105
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), CP.lt, 10);
97
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
106
98
  expect(lesserSum).toBe(45);
107
99
 
108
100
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -113,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
113
105
  const node11 = treeMultimap.getNode(11);
114
106
  expect(node11 instanceof AVLTreeMultiMapNode);
115
107
  if (node11 instanceof AVLTreeMultiMapNode) {
116
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
108
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
117
109
  expect(allGreaterNodesAdded);
118
110
  }
119
111
 
@@ -299,7 +291,7 @@ describe('AVLTreeMultiMap operations test1', () => {
299
291
 
300
292
  describe('AVLTreeMultiMap operations test recursively1', () => {
301
293
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
302
- const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType: IterationType.RECURSIVE });
294
+ const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
303
295
 
304
296
  expect(treeMultimap instanceof AVLTreeMultiMap);
305
297
  treeMultimap.add([11, 11]);
@@ -356,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
356
348
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
357
349
  expect(subTreeSum).toBe(31);
358
350
  let lesserSum = 0;
359
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), CP.lt, 10);
351
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
360
352
  expect(lesserSum).toBe(45);
361
353
 
362
354
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -367,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
367
359
  const node11 = treeMultimap.getNode(11);
368
360
  expect(node11 instanceof AVLTreeMultiMapNode);
369
361
  if (node11 instanceof AVLTreeMultiMapNode) {
370
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
362
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
371
363
  expect(allGreaterNodesAdded);
372
364
  }
373
365
 
@@ -572,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
572
564
  }
573
565
  isDebug && console.log('---add', performance.now() - start);
574
566
  const startL = performance.now();
575
- treeMS.lesserOrGreaterTraverse(node => (node.count += 1), CP.lt, inputSize / 2);
567
+ treeMS.lesserOrGreaterTraverse(node => (node.count += 1), 'LT', inputSize / 2);
576
568
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
577
569
  });
578
570
 
@@ -1,4 +1,4 @@
1
- import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode, CP, IterationType } from '../../../../src';
1
+ import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
2
2
 
3
3
  describe('AVL Tree Test', () => {
4
4
  it('should perform various operations on a AVL Tree', () => {
@@ -28,7 +28,7 @@ describe('AVL Tree Test', () => {
28
28
  expect(subTreeSum).toBe(70);
29
29
 
30
30
  let lesserSum = 0;
31
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
31
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
32
32
  expect(lesserSum).toBe(45);
33
33
 
34
34
  // node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
@@ -112,7 +112,7 @@ describe('AVL Tree Test', () => {
112
112
  describe('AVL Tree Test recursively', () => {
113
113
  it('should perform various operations on a AVL Tree', () => {
114
114
  const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
115
- const tree = new AVLTree<number>([], { iterationType: IterationType.RECURSIVE });
115
+ const tree = new AVLTree<number>([], { iterationType: 'RECURSIVE' });
116
116
 
117
117
  for (const i of arr) tree.add([i, i]);
118
118
 
@@ -136,7 +136,7 @@ describe('AVL Tree Test recursively', () => {
136
136
  expect(subTreeSum).toBe(70);
137
137
 
138
138
  let lesserSum = 0;
139
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
139
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
140
140
  expect(lesserSum).toBe(45);
141
141
 
142
142
  // node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
@@ -1,4 +1,4 @@
1
- import { BinaryTree, BinaryTreeNode, FamilyPosition, IterationType } from '../../../../src';
1
+ import { BinaryTree, BinaryTreeNode } from '../../../../src';
2
2
  import { getRandomIntArray } from '../../../utils';
3
3
  // import { isDebugTest } from '../../../config';
4
4
 
@@ -81,7 +81,7 @@ describe('BinaryTreeNode', () => {
81
81
  root.right = rightChild;
82
82
 
83
83
  expect(rightChild.familyPosition).toBe('RIGHT');
84
- expect(isolated.familyPosition).toBe(FamilyPosition.ISOLATED);
84
+ expect(isolated.familyPosition).toBe('ISOLATED');
85
85
  expect(root.familyPosition).toBe('ROOT');
86
86
  });
87
87
  });
@@ -104,7 +104,7 @@ describe('BinaryTree', () => {
104
104
  });
105
105
 
106
106
  it('should delete nodes', () => {
107
- expect(tree.getHeight(tree.root, IterationType.ITERATIVE)).toBe(-1);
107
+ expect(tree.getHeight(tree.root, 'ITERATIVE')).toBe(-1);
108
108
  expect(tree.getMinHeight()).toBe(-1);
109
109
  const node1 = tree.createNode(1);
110
110
  tree.add(node1);
@@ -132,7 +132,7 @@ describe('BinaryTree', () => {
132
132
  const result = tree.delete(node1);
133
133
  expect(result).toHaveLength(1);
134
134
  expect(tree.size).toBe(4);
135
- expect(tree.getMinHeight(tree.root, IterationType.RECURSIVE)).toBe(1);
135
+ expect(tree.getMinHeight(tree.root, 'RECURSIVE')).toBe(1);
136
136
  }
137
137
  });
138
138
 
@@ -171,16 +171,25 @@ describe('BinaryTree', () => {
171
171
  expect(cloned.root?.right?.key).toBe(6);
172
172
  expect(cloned.root?.right?.left?.key).toBe(3);
173
173
  expect(cloned.root?.right?.right).toBe(null);
174
- expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
175
- expect(
176
- cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
177
- ).toEqual([6, 3, 7, null]);
178
- expect(
179
- cloned.dfs(node => (node ? node.key : node), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
180
- ).toEqual([6, 3, 7, null]);
181
- expect(
182
- cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.RECURSIVE, true)
183
- ).toEqual([6, 3, 7, null]);
174
+ expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
175
+ expect(cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
176
+ 6,
177
+ 3,
178
+ 7,
179
+ null
180
+ ]);
181
+ expect(cloned.dfs(node => (node ? node.key : node), 'pre', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
182
+ 6,
183
+ 3,
184
+ 7,
185
+ null
186
+ ]);
187
+ expect(cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), 'RECURSIVE', true)).toEqual([
188
+ 6,
189
+ 3,
190
+ 7,
191
+ null
192
+ ]);
184
193
  cloned.delete(6);
185
194
  cloned.delete(3);
186
195
  cloned.delete(7);
@@ -234,9 +243,9 @@ describe('BinaryTree', () => {
234
243
  tree.add(4);
235
244
  tree.add(2);
236
245
  expect(tree.getHeight()).toBe(1);
237
- tree.iterationType = IterationType.RECURSIVE;
246
+ tree.iterationType = 'RECURSIVE';
238
247
  expect(tree.getHeight()).toBe(1);
239
- tree.iterationType = IterationType.ITERATIVE;
248
+ tree.iterationType = 'ITERATIVE';
240
249
 
241
250
  tree.add(6);
242
251
  tree.add(1);
@@ -252,9 +261,9 @@ describe('BinaryTree', () => {
252
261
  it('should getLeftMost', () => {
253
262
  tree.addMany([4, 2, 6, 1, 3, 5, 7]);
254
263
 
255
- const leftMost = tree.getLeftMost(tree.root, IterationType.RECURSIVE);
264
+ const leftMost = tree.getLeftMost(tree.root, 'RECURSIVE');
256
265
  expect(leftMost?.key).toEqual(1);
257
- const rightMost = tree.getRightMost(tree.root, IterationType.RECURSIVE);
266
+ const rightMost = tree.getRightMost(tree.root, 'RECURSIVE');
258
267
  expect(rightMost?.key).toEqual(7);
259
268
  });
260
269
 
@@ -270,37 +279,37 @@ describe('BinaryTree', () => {
270
279
  new BinaryTreeNode(4, 4)
271
280
  ]);
272
281
 
273
- expect(tree.isBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
274
- expect(tree.isBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
282
+ expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
283
+ expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
275
284
  });
276
285
 
277
286
  it('should isSubtreeBST', () => {
278
287
  tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
279
288
 
280
- expect(tree.isBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
281
- expect(tree.isBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
289
+ expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
290
+ expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
282
291
  expect(tree.getNodes(2, undefined, false, null)).toEqual([]);
283
292
  expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)]);
284
293
  });
285
294
 
286
295
  it('should sub tree traverse', () => {
287
296
  tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
288
- expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
289
- expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), IterationType.ITERATIVE, false)).toEqual([6, 3, 7]);
290
- expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), IterationType.RECURSIVE)).toEqual([6, 3, 7]);
291
- expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), IterationType.ITERATIVE, true)).toEqual([
297
+ expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
298
+ expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'ITERATIVE', false)).toEqual([6, 3, 7]);
299
+ expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
300
+ expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), 'ITERATIVE', true)).toEqual([
292
301
  6,
293
302
  3,
294
303
  7,
295
304
  null
296
305
  ]);
297
- expect(tree.dfs(node => (node ? node.key : node), 'pre', tree.getNode(6), IterationType.ITERATIVE, true)).toEqual([
306
+ expect(tree.dfs(node => (node ? node.key : node), 'pre', tree.getNode(6), 'ITERATIVE', true)).toEqual([
298
307
  6,
299
308
  3,
300
309
  7,
301
310
  null
302
311
  ]);
303
- expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), IterationType.RECURSIVE, true)).toEqual([
312
+ expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), 'RECURSIVE', true)).toEqual([
304
313
  6,
305
314
  3,
306
315
  7,
@@ -360,7 +369,7 @@ describe('BinaryTree Morris Traversal', () => {
360
369
 
361
370
  expect(result).toEqual(expected);
362
371
  expect(tree.dfs(node => node.key, 'in')).toEqual(expected);
363
- expect(tree.dfs(node => node.key, 'in', tree.root, IterationType.RECURSIVE)).toEqual(expected);
372
+ expect(tree.dfs(node => node.key, 'in', tree.root, 'RECURSIVE')).toEqual(expected);
364
373
  });
365
374
 
366
375
  it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
@@ -399,57 +408,101 @@ describe('BinaryTree traversals', () => {
399
408
 
400
409
  const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
401
410
  tree.refill(arr);
402
- expect(
403
- tree.bfs(node => node, tree.root, IterationType.ITERATIVE, true).map(node => (node ? node.key : null))
404
- ).toEqual([35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55]);
405
- expect(
406
- tree.bfs(node => node, tree.root, IterationType.RECURSIVE, true).map(node => (node ? node.key : null))
407
- ).toEqual([35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55]);
408
- expect(
409
- tree.bfs(node => node, tree.root, IterationType.ITERATIVE).map(node => (node === null ? null : node.key))
410
- ).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
411
- expect(
412
- tree.bfs(node => node, tree.root, IterationType.RECURSIVE).map(node => (node === null ? null : node.key))
413
- ).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
411
+ expect(tree.bfs(node => node, tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
412
+ 35,
413
+ 20,
414
+ 40,
415
+ 15,
416
+ 29,
417
+ null,
418
+ 50,
419
+ null,
420
+ 16,
421
+ 28,
422
+ 30,
423
+ 45,
424
+ 55
425
+ ]);
426
+ expect(tree.bfs(node => node, tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
427
+ 35,
428
+ 20,
429
+ 40,
430
+ 15,
431
+ 29,
432
+ null,
433
+ 50,
434
+ null,
435
+ 16,
436
+ 28,
437
+ 30,
438
+ 45,
439
+ 55
440
+ ]);
441
+ expect(tree.bfs(node => node, tree.root, 'ITERATIVE').map(node => (node === null ? null : node.key))).toEqual([
442
+ 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
443
+ ]);
444
+ expect(tree.bfs(node => node, tree.root, 'RECURSIVE').map(node => (node === null ? null : node.key))).toEqual([
445
+ 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
446
+ ]);
414
447
 
415
448
  expect(tree.dfs(node => node.key, 'pre')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
416
- expect(tree.dfs(node => node.key, 'pre', tree.root, IterationType.RECURSIVE)).toEqual([
449
+ expect(tree.dfs(node => node.key, 'pre', tree.root, 'RECURSIVE')).toEqual([
417
450
  35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
418
451
  ]);
419
- expect(
420
- tree.dfs(node => node, 'pre', tree.root, IterationType.ITERATIVE, true).map(node => (node ? node.key : null))
421
- ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
422
- expect(
423
- tree.dfs(node => node, 'pre', tree.root, IterationType.RECURSIVE, true).map(node => (node ? node.key : null))
424
- ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
452
+ expect(tree.dfs(node => node, 'pre', tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
453
+ 35,
454
+ 20,
455
+ 15,
456
+ null,
457
+ 16,
458
+ 29,
459
+ 28,
460
+ 30,
461
+ 40,
462
+ null,
463
+ 50,
464
+ 45,
465
+ 55
466
+ ]);
467
+ expect(tree.dfs(node => node, 'pre', tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
468
+ 35,
469
+ 20,
470
+ 15,
471
+ null,
472
+ 16,
473
+ 29,
474
+ 28,
475
+ 30,
476
+ 40,
477
+ null,
478
+ 50,
479
+ 45,
480
+ 55
481
+ ]);
425
482
 
426
483
  expect(tree.dfs(node => node.key, 'in')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
427
484
  expect(tree.dfs(node => node.key, 'post')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
428
- expect(tree.dfs(node => node.key, 'post', tree.root, IterationType.RECURSIVE)).toEqual([
485
+ expect(tree.dfs(node => node.key, 'post', tree.root, 'RECURSIVE')).toEqual([
429
486
  16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
430
487
  ]);
431
- expect(tree.bfs(node => node.key, tree.root, IterationType.RECURSIVE)).toEqual([
432
- 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
433
- ]);
434
- expect(tree.bfs(node => node.key, tree.root, IterationType.ITERATIVE)).toEqual([
435
- 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
436
- ]);
488
+ expect(tree.bfs(node => node.key, tree.root, 'RECURSIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
489
+ expect(tree.bfs(node => node.key, tree.root, 'ITERATIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
437
490
 
438
491
  expect(tree.listLevels(node => node.key)).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
439
492
 
440
- expect(tree.listLevels(node => node.key, tree.root, IterationType.RECURSIVE)).toEqual([
493
+ expect(tree.listLevels(node => node.key, tree.root, 'RECURSIVE')).toEqual([
441
494
  [35],
442
495
  [20, 40],
443
496
  [15, 29, 50],
444
497
  [16, 28, 30, 45, 55]
445
498
  ]);
446
- expect(tree.listLevels(node => (node ? node.key : null), tree.root, IterationType.ITERATIVE, true)).toEqual([
499
+ expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'ITERATIVE', true)).toEqual([
447
500
  [35],
448
501
  [20, 40],
449
502
  [15, 29, null, 50],
450
503
  [null, 16, 28, 30, 45, 55]
451
504
  ]);
452
- expect(tree.listLevels(node => (node ? node.key : null), tree.root, IterationType.RECURSIVE, true)).toEqual([
505
+ expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'RECURSIVE', true)).toEqual([
453
506
  [35],
454
507
  [20, 40],
455
508
  [15, 29, null, 50],
@@ -461,7 +514,7 @@ describe('BinaryTree', () => {
461
514
  let tree: BinaryTree<number, string>;
462
515
 
463
516
  beforeEach(() => {
464
- tree = new BinaryTree<number, string>([], { iterationType: IterationType.RECURSIVE });
517
+ tree = new BinaryTree<number, string>([], { iterationType: 'RECURSIVE' });
465
518
  });
466
519
 
467
520
  afterEach(() => {
@@ -533,8 +586,8 @@ describe('BinaryTree', () => {
533
586
  tree.add([7, 'C']);
534
587
 
535
588
  expect(tree.getHeight()).toBe(1);
536
- expect(tree.getHeight(undefined, IterationType.RECURSIVE)).toBe(1);
537
- expect(tree.getMinHeight(undefined, IterationType.RECURSIVE)).toBe(1);
589
+ expect(tree.getHeight(undefined, 'RECURSIVE')).toBe(1);
590
+ expect(tree.getMinHeight(undefined, 'RECURSIVE')).toBe(1);
538
591
  });
539
592
 
540
593
  it('should check if the tree is a binary search tree', () => {
@@ -604,7 +657,7 @@ describe('BinaryTree', () => {
604
657
  expect(nodes.length).toBe(1);
605
658
  expect(nodes[0].key).toBe(3);
606
659
 
607
- const nodesRec = tree.getNodes('B', node => node.value, false, tree.root, IterationType.RECURSIVE);
660
+ const nodesRec = tree.getNodes('B', node => node.value, false, tree.root, 'RECURSIVE');
608
661
 
609
662
  expect(nodesRec.length).toBe(1);
610
663
  expect(nodesRec[0].key).toBe(3);
@@ -615,19 +668,19 @@ describe('BinaryTree', () => {
615
668
  tree.add([3, 'B']);
616
669
  tree.add([7, 'C']);
617
670
 
618
- tree.iterationType = IterationType.ITERATIVE;
671
+ tree.iterationType = 'ITERATIVE';
619
672
  expect([...tree]).toEqual([
620
673
  [3, 'B'],
621
674
  [5, 'A'],
622
675
  [7, 'C']
623
676
  ]);
624
- tree.iterationType = IterationType.RECURSIVE;
677
+ tree.iterationType = 'RECURSIVE';
625
678
  expect([...tree]).toEqual([
626
679
  [3, 'B'],
627
680
  [5, 'A'],
628
681
  [7, 'C']
629
682
  ]);
630
- tree.iterationType = IterationType.ITERATIVE;
683
+ tree.iterationType = 'ITERATIVE';
631
684
 
632
685
  const result = tree.morris();
633
686
  expect(result).toEqual([3, 5, 7]);
@@ -1,4 +1,4 @@
1
- import { BinaryTreeNode, BST, BSTNode, BSTVariant, CP, IterationType } from '../../../../src';
1
+ import { BinaryTreeNode, BST, BSTNode } from '../../../../src';
2
2
  import { isDebugTest } from '../../../config';
3
3
 
4
4
  const isDebug = isDebugTest;
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
58
58
  expect(subTreeSum).toBe(70);
59
59
 
60
60
  let lesserSum = 0;
61
- bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
61
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
62
62
  expect(lesserSum).toBe(45);
63
63
 
64
64
  expect(node15).toBeInstanceOf(BSTNode);
@@ -261,7 +261,7 @@ describe('BST operations test', () => {
261
261
  expect(subTreeSum).toBe(70);
262
262
 
263
263
  let lesserSum = 0;
264
- objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
264
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
265
265
  expect(lesserSum).toBe(45);
266
266
 
267
267
  expect(node15).toBeInstanceOf(BSTNode);
@@ -411,7 +411,7 @@ describe('BST operations test', () => {
411
411
 
412
412
  describe('BST operations test recursively', () => {
413
413
  it('should perform various operations on a Binary Search Tree with numeric values', () => {
414
- const bst = new BST<number>([], { iterationType: IterationType.RECURSIVE });
414
+ const bst = new BST<number>([], { iterationType: 'RECURSIVE' });
415
415
  expect(bst).toBeInstanceOf(BST);
416
416
  bst.add([11, 11]);
417
417
  bst.add([3, 3]);
@@ -448,7 +448,7 @@ describe('BST operations test recursively', () => {
448
448
  expect(subTreeSum).toBe(70);
449
449
 
450
450
  let lesserSum = 0;
451
- bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
451
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
452
452
  expect(lesserSum).toBe(45);
453
453
 
454
454
  expect(node15).toBeInstanceOf(BSTNode);
@@ -649,7 +649,7 @@ describe('BST operations test recursively', () => {
649
649
  expect(subTreeSum).toBe(70);
650
650
 
651
651
  let lesserSum = 0;
652
- objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
652
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
653
653
  expect(lesserSum).toBe(45);
654
654
 
655
655
  expect(node15).toBeInstanceOf(BSTNode);
@@ -869,7 +869,7 @@ describe('BST isBST', function () {
869
869
  });
870
870
 
871
871
  test('isBST when variant is Max', () => {
872
- const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant: BSTVariant.INVERSE });
872
+ const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant: 'INVERSE' });
873
873
  bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
874
874
  expect(bst.isBST()).toBe(true);
875
875
  });
@@ -902,7 +902,7 @@ describe('BST Performance test', function () {
902
902
  node => {
903
903
  node.key - 1;
904
904
  },
905
- CP.lt,
905
+ 'LT',
906
906
  inputSize / 2
907
907
  );
908
908
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
@@ -932,10 +932,10 @@ describe('BST Performance test', function () {
932
932
  it('should dfs as sub tree traversal, null should be ignored', () => {
933
933
  const bst = new BST();
934
934
  bst.addMany([4, 2, 6, 1, 3, 5, 7]);
935
- expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
936
- expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), IterationType.RECURSIVE)).toEqual([6, 5, 7]);
937
- expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
938
- expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), IterationType.RECURSIVE)).toEqual([6, 5, 7]);
935
+ expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
936
+ expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
937
+ expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
938
+ expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
939
939
  });
940
940
  });
941
941
 
@@ -1,4 +1,4 @@
1
- import { AVLTree, BST, BSTVariant, IterationType, RedBlackTree, TreeMultiMap } from '../../../../src';
1
+ import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
2
2
 
3
3
  describe('Overall BinaryTree Test', () => {
4
4
  it('should perform various operations on BinaryTree', () => {
@@ -63,8 +63,8 @@ describe('Overall BinaryTree Test', () => {
63
63
 
64
64
  it('Should clone a BST works fine', () => {
65
65
  const bst = new BST<number>([3, 6, 7, 1, 9], {
66
- iterationType: IterationType.RECURSIVE,
67
- variant: BSTVariant.INVERSE,
66
+ iterationType: 'RECURSIVE',
67
+ variant: 'INVERSE',
68
68
  extractor: key => key
69
69
  });
70
70
  expect(bst.size).toBe(5);
@@ -104,8 +104,8 @@ describe('Overall BinaryTree Test', () => {
104
104
 
105
105
  it('Should clone a AVLTree works fine', () => {
106
106
  const avl = new AVLTree<number>([3, 6, 7, 1, 9], {
107
- iterationType: IterationType.RECURSIVE,
108
- variant: BSTVariant.INVERSE,
107
+ iterationType: 'RECURSIVE',
108
+ variant: 'INVERSE',
109
109
  extractor: key => key
110
110
  });
111
111
  expect(avl.size).toBe(5);
@@ -148,7 +148,7 @@ describe('Overall BinaryTree Test', () => {
148
148
 
149
149
  it('Should clone a TreeMultiMap works fine', () => {
150
150
  const tmm = new TreeMultiMap<number>([3, 6, 7, 1, 9], {
151
- iterationType: IterationType.RECURSIVE,
151
+ iterationType: 'RECURSIVE',
152
152
  extractor: key => key
153
153
  });
154
154
  expect(tmm.size).toBe(5);
@@ -197,7 +197,7 @@ describe('Overall BinaryTree Test', () => {
197
197
 
198
198
  it('Should clone a RedBlackTree works fine', () => {
199
199
  const rbTree = new RedBlackTree<number>([3, 6, 7, 1, 9], {
200
- iterationType: IterationType.RECURSIVE,
200
+ iterationType: 'RECURSIVE',
201
201
  extractor: key => key
202
202
  });
203
203
  expect(rbTree.size).toBe(5);
@@ -1,4 +1,4 @@
1
- import { BinaryTreeNode, BSTNode, IterationType, RBTNColor, RedBlackTree, RedBlackTreeNode } from '../../../../src';
1
+ import { BinaryTreeNode, BSTNode, RBTNColor, RedBlackTree, RedBlackTreeNode } from '../../../../src';
2
2
  import { getRandomInt, getRandomIntArray, magnitude } from '../../../utils';
3
3
  import { OrderedMap } from 'js-sdsl';
4
4
 
@@ -53,6 +53,11 @@ describe('RedBlackTree 1', () => {
53
53
 
54
54
  expect(rbTree.getNode(15)).toBe(undefined);
55
55
  });
56
+
57
+ it('should getNode performance O(log n)', () => {
58
+ for (let i = 0; i < 10; i++) rbTree.add(i);
59
+ rbTree.getNode(6);
60
+ });
56
61
  });
57
62
 
58
63
  describe('minimum', () => {
@@ -477,13 +482,13 @@ describe('RedBlackTree 2', () => {
477
482
 
478
483
  expect(rbTree.size).toBe(51);
479
484
  expect(rbTree.isBST()).toBe(true);
480
- expect(rbTree.isBST(rbTree.root, IterationType.RECURSIVE)).toBe(true);
485
+ expect(rbTree.isBST(rbTree.root, 'RECURSIVE')).toBe(true);
481
486
 
482
- expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.ITERATIVE)).toEqual([
487
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'ITERATIVE')).toEqual([
483
488
  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
489
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
485
490
  ]);
486
- expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.RECURSIVE)).toEqual([
491
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'RECURSIVE')).toEqual([
487
492
  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
493
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
489
494
  ]);
@@ -499,7 +504,7 @@ describe('RedBlackTree 2', () => {
499
504
 
500
505
  expect(rbTree.size).toBe(0);
501
506
  expect(rbTree.isBST()).toBe(true);
502
- expect(rbTree.dfs(n => n.key, 'in', rbTree.root, IterationType.ITERATIVE)).toEqual([]);
507
+ expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'ITERATIVE')).toEqual([]);
503
508
 
504
509
  rbTree.clear();
505
510
  for (let i = 0; i < 1000; i++) {