data-structure-typed 1.51.7 → 1.51.9

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 (123) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +1 -37
  4. package/benchmark/report.json +15 -387
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +103 -74
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +116 -93
  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.d.ts +82 -62
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.js +90 -71
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +318 -233
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.js +492 -392
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/bst.d.ts +204 -251
  15. package/dist/cjs/data-structures/binary-tree/bst.js +256 -358
  16. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +74 -85
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.js +111 -119
  19. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -76
  21. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  22. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  23. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +10 -15
  24. package/dist/cjs/data-structures/graph/abstract-graph.js +10 -15
  25. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  26. package/dist/cjs/data-structures/hash/hash-map.d.ts +31 -38
  27. package/dist/cjs/data-structures/hash/hash-map.js +40 -55
  28. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  29. package/dist/cjs/data-structures/heap/heap.d.ts +1 -3
  30. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  31. package/dist/cjs/data-structures/queue/deque.d.ts +2 -3
  32. package/dist/cjs/data-structures/queue/deque.js +2 -3
  33. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  34. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  35. package/dist/cjs/data-structures/trie/trie.d.ts +1 -1
  36. package/dist/cjs/data-structures/trie/trie.js +1 -1
  37. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  38. package/dist/cjs/interfaces/binary-tree.d.ts +7 -7
  39. package/dist/cjs/types/common.d.ts +2 -3
  40. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +4 -3
  41. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +4 -3
  42. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +6 -5
  43. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +6 -5
  44. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
  45. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -3
  46. package/dist/cjs/types/utils/utils.d.ts +10 -1
  47. package/dist/cjs/utils/utils.d.ts +2 -1
  48. package/dist/cjs/utils/utils.js +27 -1
  49. package/dist/cjs/utils/utils.js.map +1 -1
  50. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +103 -74
  51. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +116 -93
  52. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
  53. package/dist/mjs/data-structures/binary-tree/avl-tree.js +90 -71
  54. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +318 -233
  55. package/dist/mjs/data-structures/binary-tree/binary-tree.js +493 -393
  56. package/dist/mjs/data-structures/binary-tree/bst.d.ts +204 -251
  57. package/dist/mjs/data-structures/binary-tree/bst.js +252 -357
  58. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +74 -85
  59. package/dist/mjs/data-structures/binary-tree/rb-tree.js +111 -119
  60. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -76
  61. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  62. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +10 -15
  63. package/dist/mjs/data-structures/graph/abstract-graph.js +10 -15
  64. package/dist/mjs/data-structures/hash/hash-map.d.ts +31 -38
  65. package/dist/mjs/data-structures/hash/hash-map.js +41 -55
  66. package/dist/mjs/data-structures/heap/heap.d.ts +1 -3
  67. package/dist/mjs/data-structures/queue/deque.d.ts +2 -3
  68. package/dist/mjs/data-structures/queue/deque.js +2 -3
  69. package/dist/mjs/data-structures/trie/trie.d.ts +1 -1
  70. package/dist/mjs/data-structures/trie/trie.js +1 -1
  71. package/dist/mjs/interfaces/binary-tree.d.ts +7 -7
  72. package/dist/mjs/types/common.d.ts +2 -3
  73. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +4 -3
  74. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +4 -3
  75. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +6 -5
  76. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +6 -5
  77. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
  78. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -3
  79. package/dist/mjs/types/utils/utils.d.ts +10 -1
  80. package/dist/mjs/utils/utils.d.ts +2 -1
  81. package/dist/mjs/utils/utils.js +25 -0
  82. package/dist/umd/data-structure-typed.js +1427 -1343
  83. package/dist/umd/data-structure-typed.min.js +4 -4
  84. package/dist/umd/data-structure-typed.min.js.map +1 -1
  85. package/package.json +6 -6
  86. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +142 -100
  87. package/src/data-structures/binary-tree/avl-tree.ts +109 -80
  88. package/src/data-structures/binary-tree/binary-tree.ts +556 -433
  89. package/src/data-structures/binary-tree/bst.ts +286 -375
  90. package/src/data-structures/binary-tree/rb-tree.ts +132 -125
  91. package/src/data-structures/binary-tree/tree-multi-map.ts +129 -102
  92. package/src/data-structures/graph/abstract-graph.ts +10 -10
  93. package/src/data-structures/hash/hash-map.ts +42 -49
  94. package/src/data-structures/heap/heap.ts +1 -1
  95. package/src/data-structures/queue/deque.ts +2 -2
  96. package/src/data-structures/queue/queue.ts +1 -1
  97. package/src/data-structures/trie/trie.ts +2 -2
  98. package/src/interfaces/binary-tree.ts +11 -9
  99. package/src/types/common.ts +2 -3
  100. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +4 -3
  101. package/src/types/data-structures/binary-tree/avl-tree.ts +4 -3
  102. package/src/types/data-structures/binary-tree/binary-tree.ts +7 -6
  103. package/src/types/data-structures/binary-tree/bst.ts +6 -5
  104. package/src/types/data-structures/binary-tree/rb-tree.ts +4 -3
  105. package/src/types/data-structures/binary-tree/tree-multi-map.ts +4 -3
  106. package/src/types/utils/utils.ts +14 -1
  107. package/src/utils/utils.ts +20 -1
  108. package/test/integration/all-in-one.test.ts +2 -2
  109. package/test/integration/avl-tree.test.ts +2 -2
  110. package/test/integration/bst.test.ts +3 -3
  111. package/test/integration/index.html +95 -11
  112. package/test/performance/reportor.ts +2 -3
  113. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +75 -7
  114. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -2
  115. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +56 -0
  116. package/test/unit/data-structures/binary-tree/bst.test.ts +6 -6
  117. package/test/unit/data-structures/binary-tree/overall.test.ts +24 -20
  118. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +6 -6
  119. package/test/unit/data-structures/graph/directed-graph.test.ts +2 -2
  120. package/test/unit/utils/utils.test.ts +5 -0
  121. package/test/utils/big-o.ts +12 -6
  122. package/test/utils/console.ts +1 -1
  123. package/tsconfig-base.json +1 -0
