data-structure-typed 1.52.6 → 1.52.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 (178) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +33 -30
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +156 -156
  5. package/dist/cjs/constants/index.d.ts +4 -0
  6. package/dist/cjs/constants/index.js +9 -0
  7. package/dist/cjs/constants/index.js.map +1 -0
  8. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +8 -1
  9. package/dist/cjs/data-structures/base/iterable-element-base.js +10 -1
  10. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
  11. package/dist/cjs/data-structures/base/iterable-entry-base.d.ts +8 -1
  12. package/dist/cjs/data-structures/base/iterable-entry-base.js +10 -10
  13. package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +31 -32
  15. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +43 -44
  16. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +23 -24
  18. package/dist/cjs/data-structures/binary-tree/avl-tree.js +71 -64
  19. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +2 -2
  21. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +534 -402
  22. package/dist/cjs/data-structures/binary-tree/binary-tree.js +668 -597
  23. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  24. package/dist/cjs/data-structures/binary-tree/bst.d.ts +72 -65
  25. package/dist/cjs/data-structures/binary-tree/bst.js +115 -113
  26. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  27. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +21 -24
  28. package/dist/cjs/data-structures/binary-tree/rb-tree.js +40 -39
  29. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  30. package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +2 -2
  31. package/dist/cjs/data-structures/binary-tree/segment-tree.js +2 -2
  32. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +28 -31
  33. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +44 -43
  34. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  35. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +2 -2
  36. package/dist/cjs/data-structures/graph/abstract-graph.js +7 -4
  37. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  38. package/dist/cjs/data-structures/graph/directed-graph.d.ts +2 -2
  39. package/dist/cjs/data-structures/graph/directed-graph.js +4 -2
  40. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  41. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +2 -2
  42. package/dist/cjs/data-structures/hash/hash-map.d.ts +2 -2
  43. package/dist/cjs/data-structures/hash/hash-map.js +1 -1
  44. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  45. package/dist/cjs/data-structures/heap/heap.js +3 -3
  46. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  47. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  48. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +7 -7
  49. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  51. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +6 -6
  52. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  53. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +2 -2
  54. package/dist/cjs/data-structures/matrix/matrix.d.ts +2 -2
  55. package/dist/cjs/data-structures/matrix/navigator.d.ts +2 -2
  56. package/dist/cjs/data-structures/matrix/navigator.js +4 -2
  57. package/dist/cjs/data-structures/matrix/navigator.js.map +1 -1
  58. package/dist/cjs/data-structures/queue/deque.d.ts +3 -3
  59. package/dist/cjs/data-structures/queue/deque.js +29 -29
  60. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  61. package/dist/cjs/data-structures/queue/queue.d.ts +1 -1
  62. package/dist/cjs/data-structures/stack/stack.d.ts +2 -2
  63. package/dist/cjs/data-structures/trie/trie.d.ts +2 -2
  64. package/dist/cjs/data-structures/trie/trie.js +1 -1
  65. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  66. package/dist/cjs/index.d.ts +1 -0
  67. package/dist/cjs/index.js +1 -0
  68. package/dist/cjs/index.js.map +1 -1
  69. package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
  70. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -4
  71. package/dist/cjs/types/data-structures/binary-tree/binary-tree.js +0 -6
  72. package/dist/cjs/types/data-structures/binary-tree/binary-tree.js.map +1 -1
  73. package/dist/mjs/constants/index.d.ts +4 -0
  74. package/dist/mjs/constants/index.js +5 -0
  75. package/dist/mjs/data-structures/base/iterable-element-base.d.ts +8 -1
  76. package/dist/mjs/data-structures/base/iterable-element-base.js +10 -1
  77. package/dist/mjs/data-structures/base/iterable-entry-base.d.ts +8 -1
  78. package/dist/mjs/data-structures/base/iterable-entry-base.js +10 -10
  79. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +31 -32
  80. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +44 -44
  81. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +23 -24
  82. package/dist/mjs/data-structures/binary-tree/avl-tree.js +72 -64
  83. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +2 -2
  84. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +534 -402
  85. package/dist/mjs/data-structures/binary-tree/binary-tree.js +667 -591
  86. package/dist/mjs/data-structures/binary-tree/bst.d.ts +72 -65
  87. package/dist/mjs/data-structures/binary-tree/bst.js +116 -112
  88. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +21 -24
  89. package/dist/mjs/data-structures/binary-tree/rb-tree.js +41 -38
  90. package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +2 -2
  91. package/dist/mjs/data-structures/binary-tree/segment-tree.js +2 -2
  92. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +28 -31
  93. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +45 -42
  94. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +2 -2
  95. package/dist/mjs/data-structures/graph/abstract-graph.js +7 -4
  96. package/dist/mjs/data-structures/graph/directed-graph.d.ts +2 -2
  97. package/dist/mjs/data-structures/graph/directed-graph.js +4 -2
  98. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +2 -2
  99. package/dist/mjs/data-structures/hash/hash-map.d.ts +2 -2
  100. package/dist/mjs/data-structures/hash/hash-map.js +1 -1
  101. package/dist/mjs/data-structures/heap/heap.js +3 -3
  102. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  103. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +7 -7
  104. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  105. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +6 -6
  106. package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +2 -2
  107. package/dist/mjs/data-structures/matrix/matrix.d.ts +2 -2
  108. package/dist/mjs/data-structures/matrix/navigator.d.ts +2 -2
  109. package/dist/mjs/data-structures/matrix/navigator.js +4 -2
  110. package/dist/mjs/data-structures/queue/deque.d.ts +3 -3
  111. package/dist/mjs/data-structures/queue/deque.js +29 -29
  112. package/dist/mjs/data-structures/queue/queue.d.ts +1 -1
  113. package/dist/mjs/data-structures/stack/stack.d.ts +2 -2
  114. package/dist/mjs/data-structures/trie/trie.d.ts +2 -2
  115. package/dist/mjs/data-structures/trie/trie.js +1 -1
  116. package/dist/mjs/index.d.ts +1 -0
  117. package/dist/mjs/index.js +1 -0
  118. package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
  119. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +2 -4
  120. package/dist/mjs/types/data-structures/binary-tree/binary-tree.js +1 -5
  121. package/dist/umd/data-structure-typed.js +1343 -1615
  122. package/dist/umd/data-structure-typed.min.js +10 -3
  123. package/dist/umd/data-structure-typed.min.js.map +1 -1
  124. package/eslint.config.mjs +69 -0
  125. package/package.json +30 -28
  126. package/src/constants/index.ts +4 -0
  127. package/src/data-structures/base/iterable-element-base.ts +11 -1
  128. package/src/data-structures/base/iterable-entry-base.ts +11 -19
  129. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +47 -50
  130. package/src/data-structures/binary-tree/avl-tree.ts +69 -71
  131. package/src/data-structures/binary-tree/binary-indexed-tree.ts +2 -2
  132. package/src/data-structures/binary-tree/binary-tree.ts +697 -725
  133. package/src/data-structures/binary-tree/bst.ts +123 -129
  134. package/src/data-structures/binary-tree/rb-tree.ts +44 -46
  135. package/src/data-structures/binary-tree/segment-tree.ts +2 -2
  136. package/src/data-structures/binary-tree/tree-multi-map.ts +48 -49
  137. package/src/data-structures/graph/abstract-graph.ts +6 -6
  138. package/src/data-structures/graph/directed-graph.ts +4 -4
  139. package/src/data-structures/graph/undirected-graph.ts +2 -2
  140. package/src/data-structures/hash/hash-map.ts +3 -3
  141. package/src/data-structures/heap/heap.ts +3 -3
  142. package/src/data-structures/linked-list/doubly-linked-list.ts +9 -9
  143. package/src/data-structures/linked-list/singly-linked-list.ts +8 -8
  144. package/src/data-structures/linked-list/skip-linked-list.ts +2 -2
  145. package/src/data-structures/matrix/matrix.ts +2 -2
  146. package/src/data-structures/matrix/navigator.ts +4 -4
  147. package/src/data-structures/queue/deque.ts +31 -31
  148. package/src/data-structures/queue/queue.ts +1 -1
  149. package/src/data-structures/stack/stack.ts +2 -2
  150. package/src/data-structures/trie/trie.ts +3 -3
  151. package/src/index.ts +1 -0
  152. package/src/interfaces/binary-tree.ts +3 -3
  153. package/src/types/data-structures/binary-tree/binary-tree.ts +3 -5
  154. package/test/config.ts +1 -7
  155. package/test/integration/all-in-one.test.ts +2 -2
  156. package/test/integration/avl-tree.test.ts +2 -2
  157. package/test/integration/bst.test.ts +17 -16
  158. package/test/integration/heap.test.js +6 -1
  159. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +39 -39
  160. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -2
  161. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +51 -26
  162. package/test/unit/data-structures/binary-tree/bst.test.ts +41 -13
  163. package/test/unit/data-structures/binary-tree/overall.test.ts +0 -6
  164. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +6 -6
  165. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +88 -34
  166. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +42 -42
  167. package/test/unit/data-structures/graph/abstract-graph.test.ts +1 -1
  168. package/test/unit/data-structures/graph/directed-graph.test.ts +4 -4
  169. package/test/unit/data-structures/graph/undirected-graph.test.ts +14 -2
  170. package/test/unit/data-structures/hash/hash-map.test.ts +1 -1
  171. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
  172. package/test/unit/data-structures/matrix/navigator.test.ts +2 -2
  173. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +1 -1
  174. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +4 -4
  175. package/test/unit/data-structures/stack/stack.test.ts +6 -0
  176. package/test/unit/unrestricted-interconversion.test.ts +24 -24
  177. package/test/utils/big-o.ts +5 -4
  178. package/.eslintrc.js +0 -64
