data-structure-typed 1.47.6 → 1.47.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 (142) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +10 -7
  2. package/.github/workflows/ci.yml +1 -1
  3. package/.github/workflows/release-package.yml +1 -1
  4. package/CHANGELOG.md +1 -1
  5. package/CODE_OF_CONDUCT.md +32 -10
  6. package/COMMANDS.md +3 -1
  7. package/CONTRIBUTING.md +4 -3
  8. package/README.md +188 -32
  9. package/SECURITY.md +1 -1
  10. package/benchmark/report.html +46 -1
  11. package/benchmark/report.json +563 -8
  12. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +40 -22
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.js +45 -36
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +105 -113
  16. package/dist/cjs/data-structures/binary-tree/binary-tree.js +133 -119
  17. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  18. package/dist/cjs/data-structures/binary-tree/bst.d.ts +53 -44
  19. package/dist/cjs/data-structures/binary-tree/bst.js +137 -154
  20. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  21. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +48 -15
  22. package/dist/cjs/data-structures/binary-tree/rb-tree.js +70 -33
  23. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  24. package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +6 -6
  25. package/dist/cjs/data-structures/binary-tree/segment-tree.js +7 -7
  26. package/dist/cjs/data-structures/binary-tree/segment-tree.js.map +1 -1
  27. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +26 -37
  28. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +58 -137
  29. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  30. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +17 -17
  31. package/dist/cjs/data-structures/graph/abstract-graph.js +30 -30
  32. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  33. package/dist/cjs/data-structures/graph/directed-graph.d.ts +24 -24
  34. package/dist/cjs/data-structures/graph/directed-graph.js +28 -28
  35. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  36. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +14 -14
  37. package/dist/cjs/data-structures/graph/undirected-graph.js +18 -18
  38. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  39. package/dist/cjs/data-structures/hash/hash-map.d.ts +2 -6
  40. package/dist/cjs/data-structures/hash/hash-map.js +5 -8
  41. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  42. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +28 -28
  43. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +33 -33
  44. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  45. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +21 -21
  46. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +27 -27
  47. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  48. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +4 -4
  49. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/queue/queue.d.ts +13 -13
  51. package/dist/cjs/data-structures/queue/queue.js +13 -13
  52. package/dist/cjs/data-structures/stack/stack.d.ts +6 -6
  53. package/dist/cjs/data-structures/stack/stack.js +7 -7
  54. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  55. package/dist/cjs/data-structures/trie/trie.d.ts +3 -0
  56. package/dist/cjs/data-structures/trie/trie.js +19 -4
  57. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  58. package/dist/cjs/interfaces/binary-tree.d.ts +3 -3
  59. package/dist/cjs/types/common.d.ts +6 -1
  60. package/dist/cjs/types/data-structures/graph/abstract-graph.d.ts +2 -2
  61. package/dist/cjs/types/data-structures/hash/hash-map.d.ts +1 -2
  62. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +40 -22
  63. package/dist/mjs/data-structures/binary-tree/avl-tree.js +45 -36
  64. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +105 -113
  65. package/dist/mjs/data-structures/binary-tree/binary-tree.js +133 -128
  66. package/dist/mjs/data-structures/binary-tree/bst.d.ts +53 -44
  67. package/dist/mjs/data-structures/binary-tree/bst.js +137 -154
  68. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +48 -15
  69. package/dist/mjs/data-structures/binary-tree/rb-tree.js +70 -33
  70. package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +6 -6
  71. package/dist/mjs/data-structures/binary-tree/segment-tree.js +7 -7
  72. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +26 -37
  73. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +59 -138
  74. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +17 -17
  75. package/dist/mjs/data-structures/graph/abstract-graph.js +30 -30
  76. package/dist/mjs/data-structures/graph/directed-graph.d.ts +24 -24
  77. package/dist/mjs/data-structures/graph/directed-graph.js +28 -28
  78. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +14 -14
  79. package/dist/mjs/data-structures/graph/undirected-graph.js +18 -18
  80. package/dist/mjs/data-structures/hash/hash-map.d.ts +2 -6
  81. package/dist/mjs/data-structures/hash/hash-map.js +5 -8
  82. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +28 -28
  83. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +33 -33
  84. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +21 -21
  85. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +27 -27
  86. package/dist/mjs/data-structures/linked-list/skip-linked-list.js +4 -4
  87. package/dist/mjs/data-structures/queue/queue.d.ts +13 -13
  88. package/dist/mjs/data-structures/queue/queue.js +13 -13
  89. package/dist/mjs/data-structures/stack/stack.d.ts +6 -6
  90. package/dist/mjs/data-structures/stack/stack.js +7 -7
  91. package/dist/mjs/data-structures/trie/trie.d.ts +3 -0
  92. package/dist/mjs/data-structures/trie/trie.js +20 -4
  93. package/dist/mjs/interfaces/binary-tree.d.ts +3 -3
  94. package/dist/mjs/types/common.d.ts +6 -1
  95. package/dist/mjs/types/data-structures/graph/abstract-graph.d.ts +2 -2
  96. package/dist/mjs/types/data-structures/hash/hash-map.d.ts +1 -2
  97. package/dist/umd/data-structure-typed.js +583 -627
  98. package/dist/umd/data-structure-typed.min.js +2 -2
  99. package/dist/umd/data-structure-typed.min.js.map +1 -1
  100. package/package.json +1 -1
  101. package/src/data-structures/binary-tree/avl-tree.ts +59 -39
  102. package/src/data-structures/binary-tree/binary-tree.ts +192 -180
  103. package/src/data-structures/binary-tree/bst.ts +157 -154
  104. package/src/data-structures/binary-tree/rb-tree.ts +78 -37
  105. package/src/data-structures/binary-tree/segment-tree.ts +10 -10
  106. package/src/data-structures/binary-tree/tree-multimap.ts +67 -145
  107. package/src/data-structures/graph/abstract-graph.ts +46 -46
  108. package/src/data-structures/graph/directed-graph.ts +40 -40
  109. package/src/data-structures/graph/undirected-graph.ts +26 -26
  110. package/src/data-structures/hash/hash-map.ts +8 -8
  111. package/src/data-structures/linked-list/doubly-linked-list.ts +45 -45
  112. package/src/data-structures/linked-list/singly-linked-list.ts +38 -38
  113. package/src/data-structures/linked-list/skip-linked-list.ts +4 -4
  114. package/src/data-structures/queue/queue.ts +13 -13
  115. package/src/data-structures/stack/stack.ts +9 -9
  116. package/src/data-structures/trie/trie.ts +23 -4
  117. package/src/interfaces/binary-tree.ts +3 -3
  118. package/src/types/common.ts +11 -1
  119. package/src/types/data-structures/graph/abstract-graph.ts +2 -2
  120. package/src/types/data-structures/hash/hash-map.ts +1 -2
  121. package/test/integration/{all-in-one.ts → all-in-one.test.ts} +1 -1
  122. package/test/integration/index.html +158 -2
  123. package/test/performance/data-structures/comparison/comparison.test.ts +5 -5
  124. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
  125. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +1 -1
  126. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +19 -19
  127. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +50 -51
  128. package/test/unit/data-structures/binary-tree/bst.test.ts +49 -54
  129. package/test/unit/data-structures/binary-tree/overall.test.ts +17 -18
  130. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +3 -3
  131. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +1 -1
  132. package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +118 -66
  133. package/test/unit/data-structures/graph/abstract-graph.test.ts +4 -4
  134. package/test/unit/data-structures/graph/directed-graph.test.ts +10 -10
  135. package/test/unit/data-structures/graph/undirected-graph.test.ts +3 -3
  136. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +14 -14
  137. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +3 -3
  138. package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
  139. package/test/unit/data-structures/queue/deque.test.ts +1 -1
  140. package/test/unit/data-structures/stack/stack.test.ts +2 -2
  141. package/test/unit/unrestricted-interconversion.test.ts +61 -5
  142. package/tsconfig-cjs.json +1 -1