@@ -28,7 +28,7 @@ describe('AVLTreeMultiMap count', () => {
28
28
  [3, 3]
29
29
  ]);
30
30
  tm.add([2, 2], undefined, 10);
31
- tm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
31
+ tm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
32
32
  tm.delete(2);
33
33
  expect(tm.count).toBe(12);
34
34
  expect(tm.getComputedCount()).toBe(16);
@@ -37,7 +37,7 @@ describe('AVLTreeMultiMap count', () => {
37
37
 
38
38
  describe('AVLTreeMultiMap operations test1', () => {
39
39
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
40
- const treeMultimap = new AVLTreeMultiMap();
40
+ const treeMultimap = new AVLTreeMultiMap<number>();
41
41
 
42
42
  expect(treeMultimap instanceof AVLTreeMultiMap);
43
43
  treeMultimap.add([11, 11]);
@@ -94,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
94
94
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
95
95
  expect(subTreeSum).toBe(31);
96
96
  let lesserSum = 0;
97
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
97
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
98
98
  expect(lesserSum).toBe(45);
99
99
 
100
100
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -105,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
105
105
  const node11 = treeMultimap.getNode(11);
106
106
  expect(node11 instanceof AVLTreeMultiMapNode);
107
107
  if (node11 instanceof AVLTreeMultiMapNode) {
108
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
108
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
109
109
  expect(allGreaterNodesAdded);
110
110
  }
111
111
 
@@ -348,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
348
348
  node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
349
349
  expect(subTreeSum).toBe(31);
350
350
  let lesserSum = 0;
351
- treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
351
+ treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
352
352
  expect(lesserSum).toBe(45);
353
353
 
354
354
  expect(node15 instanceof AVLTreeMultiMapNode);
@@ -359,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
359
359
  const node11 = treeMultimap.getNode(11);
360
360
  expect(node11 instanceof AVLTreeMultiMapNode);
361
361
  if (node11 instanceof AVLTreeMultiMapNode) {
362
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
362
+ const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
363
363
  expect(allGreaterNodesAdded);
364
364
  }
365
365
 
@@ -564,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
564
564
  }
565
565
  isDebug && console.log('---add', performance.now() - start);
566
566
  const startL = performance.now();
567
- treeMS.lesserOrGreaterTraverse(node => (node.count += 1), 'LT', inputSize / 2);
567
+ treeMS.lesserOrGreaterTraverse(node => (node.count += 1), -1, inputSize / 2);
568
568
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
569
569
  });
570
570
 
@@ -689,3 +689,71 @@ describe('AVLTreeMultiMap iterative methods test', () => {
689
689
  expect([...values]).toEqual(['a', 'b', 'c']);
690
690
  });
691
691
  });