@@ -414,7 +414,7 @@ describe('RedBlackTree 2', () => {
414
414
  expect(node225F?.right).toBe(rbTree.NIL);
415
415
  expect(node225F?.parent?.key).toBe(155);
416
416
  rbTree.add(7);
417
- isDebug && rbTree.print();
417
+ if (isDebug) rbTree.print();
418
418
 
419
419
  const node15S = rbTree.getNode(15);
420
420
  expect(node15S?.left?.key).toBe(10);
@@ -463,7 +463,7 @@ describe('RedBlackTree 2', () => {
463
463
  rbTree.add(19);
464
464
  rbTree.add(110);
465
465
 
466
- isDebug && rbTree.print();
466
+ if (isDebug) rbTree.print();
467
467
 
468
468
  expect(rbTree.dfs()).toEqual([
469
469
  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 25, 28, 33, 50, 110, 111, 155, 225
@@ -525,19 +525,19 @@ describe('RedBlackTree 2', () => {
525
525
  for (let i = 0; i < arr.length; i++) {
526
526
  rbTree.add(arr[i]);
527
527
  }
528
- isDebug && console.log(performance.now() - tS);
528
+ if (isDebug) console.log(performance.now() - tS);
529
529
 
530
530
  const cS = performance.now();
531
531
 
532
532
  for (let i = 0; i < arr.length; i++) {
533
533
  competitor.setElement(arr[i], arr[i]);
534
534
  }
535
- isDebug && console.log(performance.now() - cS);
535
+ if (isDebug) console.log(performance.now() - cS);
536
536
  });
537
537
 
538
538
  it('duplicates', () => {
539
539
  rbTree.addMany([9, 8, 7, 8, 8, 8, 2, 3, 6, 5, 5, 4]);
540
- isDebug && rbTree.print();
540
+ if (isDebug) rbTree.print();
541
541
 
542
542
  expect(rbTree.size).toBe(8);
543
543
  expect(rbTree.isBST()).toBe(true);
@@ -606,7 +606,7 @@ describe('RedBlackTree 2', () => {
606
606
  expect(rbTree.getHeight()).toBe(-1);
607
607
  expect(nanCount).toBeLessThanOrEqual(inputSize);
608
608
 
609
- isDebug && rbTree.print();
609
+ if (isDebug) rbTree.print();
610
610
  });
611
611
  });
612
612
 
@@ -1,50 +1,104 @@
1
- import { SegmentTree } from '../../../../src';
1
+ import { SegmentTree, SegmentTreeNode } from '../../../../src';
2
2
 
3
- describe('SegmentTree', () => {
4
- let segmentTree: SegmentTree;
5
-
6
- beforeEach(() => {
7
- // Create an example SegmentTree for testing
8
- const values = [1, 2, 3, 4, 5];
9
- segmentTree = new SegmentTree(values);
3
+ describe('SegmentTreeNode', () => {
4
+ it('should initialize with correct start, end, sum, and optional value', () => {
5
+ const node = new SegmentTreeNode(0, 1, 10, 2);
6
+ expect(node.start).toBe(0);
7
+ expect(node.end).toBe(1);
8
+ expect(node.sum).toBe(10);
9
+ expect(node.value).toBe(2);
10
10
  });
11
11
 
12
- it('should build a valid segment tree', () => {
13
- // Check if the root node's sum is correct
14
- expect(segmentTree.root?.sum).toBe(15);
12
+ it('should allow setting start, end, sum, value, left, and right', () => {
13
+ const node = new SegmentTreeNode(0, 1, 10);
14
+ node.start = 2;
15
+ node.end = 3;
16
+ node.sum = 15;
17
+ node.value = 2;
18
+
19
+ const leftNode = new SegmentTreeNode(0, 1, 5);
20
+ const rightNode = new SegmentTreeNode(2, 3, 10);
21
+
22
+ node.left = leftNode;
23
+ node.right = rightNode;
24
+
25
+ expect(node.start).toBe(2);
26
+ expect(node.end).toBe(3);
27
+ expect(node.sum).toBe(15);
28
+ expect(node.value).toBe(2);
29
+ expect(node.left).toBe(leftNode);
30
+ expect(node.right).toBe(rightNode);
15
31
  });
32
+ });
16
33
 
17
- it('should update a node in the segment tree', () => {
18
- // Update a node value
19
- segmentTree.updateNode(2, 10);
34
+ describe('SegmentTree', () => {
35
+ it('should initialize with correct values, start, end, and root', () => {
36
+ const values = [1, 2, 3, 4];
37
+ const tree = new SegmentTree(values);
20
38
 
21
- // Check if the sum of the root node is correct after the update
22
- expect(segmentTree.root?.sum).toBe(22);
39
+ expect(tree.values).toEqual(values);
40
+ expect(tree.start).toBe(0);
41
+ expect(tree.end).toBe(3);
42
+ expect(tree.root).toBeDefined();
23
43
  });
24
44
 
25
- it('should query sum by range correctly', () => {
26
- // Check if the sum within a specific range is correct
27
- expect(segmentTree.querySumByRange(1, 3)).toBe(9); // 2 + 3 + 4 = 9
45
+ it('should correctly build segment tree with sum of values', () => {
46
+ const values = [1, 2, 3, 4];
47
+ const tree = new SegmentTree(values);
48
+
49
+ expect(tree.root?.sum).toBe(10); // 1 + 2 + 3 + 4
28
50
  });
29
51
 
30
- it('should handle edge cases for querySumByRange', () => {
31
- // Check behavior when the range goes beyond boundaries
32
- expect(segmentTree.querySumByRange(0, 4)).toBe(15); // Valid range, should return sum of the specified range
33
- expect(segmentTree.querySumByRange(3, 2)).toBe(NaN); // End index is less than start index, should return NaN
34
- expect(segmentTree.querySumByRange(0, 10)).toBe(NaN); // Beyond upper bound, should return NaN
52
+ it('should handle empty values array gracefully', () => {
53
+ const tree = new SegmentTree([]);
54
+ expect(tree.values).toEqual([]);
55
+ expect(tree.root).toBeUndefined();
35
56
  });
36
57
 
37
- it('should handle an empty input array', () => {
38
- // Check behavior when dealing with an empty input array
39
- const emptySegmentTree = new SegmentTree([]);
40
- expect(emptySegmentTree.root).toBe(undefined);
41
- expect(emptySegmentTree.querySumByRange(0, 2)).toBe(0); // Sum of an empty array should be 0
58
+ describe('updateNode', () => {
59
+ it('should update node value and sum correctly', () => {
60
+ const values = [1, 2, 3, 4];
61
+ const tree = new SegmentTree(values);
62
+ tree.updateNode(1, 5, 2);
63
+
64
+ expect(tree.root?.sum).toBe(13); // 1 + 5 + 3 + 4
65
+ expect(tree.root?.left?.right?.sum).toBe(5);
66
+ expect(tree.root?.left?.right?.value).toBe(2);
67
+ });
68
+
69
+ it('should do nothing if root is undefined', () => {
70
+ const tree = new SegmentTree([]);
71
+ tree.updateNode(0, 10);
72
+ expect(tree.root).toBeUndefined();
73
+ });
42
74
  });
43
75
 
44
- it('should handle a single-element input array', () => {
45
- // Check behavior when the input array contains a single element
46
- const singleElementSegmentTree = new SegmentTree([42]);
47
- expect(singleElementSegmentTree.root?.sum).toBe(42);
48
- expect(singleElementSegmentTree.querySumByRange(0, 0)).toBe(42); // Range covering the only element should return that element's value
76
+ describe('querySumByRange', () => {
77
+ it('should return sum for a given range', () => {
78
+ const values = [1, 2, 3, 4, 5];
79
+ const tree = new SegmentTree(values);
80
+ const result = tree.querySumByRange(1, 3); // 2 + 3 + 4 = 9
81
+ expect(result).toBe(9);
82
+ });
83
+
84
+ it('should return NaN for an invalid range', () => {
85
+ const values = [1, 2, 3, 4, 5];
86
+ const tree = new SegmentTree(values);
87
+ const result = tree.querySumByRange(3, 1); // Invalid range
88
+ expect(result).toBeNaN();
89
+ });
90
+
91
+ it('should return 0 if root is undefined', () => {
92
+ const tree = new SegmentTree([]);
93
+ const result = tree.querySumByRange(0, 1);
94
+ expect(result).toBe(0);
95
+ });
96
+
97
+ it('should return NaN if range is out of bounds', () => {
98
+ const values = [1, 2, 3, 4];
99
+ const tree = new SegmentTree(values);
100
+ const result = tree.querySumByRange(-1, 10);
101
+ expect(result).toBeNaN();
102
+ });
49
103
  });
50
104
  });
@@ -87,7 +87,7 @@ describe('TreeMultiMap operations test1', () => {
87
87
  tmm.delete(11);
88
88
  expect(tmm.count).toBe(17);
89
89
  expect(tmm.getComputedCount()).toBe(17);
90
- tmm.delete(3, undefined, true);
90
+ tmm.delete(3, true);
91
91
  expect(tmm.count).toBe(15);
92
92
  expect(tmm.getComputedCount()).toBe(15);
93
93
  });
@@ -127,19 +127,19 @@ describe('TreeMultiMap operations test1', () => {
127
127
  expect(tmm.getComputedCount()).toBe(18);
128
128
 
129
129
  expect(tmm.has(6));
130
- isDebug && tmm.print();
130
+ if (isDebug) tmm.print();
131
131
  expect(tmm.getHeight(6)).toBe(1);
132
132
  expect(tmm.getDepth(6)).toBe(3);
133
133
  const nodeId10 = tmm.getNode(10);
134
134
  expect(nodeId10?.key).toBe(10);
135
135
 
136
- const nodeVal9 = tmm.getNode(9, node => node.value);
136
+ const nodeVal9 = tmm.getNode(node => node.value === 9);
137
137
  expect(nodeVal9?.key).toBe(9);
138
138
 
139
- const nodesByCount1 = tmm.getNodes(1, node => node.count);
139
+ const nodesByCount1 = tmm.getNodes(node => node.count === 1);
140
140
  expect(nodesByCount1.length).toBe(14);
141
141
 
142
- const nodesByCount2 = tmm.getNodes(2, node => node.count);
142
+ const nodesByCount2 = tmm.getNodes(node => node.count === 2);
143
143
  expect(nodesByCount2.length).toBe(2);
144
144
  const leftMost = tmm.getLeftMost();
145
145
  expect(leftMost).toBe(1);
@@ -149,7 +149,7 @@ describe('TreeMultiMap operations test1', () => {
149
149
  expect(minNodeBySpecificNode?.key).toBe(14);
150
150
 
151
151
  let subTreeSum = 0;
152
- node15 && tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
152
+ if (node15) tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
153
153
  expect(subTreeSum).toBe(45);
154
154
  let lesserSum = 0;
155
155
  tmm.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
@@ -180,7 +180,7 @@ describe('TreeMultiMap operations test1', () => {
180
180
  expect(bfsNodesAfterBalanced[0].key).toBe(6);
181
181
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
182
182
 
183
- const removed11 = tmm.delete(11, undefined, true);
183
+ const removed11 = tmm.delete(11, true);
184
184
  expect(removed11 instanceof Array);
185
185
  expect(removed11[0]);
186
186
  expect(removed11[0].deleted);
@@ -191,7 +191,7 @@ describe('TreeMultiMap operations test1', () => {
191
191
 
192
192
  expect(tmm.getHeight(15)).toBe(1);
193
193
 
194
- const removed1 = tmm.delete(1, undefined, true);
194
+ const removed1 = tmm.delete(1, true);
195
195
  expect(removed1 instanceof Array);
196
196
  expect(removed1[0]);
197
197
  expect(removed1[0].deleted);
@@ -201,7 +201,7 @@ describe('TreeMultiMap operations test1', () => {
201
201
 
202
202
  expect(tmm.getHeight()).toBe(5);
203
203
 
204
- const removed4 = tmm.delete(4, undefined, true);
204
+ const removed4 = tmm.delete(4, true);
205
205
  expect(removed4 instanceof Array);
206
206
  expect(removed4[0]);
207
207
  expect(removed4[0].deleted);
@@ -210,7 +210,7 @@ describe('TreeMultiMap operations test1', () => {
210
210
  expect(tmm.isAVLBalanced()).toBe(false);
211
211
  expect(tmm.getHeight()).toBe(5);
212
212
 
213
- const removed10 = tmm.delete(10, undefined, true);
213
+ const removed10 = tmm.delete(10, true);
214
214
  expect(removed10 instanceof Array);
215
215
  expect(removed10[0]);
216
216
  expect(removed10[0].deleted);
@@ -219,7 +219,7 @@ describe('TreeMultiMap operations test1', () => {
219
219
 
220
220
  expect(tmm.getHeight()).toBe(4);
221
221
 
222
- const removed15 = tmm.delete(15, undefined, true);
222
+ const removed15 = tmm.delete(15, true);
223
223
  expect(removed15 instanceof Array);
224
224
  expect(removed15[0]);
225
225
  expect(removed15[0].deleted);
@@ -228,7 +228,7 @@ describe('TreeMultiMap operations test1', () => {
228
228
  expect(tmm.isAVLBalanced()).toBe(false);
229
229
  expect(tmm.getHeight()).toBe(3);
230
230
 
231
- const removed5 = tmm.delete(5, undefined, true);
231
+ const removed5 = tmm.delete(5, true);
232
232
  expect(removed5 instanceof Array);
233
233
  expect(removed5[0]);
234
234
  expect(removed5[0].deleted);
@@ -237,7 +237,7 @@ describe('TreeMultiMap operations test1', () => {
237
237
  expect(tmm.isAVLBalanced()).toBe(true);
238
238
  expect(tmm.getHeight()).toBe(3);
239
239
 
240
- const removed13 = tmm.delete(13, undefined, true);
240
+ const removed13 = tmm.delete(13, true);
241
241
  expect(removed13 instanceof Array);
242
242
  expect(removed13[0]);
243
243
  expect(removed13[0].deleted);
@@ -245,7 +245,7 @@ describe('TreeMultiMap operations test1', () => {
245
245
  expect(tmm.isAVLBalanced()).toBe(true);
246
246
  expect(tmm.getHeight()).toBe(3);
247
247
 
248
- const removed3 = tmm.delete(3, undefined, true);
248
+ const removed3 = tmm.delete(3, true);
249
249
  expect(removed3 instanceof Array);
250
250
  expect(removed3[0]);
251
251
  expect(removed3[0].deleted);
@@ -253,7 +253,7 @@ describe('TreeMultiMap operations test1', () => {
253
253
  expect(tmm.isAVLBalanced()).toBe(false);
254
254
  expect(tmm.getHeight()).toBe(3);
255
255
 
256
- const removed8 = tmm.delete(8, undefined, true);
256
+ const removed8 = tmm.delete(8, true);
257
257
  expect(removed8 instanceof Array);
258
258
  expect(removed8[0]);
259
259
  expect(removed8[0].deleted);
@@ -261,17 +261,17 @@ describe('TreeMultiMap operations test1', () => {
261
261
  expect(tmm.isAVLBalanced()).toBe(false);
262
262
  expect(tmm.getHeight()).toBe(3);
263
263
 
264
- const removed6 = tmm.delete(6, undefined, true);
264
+ const removed6 = tmm.delete(6, true);
265
265
  expect(removed6 instanceof Array);
266
266
  expect(removed6[0]);
267
267
  expect(removed6[0].deleted);
268
268
  if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
269
- expect(tmm.delete(6, undefined, true).length).toBe(0);
269
+ expect(tmm.delete(6, true).length).toBe(0);
270
270
  expect(tmm.isAVLBalanced()).toBe(false);
271
271
 
272
272
  expect(tmm.getHeight()).toBe(3);
273
273
 
274
- const removed7 = tmm.delete(7, undefined, true);
274
+ const removed7 = tmm.delete(7, true);
275
275
  expect(removed7 instanceof Array);
276
276
  expect(removed7[0]);
277
277
  expect(removed7[0].deleted);
@@ -279,7 +279,7 @@ describe('TreeMultiMap operations test1', () => {
279
279
  expect(tmm.isAVLBalanced()).toBe(false);
280
280
  expect(tmm.getHeight()).toBe(3);
281
281
 
282
- const removed9 = tmm.delete(9, undefined, true);
282
+ const removed9 = tmm.delete(9, true);
283
283
  expect(removed9 instanceof Array);
284
284
  expect(removed9[0]);
285
285
  expect(removed9[0].deleted);
@@ -287,7 +287,7 @@ describe('TreeMultiMap operations test1', () => {
287
287
  expect(tmm.isAVLBalanced()).toBe(true);
288
288
  expect(tmm.getHeight()).toBe(2);
289
289
 
290
- const removed14 = tmm.delete(14, undefined, true);
290
+ const removed14 = tmm.delete(14, true);
291
291
  expect(removed14 instanceof Array);
292
292
  expect(removed14[0]);
293
293
  expect(removed14[0].deleted);
@@ -391,13 +391,13 @@ describe('TreeMultiMap operations test recursively1', () => {
391
391
  const nodeId10 = tmm.getNode(10);
392
392
  expect(nodeId10?.key).toBe(10);
393
393
 
394
- const nodeVal9 = tmm.getNode(9, node => node.value);
394
+ const nodeVal9 = tmm.getNode(node => node.value === 9);
395
395
  expect(nodeVal9?.key).toBe(9);
396
396
 
397
- const nodesByCount1 = tmm.getNodes(1, node => node.count);
397
+ const nodesByCount1 = tmm.getNodes(node => node.count === 1);
398
398
  expect(nodesByCount1.length).toBe(14);
399
399
 
400
- const nodesByCount2 = tmm.getNodes(2, node => node.count);
400
+ const nodesByCount2 = tmm.getNodes(node => node.count === 2);
401
401
  expect(nodesByCount2.length).toBe(2);
402
402
  const leftMost = tmm.getLeftMost();
403
403
  expect(leftMost).toBe(1);
@@ -407,7 +407,7 @@ describe('TreeMultiMap operations test recursively1', () => {
407
407
  expect(minNodeBySpecificNode?.key).toBe(14);
408
408
 
409
409
  let subTreeSum = 0;
410
- node15 && tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
410
+ if (node15) tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
411
411
  expect(subTreeSum).toBe(45);
412
412
  let lesserSum = 0;
413
413
  expect(tmm.has(9)).toBe(true);
@@ -447,7 +447,7 @@ describe('TreeMultiMap operations test recursively1', () => {
447
447
  expect(bfsNodesAfterBalanced[0].key).toBe(6);
448
448
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
449
449
 
450
- const removed11 = tmm.delete(11, undefined, true);
450
+ const removed11 = tmm.delete(11, true);
451
451
  expect(removed11 instanceof Array);
452
452
  expect(removed11[0]);
453
453
  expect(removed11[0].deleted);
@@ -458,7 +458,7 @@ describe('TreeMultiMap operations test recursively1', () => {
458
458
 
459
459
  expect(tmm.getHeight(15)).toBe(1);
460
460
 
461
- const removed1 = tmm.delete(1, undefined, true);
461
+ const removed1 = tmm.delete(1, true);
462
462
  expect(removed1 instanceof Array);
463
463
  expect(removed1[0]);
464
464
  expect(removed1[0].deleted);
@@ -468,7 +468,7 @@ describe('TreeMultiMap operations test recursively1', () => {
468
468
 
469
469
  expect(tmm.getHeight()).toBe(5);
470
470
 
471
- const removed4 = tmm.delete(4, undefined, true);
471
+ const removed4 = tmm.delete(4, true);
472
472
  expect(removed4 instanceof Array);
473
473
  expect(removed4[0]);
474
474
  expect(removed4[0].deleted);
@@ -477,7 +477,7 @@ describe('TreeMultiMap operations test recursively1', () => {
477
477
  expect(tmm.isAVLBalanced()).toBe(false);
478
478
  expect(tmm.getHeight()).toBe(5);
479
479
 
480
- const removed10 = tmm.delete(10, undefined, true);
480
+ const removed10 = tmm.delete(10, true);
481
481
  expect(removed10 instanceof Array);
482
482
  expect(removed10[0]);
483
483
  expect(removed10[0].deleted);
@@ -486,7 +486,7 @@ describe('TreeMultiMap operations test recursively1', () => {
486
486
 
487
487
  expect(tmm.getHeight()).toBe(4);
488
488
 
489
- const removed15 = tmm.delete(15, undefined, true);
489
+ const removed15 = tmm.delete(15, true);
490
490
  expect(removed15 instanceof Array);
491
491
  expect(removed15[0]);
492
492
  expect(removed15[0].deleted);
@@ -495,7 +495,7 @@ describe('TreeMultiMap operations test recursively1', () => {
495
495
  expect(tmm.isAVLBalanced()).toBe(false);
496
496
  expect(tmm.getHeight()).toBe(3);
497
497
 
498
- const removed5 = tmm.delete(5, undefined, true);
498
+ const removed5 = tmm.delete(5, true);
499
499
  expect(removed5 instanceof Array);
500
500
  expect(removed5[0]);
501
501
  expect(removed5[0].deleted);
@@ -504,7 +504,7 @@ describe('TreeMultiMap operations test recursively1', () => {
504
504
  expect(tmm.isAVLBalanced()).toBe(true);
505
505
  expect(tmm.getHeight()).toBe(3);
506
506
 
507
- const removed13 = tmm.delete(13, undefined, true);
507
+ const removed13 = tmm.delete(13, true);
508
508
  expect(removed13 instanceof Array);
509
509
  expect(removed13[0]);
510
510
  expect(removed13[0].deleted);
@@ -512,7 +512,7 @@ describe('TreeMultiMap operations test recursively1', () => {
512
512
  expect(tmm.isAVLBalanced()).toBe(true);
513
513
  expect(tmm.getHeight()).toBe(3);
514
514
 
515
- const removed3 = tmm.delete(3, undefined, true);
515
+ const removed3 = tmm.delete(3, true);
516
516
  expect(removed3 instanceof Array);
517
517
  expect(removed3[0]);
518
518
  expect(removed3[0].deleted);
@@ -520,7 +520,7 @@ describe('TreeMultiMap operations test recursively1', () => {
520
520
  expect(tmm.isAVLBalanced()).toBe(false);
521
521
  expect(tmm.getHeight()).toBe(3);
522
522
 
523
- const removed8 = tmm.delete(8, undefined, true);
523
+ const removed8 = tmm.delete(8, true);
524
524
  expect(removed8 instanceof Array);
525
525
  expect(removed8[0]);
526
526
  expect(removed8[0].deleted);
@@ -528,17 +528,17 @@ describe('TreeMultiMap operations test recursively1', () => {
528
528
  expect(tmm.isAVLBalanced()).toBe(false);
529
529
  expect(tmm.getHeight()).toBe(3);
530
530
 
531
- const removed6 = tmm.delete(6, undefined, true);
531
+ const removed6 = tmm.delete(6, true);
532
532
  expect(removed6 instanceof Array);
533
533
  expect(removed6[0]);
534
534
  expect(removed6[0].deleted);
535
535
  if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
536
- expect(tmm.delete(6, undefined, true).length).toBe(0);
536
+ expect(tmm.delete(6, true).length).toBe(0);
537
537
  expect(tmm.isAVLBalanced()).toBe(false);
538
538
 
539
539
  expect(tmm.getHeight()).toBe(3);
540
540
 
541
- const removed7 = tmm.delete(7, undefined, true);
541
+ const removed7 = tmm.delete(7, true);
542
542
  expect(removed7 instanceof Array);
543
543
  expect(removed7[0]);
544
544
  expect(removed7[0].deleted);
@@ -546,7 +546,7 @@ describe('TreeMultiMap operations test recursively1', () => {
546
546
  expect(tmm.isAVLBalanced()).toBe(false);
547
547
  expect(tmm.getHeight()).toBe(3);
548
548
 
549
- const removed9 = tmm.delete(9, undefined, true);
549
+ const removed9 = tmm.delete(9, true);
550
550
  expect(removed9 instanceof Array);
551
551
  expect(removed9[0]);
552
552
  expect(removed9[0].deleted);
@@ -554,7 +554,7 @@ describe('TreeMultiMap operations test recursively1', () => {
554
554
  expect(tmm.isAVLBalanced()).toBe(true);
555
555
  expect(tmm.getHeight()).toBe(2);
556
556
 
557
- const removed14 = tmm.delete(14, undefined, true);
557
+ const removed14 = tmm.delete(14, true);
558
558
  expect(removed14 instanceof Array);
559
559
  expect(removed14[0]);
560
560
  expect(removed14[0].deleted);
@@ -626,7 +626,7 @@ describe('TreeMultiMap delete test', function () {
626
626
  it(`Observe the time consumption of TreeMultiMap.dfs be good`, function () {
627
627
  const startDFS = performance.now();
628
628
  const dfs = tmm.dfs(node => node);
629
- isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
629
+ if (isDebug) console.log('---bfs', performance.now() - startDFS, dfs.length);
630
630
  });
631
631
 
632
632
  it('The structure remains normal after random deletion', function () {
@@ -664,7 +664,7 @@ describe('TreeMultiMap delete test', function () {
664
664
  }
665
665
 
666
666
  for (let i = 0; i < inputSize; i++) {
667
- tmm.delete(i, undefined, true);
667
+ tmm.delete(i, true);
668
668
  }
669
669
 
670
670
  let nilCount = 0;
@@ -679,7 +679,7 @@ describe('TreeMultiMap delete test', function () {
679
679
  expect(tmm.getHeight()).toBe(-1);
680
680
  expect(nilCount).toBe(tmm.size + 1);
681
681
 
682
- isDebug && tmm.print();
682
+ if (isDebug) tmm.print();
683
683
  });
684
684
 
685
685
  it(`Random additions, count deletions of structures are normal`, function () {
@@ -705,7 +705,7 @@ describe('TreeMultiMap delete test', function () {
705
705
  expect(tmm.getHeight()).toBeGreaterThanOrEqual(0);
706
706
  expect(nanCount).toBeLessThanOrEqual(inputSize);
707
707
 
708
- isDebug && tmm.print();
708
+ if (isDebug) tmm.print();
709
709
  });
710
710
 
711
711
  it('should the clone method', () => {
@@ -45,7 +45,7 @@ class MyGraph<
45
45
  }
46
46
 
47
47
  degreeOf(vertexOrKey: VO | VertexKey): number {
48
- return 1 ?? Number(vertexOrKey);
48
+ return Number(vertexOrKey);
49
49
  }
50
50
 
51
51
  edgeSet(): EO[] {
@@ -209,8 +209,8 @@ describe('Inherit from DirectedGraph and perform operations', () => {
209
209
 
210
210
  expect(removedEdge).toBeInstanceOf(MyEdge);
211
211
  if (removedEdge) {
212
- removedEdge && expect(removedEdge.value).toBe('edge-data1-2');
213
- removedEdge && expect(removedEdge.src).toBe(1);
212
+ if (removedEdge) expect(removedEdge.value).toBe('edge-data1-2');
213
+ if (removedEdge) expect(removedEdge.src).toBe(1);
214
214
  }
215
215
  expect(edgeAfterRemoval).toBe(undefined);
216
216
  });
@@ -241,8 +241,8 @@ describe('Inherit from DirectedGraph and perform operations', () => {
241
241
  if (sorted && sorted.length > 0) {
242
242
  expect(sorted.length).toBe(9);
243
243
  if (sorted[0] instanceof MyVertex) expect(sorted[0].data).toBe('data9');
244
- sorted[3] instanceof MyVertex && expect(sorted[3].data).toBe('data6');
245
- sorted[8] instanceof MyVertex && expect(sorted[8].key).toBe(1);
244
+ if (sorted[3] instanceof MyVertex) expect(sorted[3].data).toBe('data6');
245
+ if (sorted[8] instanceof MyVertex) expect(sorted[8].key).toBe(1);
246
246
  }
247
247
  });
248
248
 
@@ -18,14 +18,19 @@ describe('UndirectedGraph Operation Test', () => {
18
18
  });
19
19
 
20
20
  it('should add vertices', () => {
21
+ expect(graph.isEmpty()).toBe(true);
21
22
  const vertex1 = new UndirectedVertex('A');
22
23
  const vertex2 = new UndirectedVertex('B');
23
24
 
24
25
  graph.addVertex(vertex1);
26
+ expect(graph.isEmpty()).toBe(false);
25
27
  graph.addVertex(vertex2);
26
28
 
27
29
  expect(graph.hasVertex(vertex1)).toBe(true);
28
30
  expect(graph.hasVertex(vertex2)).toBe(true);
31
+ expect(graph.isEmpty()).toBe(false);
32
+ graph.clear();
33
+ expect(graph.isEmpty()).toBe(true);
29
34
  });
30
35
 
31
36
  it('should add edges', () => {
@@ -39,6 +44,8 @@ describe('UndirectedGraph Operation Test', () => {
39
44
 
40
45
  expect(graph.hasEdge('A', 'B')).toBe(true);
41
46
  expect(graph.hasEdge('B', 'A')).toBe(true);
47
+ expect(graph.has('A')).toBe(true);
48
+ expect(graph.get('A')).toBe(undefined);
42
49
  });
43
50
 
44
51
  it('should delete edges', () => {
@@ -577,7 +584,7 @@ describe('UndirectedGraph tarjan', () => {
577
584
  const graph = createExampleGraph5();
578
585
  const cycles = graph.getCycles();
579
586
  expect(cycles.length).toBe(13);
580
- expect(cycles).toEqual([
587
+ const expectedCycles = [
581
588
  ['A', 'B', 'C', 'D', 'I', 'H', 'F', 'E'],
582
589
  ['A', 'B', 'C', 'D', 'I', 'H', 'F', 'G', 'E'],
583
590
  ['A', 'B', 'C', 'H', 'F', 'E'],
@@ -591,7 +598,12 @@ describe('UndirectedGraph tarjan', () => {
591
598
  ['C', 'D', 'I', 'H'],
592
599
  ['E', 'F', 'G'],
593
600
  ['H', 'J', 'K']
594
- ]);
601
+ ];
602
+ expect(cycles).toEqual(expectedCycles);
603
+ const cloned = graph.clone();
604
+ const clonedCycles = cloned.getCycles();
605
+ expect(clonedCycles.length).toBe(13);
606
+ expect(clonedCycles).toEqual(expectedCycles);
595
607
  });
596
608
 
597
609
  // it('should uncuttable graph tarjan SCCs return correct result', () => {
@@ -303,7 +303,7 @@ describe('HashMap', () => {
303
303
  });
304
304
 
305
305
  it('print', () => {
306
- expect(hm.print()).toEqual([
306
+ expect(hm.toVisual()).toEqual([
307
307
  [2, 2],
308
308
  [3, 3],
309
309
  [4, 4],
@@ -65,7 +65,7 @@ describe('DoublyLinkedList Operation Test', () => {
65
65
  dList.delete('5');
66
66
  expect([...dList]).toEqual(['1', '6', '0', '9']);
67
67
  expect([...cloned]).toEqual(['1', '6', '0', '5', '9']);
68
- expect(cloned.print()).toEqual(['1', '6', '0', '5', '9']);
68
+ expect(cloned.toVisual()).toEqual(['1', '6', '0', '5', '9']);
69
69
  });
70
70
 
71
71
  it('should find undefined', () => {
@@ -176,7 +176,7 @@ describe('Navigator', () => {
176
176
  navigator.start();
177
177
 
178
178
  // The character should not move
179
- isDebug && console.log(visitedCells);
179
+ if (isDebug) console.log(visitedCells);
180
180
  expect(visitedCells).toEqual([
181
181
  [0, 1],
182
182
  [1, 1],
@@ -226,7 +226,7 @@ describe('Navigator', () => {
226
226
  navigator.start();
227
227
 
228
228
  // The character should have navigated the grid, handled turns, and edge cases
229
- isDebug && console.log(visitedCells);
229
+ if (isDebug) console.log(visitedCells);
230
230
  expect(visitedCells).toEqual([
231
231
  [0, 1],
232
232
  [0, 2],
@@ -76,6 +76,6 @@ describe('MinPriorityQueue Operation Test', () => {
76
76
  );
77
77
  expect(mapped instanceof MinPriorityQueue).toBe(true);
78
78
  expect([...mapped]).toEqual([{ key: 1 }, { key: 5 }, { key: 7 }]);
79
- expect(mapped.print()).toEqual([{ key: 1 }, { key: 5 }, { key: 7 }]);
79
+ expect(mapped.toVisual()).toEqual([{ key: 1 }, { key: 5 }, { key: 7 }]);
80
80
  });
81
81
  });