@@ -7,10 +7,10 @@ describe('BST operations test', () => {
7
7
  it('should perform various operations on a Binary Search Tree with numeric values', () => {
8
8
  const bst = new BST();
9
9
  expect(bst).toBeInstanceOf(BST);
10
- bst.add(11, 11);
11
- bst.add(3, 3);
12
- const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
13
- bst.addMany(idsAndValues, idsAndValues, false);
10
+ bst.add([11, 11]);
11
+ bst.add([3, 3]);
12
+ const idsAndValues: [number, number][] = [[15, 15], [1, 1], [8, 8], [13, 13], [16, 16], [2, 2], [6, 6], [9, 9], [12, 12], [14, 14], [4, 4], [7, 7], [10, 10], [5, 5]];
13
+ bst.addMany(idsAndValues, false);
14
14
  expect(bst.root).toBeInstanceOf(BSTNode);
15
15
 
16
16
  if (bst.root) expect(bst.root.key).toBe(11);
@@ -191,30 +191,26 @@ describe('BST operations test', () => {
191
191
  it('should perform various operations on a Binary Search Tree with object values', () => {
192
192
  const objBST = new BST<{ key: number; keyA: number }>();
193
193
  expect(objBST).toBeInstanceOf(BST);
194
- objBST.add(11, { key: 11, keyA: 11 });
195
- objBST.add(3, { key: 3, keyA: 3 });
196
- const values = [
197
- { key: 15, keyA: 15 },
198
- { key: 1, keyA: 1 },
199
- { key: 8, keyA: 8 },
200
- { key: 13, keyA: 13 },
201
- { key: 16, keyA: 16 },
202
- { key: 2, keyA: 2 },
203
- { key: 6, keyA: 6 },
204
- { key: 9, keyA: 9 },
205
- { key: 12, keyA: 12 },
206
- { key: 14, keyA: 14 },
207
- { key: 4, keyA: 4 },
208
- { key: 7, keyA: 7 },
209
- { key: 10, keyA: 10 },
210
- { key: 5, keyA: 5 }
194
+ objBST.add([11, { key: 11, keyA: 11 }]);
195
+ objBST.add([3, { key: 3, keyA: 3 }]);
196
+ const values: [number, { key: number; keyA: number }][] = [
197
+ [15, { key: 15, keyA: 15 }],
198
+ [1, { key: 1, keyA: 1 }],
199
+ [8, { key: 8, keyA: 8 }],
200
+ [13, { key: 13, keyA: 13 }],
201
+ [16, { key: 16, keyA: 16 }],
202
+ [2, { key: 2, keyA: 2 }],
203
+ [6, { key: 6, keyA: 6 }],
204
+ [9, { key: 9, keyA: 9 }],
205
+ [12, { key: 12, keyA: 12 }],
206
+ [14, { key: 14, keyA: 14 }],
207
+ [4, { key: 4, keyA: 4 }],
208
+ [7, { key: 7, keyA: 7 }],
209
+ [10, { key: 10, keyA: 10 }],
210
+ [5, { key: 5, keyA: 5 }]
211
211
  ];
212
212
 
213
- objBST.addMany(
214
- values.map(item => item.key),
215
- values,
216
- false
217
- );
213
+ objBST.addMany(values, false);
218
214
 
219
215
  expect(objBST.root).toBeInstanceOf(BSTNode);
220
216
 
@@ -395,12 +391,12 @@ describe('BST operations test', () => {
395
391
 
396
392
  describe('BST operations test recursively', () => {
397
393
  it('should perform various operations on a Binary Search Tree with numeric values', () => {
398
- const bst = new BST([], { iterationType: IterationType.RECURSIVE });
394
+ const bst = new BST<number>([], { iterationType: IterationType.RECURSIVE });
399
395
  expect(bst).toBeInstanceOf(BST);
400
- bst.add(11, 11);
401
- bst.add(3, 3);
396
+ bst.add([11, 11]);
397
+ bst.add([3, 3]);
402
398
  const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
403
- bst.addMany(idsAndValues, idsAndValues, false);
399
+ bst.addMany(idsAndValues, false);
404
400
  expect(bst.root).toBeInstanceOf(BSTNode);
405
401
 
406
402
  if (bst.root) expect(bst.root.key).toBe(11);
@@ -414,11 +410,11 @@ describe('BST operations test recursively', () => {
414
410
  expect(node6 && bst.getDepth(6)).toBe(3);
415
411
 
416
412
  const nodeId10 = bst.getNode(10);
417
- expect(bst.get(10)).toBe(10);
413
+ expect(bst.get(10)).toBe(undefined);
418
414
  expect(nodeId10?.key).toBe(10);
419
415
 
420
416
  const nodeVal9 = bst.getNode(9, node => node.value);
421
- expect(nodeVal9?.key).toBe(9);
417
+ expect(nodeVal9?.key).toBe(undefined);
422
418
 
423
419
  const leftMost = bst.getLeftMost();
424
420
  expect(leftMost?.key).toBe(1);
@@ -582,27 +578,26 @@ describe('BST operations test recursively', () => {
582
578
  it('should perform various operations on a Binary Search Tree with object values', () => {
583
579
  const objBST = new BST<{ key: number; keyA: number }>();
584
580
  expect(objBST).toBeInstanceOf(BST);
585
- objBST.add(11, { key: 11, keyA: 11 });
586
- objBST.add(3, { key: 3, keyA: 3 });
587
- const values = [
588
- { key: 15, keyA: 15 },
589
- { key: 1, keyA: 1 },
590
- { key: 8, keyA: 8 },
591
- { key: 13, keyA: 13 },
592
- { key: 16, keyA: 16 },
593
- { key: 2, keyA: 2 },
594
- { key: 6, keyA: 6 },
595
- { key: 9, keyA: 9 },
596
- { key: 12, keyA: 12 },
597
- { key: 14, keyA: 14 },
598
- { key: 4, keyA: 4 },
599
- { key: 7, keyA: 7 },
600
- { key: 10, keyA: 10 },
601
- { key: 5, keyA: 5 }
581
+ objBST.add([11, { key: 11, keyA: 11 }]);
582
+ objBST.add([3, { key: 3, keyA: 3 }]);
583
+ const values: [number, { key: number; keyA: number }][] = [
584
+ [15, { key: 15, keyA: 15 }],
585
+ [1, { key: 1, keyA: 1 }],
586
+ [8, { key: 8, keyA: 8 }],
587
+ [13, { key: 13, keyA: 13 }],
588
+ [16, { key: 16, keyA: 16 }],
589
+ [2, { key: 2, keyA: 2 }],
590
+ [6, { key: 6, keyA: 6 }],
591
+ [9, { key: 9, keyA: 9 }],
592
+ [12, { key: 12, keyA: 12 }],
593
+ [14, { key: 14, keyA: 14 }],
594
+ [4, { key: 4, keyA: 4 }],
595
+ [7, { key: 7, keyA: 7 }],
596
+ [10, { key: 10, keyA: 10 }],
597
+ [5, { key: 5, keyA: 5 }]
602
598
  ];
603
599
 
604
600
  objBST.addMany(
605
- values.map(item => item.key),
606
601
  values,
607
602
  false
608
603
  );
@@ -834,7 +829,7 @@ describe('BST Performance test', function () {
834
829
 
835
830
  it('should the lastKey of a BST to be the largest key', function () {
836
831
  const bst = new BST();
837
- bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], undefined, false);
832
+ bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], false);
838
833
  expect(bst.lastKey()).toBe(9);
839
834
  });
840
835
 
@@ -856,9 +851,9 @@ describe('BST iterative methods test', () => {
856
851
  let bst: BST<string>;
857
852
  beforeEach(() => {
858
853
  bst = new BST();
859
- bst.add(1, 'a');
860
- bst.add(2, 'b');
861
- bst.add(3, 'c');
854
+ bst.add([1, 'a']);
855
+ bst.add([2, 'b']);
856
+ bst.add([3, 'c']);
862
857
  });
863
858
 
864
859
  test('The node obtained by get Node should match the node type', () => {
@@ -5,7 +5,7 @@ describe('Overall BinaryTree Test', () => {
5
5
  const bst = new BST();
6
6
  bst.add(11);
7
7
  bst.add(3);
8
- bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
8
+ bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], false);
9
9
  bst.size === 16; // true
10
10
  expect(bst.size).toBe(16); // true
11
11
  bst.has(6); // true
@@ -30,26 +30,25 @@ describe('Overall BinaryTree Test', () => {
30
30
  expect(bfsIDs[0]).toBe(11);
31
31
 
32
32
  const objBST = new BST<{ key: number; keyA: number }>();
33
- objBST.add(11, { key: 11, keyA: 11 });
34
- objBST.add(3, { key: 3, keyA: 3 });
33
+ objBST.add([11, { key: 11, keyA: 11 }]);
34
+ objBST.add([3, { key: 3, keyA: 3 }]);
35
35
 
36
36
  objBST.addMany(
37
- [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
38
37
  [
39
- { key: 15, keyA: 15 },
40
- { key: 1, keyA: 1 },
41
- { key: 8, keyA: 8 },
42
- { key: 13, keyA: 13 },
43
- { key: 16, keyA: 16 },
44
- { key: 2, keyA: 2 },
45
- { key: 6, keyA: 6 },
46
- { key: 9, keyA: 9 },
47
- { key: 12, keyA: 12 },
48
- { key: 14, keyA: 14 },
49
- { key: 4, keyA: 4 },
50
- { key: 7, keyA: 7 },
51
- { key: 10, keyA: 10 },
52
- { key: 5, keyA: 5 }
38
+ [15, { key: 15, keyA: 15 }],
39
+ [1, { key: 1, keyA: 1 }],
40
+ [8, { key: 8, keyA: 8 }],
41
+ [13, { key: 13, keyA: 13 }],
42
+ [16, { key: 16, keyA: 16 }],
43
+ [2, { key: 2, keyA: 2 }],
44
+ [6, { key: 6, keyA: 6 }],
45
+ [9, { key: 9, keyA: 9 }],
46
+ [12, { key: 12, keyA: 12 }],
47
+ [14, { key: 14, keyA: 14 }],
48
+ [4, { key: 4, keyA: 4 }],
49
+ [7, { key: 7, keyA: 7 }],
50
+ [10, { key: 10, keyA: 10 }],
51
+ [5, { key: 5, keyA: 5 }]
53
52
  ]
54
53
  );
55
54
 
@@ -510,9 +510,9 @@ describe('RedBlackTree iterative methods test', () => {
510
510
  let rbTree: RedBlackTree<string>;
511
511
  beforeEach(() => {
512
512
  rbTree = new RedBlackTree();
513
- rbTree.add(1, 'a');
514
- rbTree.add(2, 'b');
515
- rbTree.add(3, 'c');
513
+ rbTree.add([1, 'a']);
514
+ rbTree.add([2, 'b']);
515
+ rbTree.add([3, 'c']);
516
516
  });
517
517
 
518
518
  test('The node obtained by get Node should match the node type', () => {
@@ -37,7 +37,7 @@ describe('SegmentTree', () => {
37
37
  it('should handle an empty input array', () => {
38
38
  // Check behavior when dealing with an empty input array
39
39
  const emptySegmentTree = new SegmentTree([]);
40
- expect(emptySegmentTree.root).toBe(null);
40
+ expect(emptySegmentTree.root).toBe(undefined);
41
41
  expect(emptySegmentTree.querySumByRange(0, 2)).toBe(0); // Sum of an empty array should be 0
42
42
  });
43
43
 
@@ -3,15 +3,52 @@ import { isDebugTest } from '../../../config';
3
3
 
4
4
  const isDebug = isDebugTest;
5
5
 
6
- describe('TreeMultimap operations test', () => {
7
- it('should perform various operations on a Binary Search Tree with numeric values', () => {
6
+ describe('TreeMultimap count', () => {
7
+ let tm: TreeMultimap<number>;
8
+ beforeEach(() => {
9
+ tm = new TreeMultimap<number>();
10
+
11
+ })
12
+ it('Should added isolated node count ', () => {
13
+ tm.addMany([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]);
14
+ const newNode = new TreeMultimapNode(3, 33, 10);
15
+ tm.add(newNode);
16
+ expect(tm.count).toBe(15)
17
+ })
18
+
19
+ it('Should count', () => {
20
+ tm.addMany([[1, 1], [2, 2], [3, 3]]);
21
+ tm.lesserOrGreaterTraverse(node => node.count += 2, CP.gt, 1);
22
+ expect(tm.count).toBe(7)
23
+ })
24
+ })
25
+
26
+ describe('TreeMultimap operations test1', () => {
27
+ it('should perform various operations on a Binary Search Tree with numeric values1', () => {
8
28
  const treeMultimap = new TreeMultimap();
9
29
 
10
30
  expect(treeMultimap instanceof TreeMultimap);
11
- treeMultimap.add(11, 11);
12
- treeMultimap.add(3, 3);
13
- const idAndValues = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
14
- treeMultimap.addMany(idAndValues, idAndValues);
31
+ treeMultimap.add([11, 11]);
32
+ treeMultimap.add([3, 3]);
33
+ const idAndValues: [number, number][] = [
34
+ [11, 11],
35
+ [3, 3],
36
+ [15, 15],
37
+ [1, 1],
38
+ [8, 8],
39
+ [13, 13],
40
+ [16, 16],
41
+ [2, 2],
42
+ [6, 6],
43
+ [9, 9],
44
+ [12, 12],
45
+ [14, 14],
46
+ [4, 4],
47
+ [7, 7],
48
+ [10, 10],
49
+ [5, 5]
50
+ ];
51
+ treeMultimap.addMany(idAndValues);
15
52
  expect(treeMultimap.root instanceof TreeMultimapNode);
16
53
 
17
54
  if (treeMultimap.root) expect(treeMultimap.root.key == 11);
@@ -21,8 +58,8 @@ describe('TreeMultimap operations test', () => {
21
58
 
22
59
  expect(treeMultimap.has(6));
23
60
 
24
- expect(treeMultimap.getHeight(6)).toBe(3);
25
- expect(treeMultimap.getDepth(6)).toBe(1);
61
+ expect(treeMultimap.getHeight(6)).toBe(4);
62
+ expect(treeMultimap.getDepth(6)).toBe(0);
26
63
  const nodeId10 = treeMultimap.getNode(10);
27
64
  expect(nodeId10?.key).toBe(10);
28
65
 
@@ -39,14 +76,14 @@ describe('TreeMultimap operations test', () => {
39
76
 
40
77
  const node15 = treeMultimap.getNode(15);
41
78
  const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
42
- expect(minNodeBySpecificNode?.key).toBe(12);
79
+ expect(minNodeBySpecificNode?.key).toBe(15);
43
80
 
44
81
  let subTreeSum = 0;
45
82
  node15 && treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (subTreeSum += node.key), 15);
46
- expect(subTreeSum).toBe(70);
83
+ expect(subTreeSum).toBe(31);
47
84
  let lesserSum = 0;
48
85
  treeMultimap.lesserOrGreaterTraverse((node: TreeMultimapNode<number>) => (lesserSum += node.key), CP.lt, 10);
49
- expect(lesserSum).toBe(45);
86
+ expect(lesserSum).toBe(21);
50
87
 
51
88
  expect(node15 instanceof TreeMultimapNode);
52
89
  if (node15 instanceof TreeMultimapNode) {
@@ -203,39 +240,38 @@ describe('TreeMultimap operations test', () => {
203
240
  expect(bfsNodes[1].key).toBe(2);
204
241
  expect(bfsNodes[2].key).toBe(16);
205
242
 
206
- expect(treeMultimap.count).toBe(9);
243
+ expect(treeMultimap.count).toBe(4);
207
244
  });
208
245
 
209
246
  it('should perform various operations on a Binary Search Tree with object values', () => {
210
247
  const objTreeMultimap = new TreeMultimap<{ key: number; keyA: number }>();
211
248
  expect(objTreeMultimap).toBeInstanceOf(TreeMultimap);
212
- objTreeMultimap.add(11, { key: 11, keyA: 11 });
213
- objTreeMultimap.add(3, { key: 3, keyA: 3 });
214
- const values = [
215
- { key: 15, keyA: 15 },
216
- { key: 1, keyA: 1 },
217
- { key: 8, keyA: 8 },
218
- { key: 13, keyA: 13 },
219
- { key: 16, keyA: 16 },
220
- { key: 2, keyA: 2 },
221
- { key: 6, keyA: 6 },
222
- { key: 9, keyA: 9 },
223
- { key: 12, keyA: 12 },
224
- { key: 14, keyA: 14 },
225
- { key: 4, keyA: 4 },
226
- { key: 7, keyA: 7 },
227
- { key: 10, keyA: 10 },
228
- { key: 5, keyA: 5 }
249
+ objTreeMultimap.add([11, { key: 11, keyA: 11 }]);
250
+ objTreeMultimap.add([3, { key: 3, keyA: 3 }]);
251
+ const values: [number, { key: number, keyA: number }][] = [
252
+ [15, { key: 15, keyA: 15 }],
253
+ [1, { key: 1, keyA: 1 }],
254
+ [8, { key: 8, keyA: 8 }],
255
+ [13, { key: 13, keyA: 13 }],
256
+ [16, { key: 16, keyA: 16 }],
257
+ [2, { key: 2, keyA: 2 }],
258
+ [6, { key: 6, keyA: 6 }],
259
+ [9, { key: 9, keyA: 9 }],
260
+ [12, { key: 12, keyA: 12 }],
261
+ [14, { key: 14, keyA: 14 }],
262
+ [4, { key: 4, keyA: 4 }],
263
+ [7, { key: 7, keyA: 7 }],
264
+ [10, { key: 10, keyA: 10 }],
265
+ [5, { key: 5, keyA: 5 }]
229
266
  ];
230
267
 
231
268
  objTreeMultimap.addMany(
232
- values.map(item => item.key),
233
269
  values
234
270
  );
235
271
 
236
272
  expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
237
273
 
238
- if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(11);
274
+ if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(6);
239
275
 
240
276
  expect(objTreeMultimap.count).toBe(16);
241
277
 
@@ -243,26 +279,43 @@ describe('TreeMultimap operations test', () => {
243
279
  });
244
280
  });
245
281
 
246
- describe('TreeMultimap operations test recursively', () => {
247
- it('should perform various operations on a Binary Search Tree with numeric values', () => {
248
- const treeMultimap = new TreeMultimap([], { iterationType: IterationType.RECURSIVE });
282
+ describe('TreeMultimap operations test recursively1', () => {
283
+ it('should perform various operations on a Binary Search Tree with numeric values1', () => {
284
+ const treeMultimap = new TreeMultimap<number>([], { iterationType: IterationType.RECURSIVE });
249
285
 
250
286
  expect(treeMultimap instanceof TreeMultimap);
251
- treeMultimap.add(11, 11);
252
- treeMultimap.add(3, 3);
253
- const idAndValues = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
254
- treeMultimap.addMany(idAndValues, idAndValues);
255
- expect(treeMultimap.root instanceof TreeMultimapNode);
287
+ treeMultimap.add([11, 11]);
288
+ treeMultimap.add([3, 3]);
289
+ const idAndValues: [number, number][] = [
290
+ [11, 11],
291
+ [3, 3],
292
+ [15, 15],
293
+ [1, 1],
294
+ [8, 8],
295
+ [13, 13],
296
+ [16, 16],
297
+ [2, 2],
298
+ [6, 6],
299
+ [9, 9],
300
+ [12, 12],
301
+ [14, 14],
302
+ [4, 4],
303
+ [7, 7],
304
+ [10, 10],
305
+ [5, 5]
306
+ ];
307
+ treeMultimap.addMany(idAndValues);
308
+ expect(treeMultimap.root).toBeInstanceOf(TreeMultimapNode);
256
309
 
257
- if (treeMultimap.root) expect(treeMultimap.root.key == 11);
310
+ if (treeMultimap.root) expect(treeMultimap.root.key).toBe(6);
258
311
 
259
312
  expect(treeMultimap.size).toBe(16);
260
313
  expect(treeMultimap.count).toBe(18);
261
314
 
262
315
  expect(treeMultimap.has(6));
263
316
 
264
- expect(treeMultimap.getHeight(6)).toBe(3);
265
- expect(treeMultimap.getDepth(6)).toBe(1);
317
+ expect(treeMultimap.getHeight(6)).toBe(4);
318
+ expect(treeMultimap.getDepth(6)).toBe(0);
266
319
  const nodeId10 = treeMultimap.getNode(10);
267
320
  expect(nodeId10?.key).toBe(10);
268
321
 
@@ -279,14 +332,14 @@ describe('TreeMultimap operations test recursively', () => {
279
332
 
280
333
  const node15 = treeMultimap.getNode(15);
281
334
  const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
282
- expect(minNodeBySpecificNode?.key).toBe(12);
335
+ expect(minNodeBySpecificNode?.key).toBe(15);
283
336
 
284
337
  let subTreeSum = 0;
285
338
  node15 && treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (subTreeSum += node.key), 15);
286
- expect(subTreeSum).toBe(70);
339
+ expect(subTreeSum).toBe(31);
287
340
  let lesserSum = 0;
288
341
  treeMultimap.lesserOrGreaterTraverse((node: TreeMultimapNode<number>) => (lesserSum += node.key), CP.lt, 10);
289
- expect(lesserSum).toBe(45);
342
+ expect(lesserSum).toBe(21);
290
343
 
291
344
  expect(node15 instanceof TreeMultimapNode);
292
345
  if (node15 instanceof TreeMultimapNode) {
@@ -303,7 +356,7 @@ describe('TreeMultimap operations test recursively', () => {
303
356
  const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
304
357
  expect(dfsInorderNodes[0].key).toBe(1);
305
358
  expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
306
- expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
359
+ expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
307
360
 
308
361
  treeMultimap.perfectlyBalance();
309
362
 
@@ -443,39 +496,38 @@ describe('TreeMultimap operations test recursively', () => {
443
496
  expect(bfsNodes[1].key).toBe(2);
444
497
  expect(bfsNodes[2].key).toBe(16);
445
498
 
446
- expect(treeMultimap.count).toBe(9);
499
+ expect(treeMultimap.count).toBe(4);
447
500
  });
448
501
 
449
502
  it('should perform various operations on a Binary Search Tree with object values', () => {
450
503
  const objTreeMultimap = new TreeMultimap<{ key: number; keyA: number }>();
451
504
  expect(objTreeMultimap).toBeInstanceOf(TreeMultimap);
452
- objTreeMultimap.add(11, { key: 11, keyA: 11 });
453
- objTreeMultimap.add(3, { key: 3, keyA: 3 });
454
- const values = [
455
- { key: 15, keyA: 15 },
456
- { key: 1, keyA: 1 },
457
- { key: 8, keyA: 8 },
458
- { key: 13, keyA: 13 },
459
- { key: 16, keyA: 16 },
460
- { key: 2, keyA: 2 },
461
- { key: 6, keyA: 6 },
462
- { key: 9, keyA: 9 },
463
- { key: 12, keyA: 12 },
464
- { key: 14, keyA: 14 },
465
- { key: 4, keyA: 4 },
466
- { key: 7, keyA: 7 },
467
- { key: 10, keyA: 10 },
468
- { key: 5, keyA: 5 }
505
+ objTreeMultimap.add([11, { key: 11, keyA: 11 }]);
506
+ objTreeMultimap.add([3, { key: 3, keyA: 3 }]);
507
+ const values: [number, { key: number; keyA: number }][] = [
508
+ [15, { key: 15, keyA: 15 }],
509
+ [1, { key: 1, keyA: 1 }],
510
+ [8, { key: 8, keyA: 8 }],
511
+ [13, { key: 13, keyA: 13 }],
512
+ [16, { key: 16, keyA: 16 }],
513
+ [2, { key: 2, keyA: 2 }],
514
+ [6, { key: 6, keyA: 6 }],
515
+ [9, { key: 9, keyA: 9 }],
516
+ [12, { key: 12, keyA: 12 }],
517
+ [14, { key: 14, keyA: 14 }],
518
+ [4, { key: 4, keyA: 4 }],
519
+ [7, { key: 7, keyA: 7 }],
520
+ [10, { key: 10, keyA: 10 }],
521
+ [5, { key: 5, keyA: 5 }]
469
522
  ];
470
523
 
471
524
  objTreeMultimap.addMany(
472
- values.map(item => item.key),
473
525
  values
474
526
  );
475
527
 
476
528
  expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
477
529
 
478
- if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(11);
530
+ if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(6);
479
531
 
480
532
  expect(objTreeMultimap.count).toBe(16);
481
533
 
@@ -36,11 +36,11 @@ class MyGraph<
36
36
  return new MyEdge(srcOrV1, destOrV2, weight, value) as EO;
37
37
  }
38
38
 
39
- deleteEdge(edge: EO): EO | null {
39
+ deleteEdge(edge: EO): EO | undefined {
40
40
  return edge;
41
41
  }
42
42
 
43
- getEdge(srcOrKey: VertexKey, destOrKey: VertexKey): EO | null {
43
+ getEdge(srcOrKey: VertexKey, destOrKey: VertexKey): EO | undefined {
44
44
  return new MyEdge(srcOrKey, destOrKey) as EO;
45
45
  }
46
46
 
@@ -62,8 +62,8 @@ class MyGraph<
62
62
  return [new MyVertex(a, 'b') as VO];
63
63
  }
64
64
 
65
- getEndsOfEdge(edge: EO): [VO, VO] | null {
66
- return edge ? null : null;
65
+ getEndsOfEdge(edge: EO): [VO, VO] | undefined {
66
+ return edge ? undefined : undefined;
67
67
  }
68
68
 
69
69
  protected _addEdgeOnly(edge: EO): boolean {
@@ -196,7 +196,7 @@ describe('Inherit from DirectedGraph and perform operations', () => {
196
196
  expect(edge1).toBeInstanceOf(MyEdge);
197
197
  expect(edge1.src).toBe(1);
198
198
  expect(edge1).toEqual(edge2);
199
- expect(edge3).toBeNull();
199
+ expect(edge3).toBe(undefined);
200
200
  }
201
201
  });
202
202
 
@@ -217,7 +217,7 @@ describe('Inherit from DirectedGraph and perform operations', () => {
217
217
  removedEdge && expect(removedEdge.value).toBe('edge-data1-2');
218
218
  removedEdge && expect(removedEdge.src).toBe(1);
219
219
  }
220
- expect(edgeAfterRemoval).toBeNull();
220
+ expect(edgeAfterRemoval).toBe(undefined);
221
221
  });
222
222
 
223
223
  it('Topological sort', () => {
@@ -303,7 +303,7 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
303
303
 
304
304
  myGraph.addEdge(new MyEdge(7, 3, 73, 'edge-data7-3'));
305
305
  const topologicalSorted = myGraph.topologicalSort();
306
- expect(topologicalSorted).toBeNull();
306
+ expect(topologicalSorted).toBe(undefined);
307
307
 
308
308
  const minPath1to7 = myGraph.getMinPathBetween(1, 7);
309
309
 
@@ -378,11 +378,11 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
378
378
 
379
379
  expect(predecessor).toBeInstanceOf(Array);
380
380
  expect(predecessor.length).toBe(9);
381
- expect(predecessor[0]).toEqual([vertex2, null, vertex2, null, vertex3, null, vertex4, null, null]);
382
- expect(predecessor[1]).toEqual([null, vertex1, null, vertex1, vertex3, null, vertex4, null, vertex1]);
383
- expect(predecessor[5]).toEqual([null, null, null, null, null, null, null, null, null]);
384
- expect(predecessor[7]).toEqual([null, null, null, null, null, null, null, null, null]);
385
- expect(predecessor[8]).toEqual([vertex7, vertex7, vertex7, vertex7, vertex7, null, null, null, vertex7]);
381
+ expect(predecessor[0]).toEqual([vertex2, undefined, vertex2, undefined, vertex3, undefined, vertex4, undefined, undefined]);
382
+ expect(predecessor[1]).toEqual([undefined, vertex1, undefined, vertex1, vertex3, undefined, vertex4, undefined, vertex1]);
383
+ expect(predecessor[5]).toEqual([undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]);
384
+ expect(predecessor[7]).toEqual([undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]);
385
+ expect(predecessor[8]).toEqual([vertex7, vertex7, vertex7, vertex7, vertex7, undefined, undefined, undefined, vertex7]);
386
386
  }
387
387
 
388
388
  const dijkstraRes12tt = myGraph.dijkstra(1, 2, true, true);
@@ -436,7 +436,7 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
436
436
  expect(paths[8][1]).toBe(vertex9);
437
437
  }
438
438
 
439
- const dijkstraRes1ntt = myGraph.dijkstra(1, null, true, true);
439
+ const dijkstraRes1ntt = myGraph.dijkstra(1, undefined, true, true);
440
440
 
441
441
  expect(dijkstraRes1ntt).toBeTruthy();
442
442
  if (dijkstraRes1ntt) {
@@ -499,7 +499,7 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
499
499
  expect(paths[8][1]).toBe(vertex9);
500
500
  }
501
501
 
502
- const dijkstraWithoutHeapRes1ntt = myGraph.dijkstraWithoutHeap(1, null, true, true);
502
+ const dijkstraWithoutHeapRes1ntt = myGraph.dijkstraWithoutHeap(1, undefined, true, true);
503
503
  expect(dijkstraWithoutHeapRes1ntt).toBeTruthy();
504
504
  if (dijkstraWithoutHeapRes1ntt) {
505
505
  const { distMap, minDist, minPath, paths } = dijkstraWithoutHeapRes1ntt;
@@ -10,11 +10,11 @@ describe('UndirectedGraph Operation Test', () => {
10
10
  });
11
11
 
12
12
  it('should edge cases', () => {
13
- expect(graph.deleteEdge(new UndirectedEdge('c', 'd'))).toBe(null);
14
- expect(graph.deleteEdgeBetween('c', 'd')).toBe(null);
13
+ expect(graph.deleteEdge(new UndirectedEdge('c', 'd'))).toBe(undefined);
14
+ expect(graph.deleteEdgeBetween('c', 'd')).toBe(undefined);
15
15
  expect(graph.degreeOf('c')).toBe(0);
16
16
  expect(graph.edgesOf('c').length).toBe(0);
17
- expect(graph.getEndsOfEdge(new UndirectedEdge('c', 'd'))).toBe(null);
17
+ expect(graph.getEndsOfEdge(new UndirectedEdge('c', 'd'))).toBe(undefined);
18
18
  });
19
19
 
20
20
  it('should add vertices', () => {