692
+
693
+ describe('AVLTree toEntryFn', () => {
694
+ it('should toEntryFn 1', () => {
695
+ const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>([], {
696
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
697
+ });
698
+ tree.add({ obj: { id: 1 } });
699
+ tree.add({ obj: { id: 2 } });
700
+ tree.add({ obj: { id: 3 } });
701
+ tree.add({ obj: { id: 4 } });
702
+ tree.add({ obj: { id: 5 } });
703
+
704
+ const expected = [1, 2, 3, 4, 5];
705
+
706
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
707
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
708
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
709
+ });
710
+
711
+ it('should toEntryFn 2', () => {
712
+ const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>(
713
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
714
+ {
715
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
716
+ }
717
+ );
718
+
719
+ const expected = [1, 2, 3, 4, 5];
720
+
721
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
722
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
723
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
724
+ });
725
+
726
+ it('should toEntryFn throw error', () => {
727
+ expect(
728
+ () =>
729
+ new AVLTreeMultiMap<{ obj: { id: number } }, number>([
730
+ { obj: { id: 1 } },
731
+ { obj: { id: 2 } },
732
+ { obj: { id: 3 } },
733
+ { obj: { id: 4 } },
734
+ { obj: { id: 5 } }
735
+ ])
736
+ ).toThrowError(
737
+ 'When comparing two object types, it is necessary to customize a [comparator] function of options parameter during the instantiation of the data structure.'
738
+ );
739
+ });
740
+
741
+ it('should toEntryFn 3', () => {
742
+ const tree = new AVLTreeMultiMap<{ obj: { id: number } }, number>(
743
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
744
+ { comparator: (a, b) => a.obj.id - b.obj.id }
745
+ );
746
+
747
+ const expected = [
748
+ { obj: { id: 1 } },
749
+ { obj: { id: 2 } },
750
+ { obj: { id: 3 } },
751
+ { obj: { id: 4 } },
752
+ { obj: { id: 5 } }
753
+ ];
754
+
755
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
756
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
757
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
758
+ });
759
+ });
@@ -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), 'LT', 10);
31
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 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.
@@ -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), 'LT', 10);
139
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 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.
@@ -403,6 +403,62 @@ describe('BinaryTree Morris Traversal', () => {
403
403
  });
404
404
  });
405
405
 
406
+ describe('BinaryTree toEntryFn', () => {
407
+ it('should toEntryFn 1', () => {
408
+ const tree = new BinaryTree<number, number, { obj: { id: number } }>([], {
409
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
410
+ });
411
+ tree.add({ obj: { id: 1 } });
412
+ tree.add({ obj: { id: 2 } });
413
+ tree.add({ obj: { id: 3 } });
414
+ tree.add({ obj: { id: 4 } });
415
+ tree.add({ obj: { id: 5 } });
416
+
417
+ const expected = [4, 2, 5, 1, 3];
418
+
419
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
420
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
421
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
422
+ });
423
+
424
+ it('should toEntryFn 2', () => {
425
+ const tree = new BinaryTree<number, number, { obj: { id: number } }>(
426
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
427
+ {
428
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
429
+ }
430
+ );
431
+
432
+ const expected = [4, 2, 5, 1, 3];
433
+
434
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
435
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
436
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
437
+ });
438
+
439
+ it('should toEntryFn 3', () => {
440
+ const tree = new BinaryTree<{ obj: { id: number } }, number>([
441
+ { obj: { id: 1 } },
442
+ { obj: { id: 2 } },
443
+ { obj: { id: 3 } },
444
+ { obj: { id: 4 } },
445
+ { obj: { id: 5 } }
446
+ ]);
447
+
448
+ const expected = [
449
+ { obj: { id: 4 } },
450
+ { obj: { id: 2 } },
451
+ { obj: { id: 5 } },
452
+ { obj: { id: 1 } },
453
+ { obj: { id: 3 } }
454
+ ];
455
+
456
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
457
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
458
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
459
+ });
460
+ });
461
+
406
462
  describe('BinaryTree traversals', () => {
407
463
  const tree = new BinaryTree<number>();
408
464
 
@@ -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), 'LT', 10);
61
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 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), 'LT', 10);
264
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
265
265
  expect(lesserSum).toBe(45);
266
266
 
267
267
  expect(node15).toBeInstanceOf(BSTNode);
@@ -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), 'LT', 10);
451
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 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), 'LT', 10);
652
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 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: 'INVERSE' });
872
+ const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { comparator: (a, b) => b - a });
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
- 'LT',
905
+ -1,
906
906
  inputSize / 2
907
907
  );
908
908
  isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
@@ -2,7 +2,7 @@ import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
2
2
 
3
3
  describe('Overall BinaryTree Test', () => {
4
4
  it('should perform various operations on BinaryTree', () => {
5
- const bst = new BST();
5
+ const bst = new BST<number>();
6
6
  bst.add(11);
7
7
  bst.add(3);
8
8
  bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
@@ -64,16 +64,19 @@ describe('Overall BinaryTree Test', () => {
64
64
  it('Should clone a BST works fine', () => {
65
65
  const bst = new BST<number>([3, 6, 7, 1, 9], {
66
66
  iterationType: 'RECURSIVE',
67
- variant: 'INVERSE',
68
- extractor: key => key
67
+ comparator: (a, b) => {
68
+ if (a > b) return -1;
69
+ if (a < b) return 1;
70
+ return 0;
71
+ }
69
72
  });
70
73
  expect(bst.size).toBe(5);
71
74
  expect(bst.root?.key).toBe(6);
72
- expect(bst.root?.left?.key).toBe(7);
73
- expect(bst.root?.left?.left?.key).toBe(9);
74
- expect(bst.root?.right?.key).toBe(1);
75
- expect(bst.root?.right?.left?.key).toBe(3);
76
- expect(bst.getNodeByKey(7)?.left?.key).toBe(9);
75
+ expect(bst.root?.left?.key).toBe(9);
76
+ expect(bst.root?.left?.right?.key).toBe(7);
77
+ expect(bst.root?.right?.key).toBe(3);
78
+ expect(bst.root?.right?.right?.key).toBe(1);
79
+ expect(bst.getNodeByKey(9)?.right?.key).toBe(7);
77
80
  expect(bst.getHeight()).toBe(2);
78
81
  expect(bst.has(9)).toBe(true);
79
82
  expect(bst.has(7)).toBe(true);
@@ -82,31 +85,34 @@ describe('Overall BinaryTree Test', () => {
82
85
  expect(bst.size).toBe(4);
83
86
  expect(bst.root?.key).toBe(6);
84
87
  expect(bst.root?.left?.key).toBe(9);
85
- expect(bst.root?.right?.key).toBe(1);
86
- expect(bst.root?.right?.left?.key).toBe(3);
88
+ expect(bst.root?.right?.key).toBe(3);
89
+ expect(bst.root?.right?.right?.key).toBe(1);
87
90
  expect(bst.getNodeByKey(6)?.left?.key).toBe(9);
88
91
  expect(bst.getHeight()).toBe(2);
89
92
  expect(bst.has(9)).toBe(true);
90
93
  expect(bst.has(7)).toBe(false);
91
- expect(bst.bfs()).toEqual([6, 9, 1, 3]);
94
+ expect(bst.bfs()).toEqual([6, 9, 3, 1]);
92
95
  const clonedBST = bst.clone();
93
96
  expect(clonedBST.size).toBe(4);
94
97
  expect(clonedBST.root?.key).toBe(6);
95
98
  expect(clonedBST.root?.left?.key).toBe(9);
96
- expect(clonedBST.root?.right?.key).toBe(1);
97
- expect(clonedBST.root?.right?.left?.key).toBe(3);
99
+ expect(clonedBST.root?.right?.key).toBe(3);
100
+ expect(clonedBST.root?.right?.right?.key).toBe(1);
98
101
  expect(clonedBST.getNodeByKey(6)?.left?.key).toBe(9);
99
102
  expect(clonedBST.getHeight()).toBe(2);
100
103
  expect(clonedBST.has(9)).toBe(true);
101
104
  expect(clonedBST.has(7)).toBe(false);
102
- expect(clonedBST.bfs()).toEqual([6, 9, 1, 3]);
105
+ expect(clonedBST.bfs()).toEqual([6, 9, 3, 1]);
103
106
  });
104
107
 
105
108
  it('Should clone a AVLTree works fine', () => {
106
109
  const avl = new AVLTree<number>([3, 6, 7, 1, 9], {
107
110
  iterationType: 'RECURSIVE',
108
- variant: 'INVERSE',
109
- extractor: key => key
111
+ comparator: (a, b) => {
112
+ if (a > b) return -1;
113
+ if (a < b) return 1;
114
+ return 0;
115
+ }
110
116
  });
111
117
  expect(avl.size).toBe(5);
112
118
  avl.add(2);
@@ -148,8 +154,7 @@ describe('Overall BinaryTree Test', () => {
148
154
 
149
155
  it('Should clone a TreeMultiMap works fine', () => {
150
156
  const tmm = new TreeMultiMap<number>([3, 6, 7, 1, 9], {
151
- iterationType: 'RECURSIVE',
152
- extractor: key => key
157
+ iterationType: 'RECURSIVE'
153
158
  });
154
159
  expect(tmm.size).toBe(5);
155
160
  tmm.add(2);
@@ -197,8 +202,7 @@ describe('Overall BinaryTree Test', () => {
197
202
 
198
203
  it('Should clone a RedBlackTree works fine', () => {
199
204
  const rbTree = new RedBlackTree<number>([3, 6, 7, 1, 9], {
200
- iterationType: 'RECURSIVE',
201
- extractor: key => key
205
+ iterationType: 'RECURSIVE'
202
206
  });
203
207
  expect(rbTree.size).toBe(5);
204
208
  rbTree.add(2);
@@ -32,7 +32,7 @@ describe('TreeMultiMap count', () => {
32
32
  [2, 2],
33
33
  [3, 3]
34
34
  ]);
35
- tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
35
+ tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
36
36
  expect(tmm.getComputedCount()).toBe(7);
37
37
  expect(tmm.count).toBe(3);
38
38
  });
@@ -93,7 +93,7 @@ describe('TreeMultiMap operations test1', () => {
93
93
  });
94
94
 
95
95
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
96
- const tmm = new TreeMultiMap();
96
+ const tmm = new TreeMultiMap<number, number>();
97
97
 
98
98
  expect(tmm instanceof TreeMultiMap);
99
99
 
@@ -152,7 +152,7 @@ describe('TreeMultiMap operations test1', () => {
152
152
  node15 && tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
153
153
  expect(subTreeSum).toBe(45);
154
154
  let lesserSum = 0;
155
- tmm.lesserOrGreaterTraverse((node: TreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
155
+ tmm.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
156
156
  expect(lesserSum).toBe(45);
157
157
 
158
158
  expect(node15 instanceof TreeMultiMapNode);
@@ -163,7 +163,7 @@ describe('TreeMultiMap operations test1', () => {
163
163
  const node11 = tmm.getNode(11);
164
164
  expect(node11 instanceof TreeMultiMapNode);
165
165
  if (node11 instanceof TreeMultiMapNode) {
166
- const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
166
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
167
167
  expect(allGreaterNodesAdded);
168
168
  }
169
169
 
@@ -414,7 +414,7 @@ describe('TreeMultiMap operations test recursively1', () => {
414
414
  lesserSum += node.key;
415
415
  return node.key;
416
416
  },
417
- 'LT',
417
+ -1,
418
418
  10
419
419
  );
420
420
  expect(lesserSum).toBe(45);
@@ -427,7 +427,7 @@ describe('TreeMultiMap operations test recursively1', () => {
427
427
  const node11 = tmm.getNode(11);
428
428
  expect(node11 instanceof TreeMultiMapNode);
429
429
  if (node11 instanceof TreeMultiMapNode) {
430
- const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
430
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
431
431
  expect(allGreaterNodesAdded);
432
432
  }
433
433
 
@@ -132,11 +132,11 @@ class MyDirectedGraph<
132
132
  VO extends MyVertex<V> = MyVertex<V>,
133
133
  EO extends MyEdge<E> = MyEdge<E>
134
134
  > extends DirectedGraph<V, E, VO, EO> {
135
- createVertex(key: VertexKey, value: V): VO {
135
+ override createVertex(key: VertexKey, value: V): VO {
136
136
  return new MyVertex(key, value) as VO;
137
137
  }
138
138
 
139
- createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
139
+ override createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
140
140
  return new MyEdge(src, dest, weight ?? 1, value) as EO;
141
141
  }
142
142
 
@@ -0,0 +1,5 @@
1
+ describe('isNaN', () => {
2
+ it('should isNaN', function () {
3
+ expect(isNaN('string' as unknown as number)).toBe(true);
4
+ });
5
+ });
@@ -206,14 +206,20 @@ export function logBigOMetrics(target: any, propertyKey: string, descriptor: Pro
206
206
  return descriptor;
207
207
  }
208
208
 
209
- export const logPerf = function (fn: (...args: any[]) => any, args: any[], thisArg?: any) {
209
+ export const logPerf = function (
210
+ label: string = 'function running cost',
211
+ fn: (...args: any[]) => any,
212
+ args: any[],
213
+ thisArg?: any
214
+ ) {
210
215
  const start = performance.now();
216
+ let result: any;
211
217
  if (thisArg) {
212
- if (args && args.length > 0) fn.apply(thisArg, args);
213
- else fn.apply(thisArg);
218
+ if (args && args.length > 0) result = fn.apply(thisArg, args);
219
+ else result = fn.apply(thisArg);
214
220
  } else {
215
- if (args && args.length > 0) fn(...args);
216
- else fn();
221
+ if (args && args.length > 0) result = fn(...args);
222
+ else result = fn();
217
223
  }
218
- console.log(`function running cost : ${(performance.now() - start).toFixed(2)} ms`);
224
+ console.log(`${(performance.now() - start).toFixed(2)} ms, ${label}, ${result}`);
219
225
  };
@@ -1,4 +1,4 @@
1
- export const Color = {
1
+ export const ConsoleColor = {
2
2
  END: '\x1b[0m',
3
3
  BOLD: '\x1b[1m',
4
4
  DIM: '\x1b[2m',
@@ -16,6 +16,7 @@
16
16
  "strict": true, // Enable strict type checking, including enabling all strict options.
17
17
  "traceResolution": false, // Whether to trace the module resolution process.
18
18
  "types": ["node", "jest"], // Specifies the name of the type declaration file to include.
19
+ "noImplicitOverride": true,
19
20
  "typeRoots": ["node_modules/@types", "src/types", "test/types"]
20
21
  },
21
22
  "compileOnSave": false, // Whether to automatically compile when saving.