data-structure-typed 1.50.5 → 1.50.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -18
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +167 -143
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/binary-tree.js +32 -28
  10. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/bst.js +17 -17
  12. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +158 -141
  14. package/dist/cjs/data-structures/binary-tree/rb-tree.js +416 -396
  15. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -0
  17. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +84 -76
  18. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  19. package/dist/cjs/types/common.d.ts +6 -0
  20. package/dist/cjs/types/common.js +8 -1
  21. package/dist/cjs/types/common.js.map +1 -1
  22. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
  23. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
  24. package/dist/mjs/data-structures/binary-tree/binary-tree.js +32 -28
  25. package/dist/mjs/data-structures/binary-tree/bst.js +17 -17
  26. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +158 -141
  27. package/dist/mjs/data-structures/binary-tree/rb-tree.js +413 -396
  28. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -0
  29. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +84 -76
  30. package/dist/mjs/types/common.d.ts +6 -0
  31. package/dist/mjs/types/common.js +7 -0
  32. package/dist/umd/data-structure-typed.js +519 -467
  33. package/dist/umd/data-structure-typed.min.js +2 -2
  34. package/dist/umd/data-structure-typed.min.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +5 -1
  37. package/src/data-structures/binary-tree/avl-tree.ts +1 -1
  38. package/src/data-structures/binary-tree/binary-tree.ts +31 -29
  39. package/src/data-structures/binary-tree/bst.ts +18 -18
  40. package/src/data-structures/binary-tree/rb-tree.ts +436 -405
  41. package/src/data-structures/binary-tree/tree-multi-map.ts +85 -82
  42. package/src/types/common.ts +7 -0
  43. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +26 -16
  44. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +4 -1
  45. package/test/unit/data-structures/binary-tree/overall.test.ts +23 -21
  46. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +387 -324
  47. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +335 -204
@@ -8,17 +8,19 @@ import {
8
8
  TreeMultiMapNode
9
9
  } from '../../../../src';
10
10
  import { isDebugTest } from '../../../config';
11
+ import { getRandomInt } from '../../../utils';
11
12
 
12
13
  const isDebug = isDebugTest;
13
14
  // const isDebug = true;
14
15
 
15
16
  describe('TreeMultiMap count', () => {
16
- let tm: TreeMultiMap<number>;
17
+ let tmm: TreeMultiMap<number>;
17
18
  beforeEach(() => {
18
- tm = new TreeMultiMap<number>();
19
+ tmm = new TreeMultiMap<number>();
19
20
  });
20
- it('Should added isolated node count ', () => {
21
- tm.addMany([
21
+
22
+ it('Should added node count ', () => {
23
+ tmm.addMany([
22
24
  [1, 1],
23
25
  [2, 2],
24
26
  [3, 3],
@@ -26,28 +28,84 @@ describe('TreeMultiMap count', () => {
26
28
  [5, 5]
27
29
  ]);
28
30
  const newNode = new TreeMultiMapNode(3, 33, 10);
29
- tm.add(newNode);
30
- expect(tm.count).toBe(15);
31
+ tmm.add(newNode);
32
+ expect(tmm.count).toBe(15);
33
+ expect(tmm.getMutableCount()).toBe(15);
34
+ expect(tmm.getNode(3)?.count).toBe(11);
31
35
  });
32
36
 
33
37
  it('Should count', () => {
34
- tm.addMany([
38
+ tmm.addMany([
35
39
  [1, 1],
36
40
  [2, 2],
37
41
  [3, 3]
38
42
  ]);
39
- tm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 1);
40
- expect(tm.count).toBe(7);
43
+ tmm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 1);
44
+ expect(tmm.getMutableCount()).toBe(7);
45
+ expect(tmm.count).toBe(3);
41
46
  });
42
47
  });
43
48
 
44
49
  describe('TreeMultiMap operations test1', () => {
50
+ it('should height ', () => {
51
+ const tmm = new TreeMultiMap();
52
+ expect(tmm.getHeight()).toBe(-1);
53
+ expect(tmm.getMinHeight()).toBe(-1);
54
+
55
+ tmm.addMany([1, 6, 7, 2, 3, 4, 9, 11, 8, 5, 10, 12, 16, 14, 13, 15]);
56
+ expect(tmm.getHeight()).toBe(5);
57
+ expect(tmm.getMinHeight()).toBe(2);
58
+ });
59
+
60
+ it('should size and count', () => {
61
+ const tmm = new TreeMultiMap();
62
+
63
+ expect(tmm instanceof TreeMultiMap);
64
+
65
+ tmm.add([11, 11]);
66
+ tmm.add([3, 3]);
67
+ expect(tmm.count).toBe(2);
68
+ expect(tmm.getMutableCount()).toBe(2);
69
+ expect(tmm.size).toBe(2);
70
+
71
+ const keyValuePairs: [number, number][] = [
72
+ [11, 11],
73
+ [3, 3],
74
+ [15, 15],
75
+ [1, 1],
76
+ [8, 8],
77
+ [13, 13],
78
+ [16, 16],
79
+ [2, 2],
80
+ [6, 6],
81
+ [9, 9],
82
+ [12, 12],
83
+ [14, 14],
84
+ [4, 4],
85
+ [7, 7],
86
+ [10, 10],
87
+ [5, 5]
88
+ ];
89
+
90
+ tmm.addMany(keyValuePairs);
91
+ expect(tmm.size).toBe(16);
92
+ expect(tmm.count).toBe(18);
93
+ expect(tmm.getMutableCount()).toBe(18);
94
+ tmm.delete(11);
95
+ expect(tmm.count).toBe(17);
96
+ expect(tmm.getMutableCount()).toBe(17);
97
+ tmm.delete(3, undefined, true);
98
+ expect(tmm.count).toBe(15);
99
+ expect(tmm.getMutableCount()).toBe(15);
100
+ });
101
+
45
102
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
46
- const treeMultimap = new TreeMultiMap();
103
+ const tmm = new TreeMultiMap();
104
+
105
+ expect(tmm instanceof TreeMultiMap);
47
106
 
48
- expect(treeMultimap instanceof TreeMultiMap);
49
- treeMultimap.add([11, 11]);
50
- treeMultimap.add([3, 3]);
107
+ tmm.add([11, 11]);
108
+ tmm.add([3, 3]);
51
109
  const idAndValues: [number, number][] = [
52
110
  [11, 11],
53
111
  [3, 3],
@@ -66,199 +124,200 @@ describe('TreeMultiMap operations test1', () => {
66
124
  [10, 10],
67
125
  [5, 5]
68
126
  ];
69
- treeMultimap.addMany(idAndValues);
70
- expect(treeMultimap.root instanceof TreeMultiMapNode);
71
-
72
- if (treeMultimap.root) expect(treeMultimap.root.key == 11);
127
+ tmm.addMany(idAndValues);
128
+ expect(tmm.root instanceof TreeMultiMapNode);
73
129
 
74
- expect(treeMultimap.size).toBe(16);
75
- expect(treeMultimap.count).toBe(18);
130
+ if (tmm.root) expect(tmm.root.key == 11);
76
131
 
77
- expect(treeMultimap.has(6));
132
+ expect(tmm.size).toBe(16);
133
+ expect(tmm.count).toBe(18);
134
+ expect(tmm.getMutableCount()).toBe(18);
78
135
 
79
- expect(treeMultimap.getHeight(6)).toBe(2);
80
- expect(treeMultimap.getDepth(6)).toBe(4);
81
- const nodeId10 = treeMultimap.getNode(10);
136
+ expect(tmm.has(6));
137
+ isDebug && tmm.print();
138
+ expect(tmm.getHeight(6)).toBe(1);
139
+ expect(tmm.getDepth(6)).toBe(3);
140
+ const nodeId10 = tmm.getNode(10);
82
141
  expect(nodeId10?.key).toBe(10);
83
142
 
84
- const nodeVal9 = treeMultimap.getNode(9, node => node.value);
143
+ const nodeVal9 = tmm.getNode(9, node => node.value);
85
144
  expect(nodeVal9?.key).toBe(9);
86
145
 
87
- const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
146
+ const nodesByCount1 = tmm.getNodes(1, node => node.count);
88
147
  expect(nodesByCount1.length).toBe(14);
89
148
 
90
- const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
149
+ const nodesByCount2 = tmm.getNodes(2, node => node.count);
91
150
  expect(nodesByCount2.length).toBe(2);
92
- const leftMost = treeMultimap.getLeftMost();
151
+ const leftMost = tmm.getLeftMost();
93
152
  expect(leftMost?.key).toBe(1);
94
153
 
95
- const node15 = treeMultimap.getNode(15);
96
- const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
97
- expect(minNodeBySpecificNode?.key).toBe(15);
154
+ const node15 = tmm.getNode(15);
155
+ const minNodeBySpecificNode = node15 && tmm.getLeftMost(node15);
156
+ expect(minNodeBySpecificNode?.key).toBe(14);
98
157
 
99
158
  let subTreeSum = 0;
100
- node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
101
- expect(subTreeSum).toBe(31);
159
+ node15 && tmm.dfs(node => (subTreeSum += node.key), 'pre', 15);
160
+ expect(subTreeSum).toBe(45);
102
161
  let lesserSum = 0;
103
- treeMultimap.lesserOrGreaterTraverse((node: TreeMultiMapNode<number>) => (lesserSum += node.key), CP.lt, 10);
162
+ tmm.lesserOrGreaterTraverse((node: TreeMultiMapNode<number>) => (lesserSum += node.key), CP.lt, 10);
104
163
  expect(lesserSum).toBe(45);
105
164
 
106
165
  expect(node15 instanceof TreeMultiMapNode);
107
166
  if (node15 instanceof TreeMultiMapNode) {
108
- const subTreeAdd = treeMultimap.dfs(node => (node.count += 1), 'pre', 15);
167
+ const subTreeAdd = tmm.dfs(node => (node.count += 1), 'pre', 15);
109
168
  expect(subTreeAdd);
110
169
  }
111
- const node11 = treeMultimap.getNode(11);
170
+ const node11 = tmm.getNode(11);
112
171
  expect(node11 instanceof TreeMultiMapNode);
113
172
  if (node11 instanceof TreeMultiMapNode) {
114
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
173
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
115
174
  expect(allGreaterNodesAdded);
116
175
  }
117
176
 
118
- const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
177
+ const dfsInorderNodes = tmm.dfs(node => node, 'in');
119
178
  expect(dfsInorderNodes[0].key).toBe(1);
120
179
  expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
121
- expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
180
+ expect(tmm.isPerfectlyBalanced()).toBe(false);
181
+ tmm.perfectlyBalance();
182
+ expect(tmm.isPerfectlyBalanced()).toBe(false);
122
183
 
123
- treeMultimap.perfectlyBalance();
184
+ expect(tmm.isAVLBalanced()).toBe(false);
124
185
 
125
- expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
126
- expect(treeMultimap.isAVLBalanced()).toBe(true);
127
-
128
- const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
129
- expect(bfsNodesAfterBalanced[0].key).toBe(8);
186
+ const bfsNodesAfterBalanced = tmm.bfs(node => node);
187
+ expect(bfsNodesAfterBalanced[0].key).toBe(6);
130
188
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
131
189
 
132
- const removed11 = treeMultimap.delete(11, undefined, true);
190
+ const removed11 = tmm.delete(11, undefined, true);
133
191
  expect(removed11 instanceof Array);
134
192
  expect(removed11[0]);
135
193
  expect(removed11[0].deleted);
136
194
 
137
195
  if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
138
196
 
139
- expect(treeMultimap.isAVLBalanced()).toBe(true);
197
+ expect(tmm.isAVLBalanced()).toBe(false);
140
198
 
141
- expect(treeMultimap.getHeight(15)).toBe(2);
199
+ expect(tmm.getHeight(15)).toBe(1);
142
200
 
143
- const removed1 = treeMultimap.delete(1, undefined, true);
201
+ const removed1 = tmm.delete(1, undefined, true);
144
202
  expect(removed1 instanceof Array);
145
203
  expect(removed1[0]);
146
204
  expect(removed1[0].deleted);
147
205
  if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
148
206
 
149
- expect(treeMultimap.isAVLBalanced()).toBe(true);
207
+ expect(tmm.isAVLBalanced()).toBe(false);
150
208
 
151
- expect(treeMultimap.getHeight()).toBe(5);
209
+ expect(tmm.getHeight()).toBe(5);
152
210
 
153
- const removed4 = treeMultimap.delete(4, undefined, true);
211
+ const removed4 = tmm.delete(4, undefined, true);
154
212
  expect(removed4 instanceof Array);
155
213
  expect(removed4[0]);
156
214
  expect(removed4[0].deleted);
157
215
  if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
158
216
 
159
- expect(treeMultimap.isAVLBalanced()).toBe(true);
160
- expect(treeMultimap.getHeight()).toBe(5);
217
+ expect(tmm.isAVLBalanced()).toBe(false);
218
+ expect(tmm.getHeight()).toBe(5);
161
219
 
162
- const removed10 = treeMultimap.delete(10, undefined, true);
220
+ const removed10 = tmm.delete(10, undefined, true);
163
221
  expect(removed10 instanceof Array);
164
222
  expect(removed10[0]);
165
223
  expect(removed10[0].deleted);
166
224
  if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
167
- expect(treeMultimap.isAVLBalanced()).toBe(false);
225
+ expect(tmm.isAVLBalanced()).toBe(false);
168
226
 
169
- expect(treeMultimap.getHeight()).toBe(5);
227
+ expect(tmm.getHeight()).toBe(4);
170
228
 
171
- const removed15 = treeMultimap.delete(15, undefined, true);
229
+ const removed15 = tmm.delete(15, undefined, true);
172
230
  expect(removed15 instanceof Array);
173
231
  expect(removed15[0]);
174
232
  expect(removed15[0].deleted);
175
233
  if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
176
234
 
177
- expect(treeMultimap.isAVLBalanced()).toBe(true);
178
- expect(treeMultimap.getHeight()).toBe(4);
235
+ expect(tmm.isAVLBalanced()).toBe(false);
236
+ expect(tmm.getHeight()).toBe(3);
179
237
 
180
- const removed5 = treeMultimap.delete(5, undefined, true);
238
+ const removed5 = tmm.delete(5, undefined, true);
181
239
  expect(removed5 instanceof Array);
182
240
  expect(removed5[0]);
183
241
  expect(removed5[0].deleted);
184
242
  if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
185
243
 
186
- expect(treeMultimap.isAVLBalanced()).toBe(true);
187
- expect(treeMultimap.getHeight()).toBe(4);
244
+ expect(tmm.isAVLBalanced()).toBe(true);
245
+ expect(tmm.getHeight()).toBe(3);
188
246
 
189
- const removed13 = treeMultimap.delete(13, undefined, true);
247
+ const removed13 = tmm.delete(13, undefined, true);
190
248
  expect(removed13 instanceof Array);
191
249
  expect(removed13[0]);
192
250
  expect(removed13[0].deleted);
193
251
  if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
194
- expect(treeMultimap.isAVLBalanced()).toBe(true);
195
- expect(treeMultimap.getHeight()).toBe(4);
252
+ expect(tmm.isAVLBalanced()).toBe(true);
253
+ expect(tmm.getHeight()).toBe(3);
196
254
 
197
- const removed3 = treeMultimap.delete(3, undefined, true);
255
+ const removed3 = tmm.delete(3, undefined, true);
198
256
  expect(removed3 instanceof Array);
199
257
  expect(removed3[0]);
200
258
  expect(removed3[0].deleted);
201
259
  if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
202
- expect(treeMultimap.isAVLBalanced()).toBe(true);
203
- expect(treeMultimap.getHeight()).toBe(4);
260
+ expect(tmm.isAVLBalanced()).toBe(false);
261
+ expect(tmm.getHeight()).toBe(3);
204
262
 
205
- const removed8 = treeMultimap.delete(8, undefined, true);
263
+ const removed8 = tmm.delete(8, undefined, true);
206
264
  expect(removed8 instanceof Array);
207
265
  expect(removed8[0]);
208
266
  expect(removed8[0].deleted);
209
267
  if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
210
- expect(treeMultimap.isAVLBalanced()).toBe(false);
211
- expect(treeMultimap.getHeight()).toBe(4);
268
+ expect(tmm.isAVLBalanced()).toBe(false);
269
+ expect(tmm.getHeight()).toBe(3);
212
270
 
213
- const removed6 = treeMultimap.delete(6, undefined, true);
271
+ const removed6 = tmm.delete(6, undefined, true);
214
272
  expect(removed6 instanceof Array);
215
273
  expect(removed6[0]);
216
274
  expect(removed6[0].deleted);
217
275
  if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
218
- expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
219
- expect(treeMultimap.isAVLBalanced()).toBe(false);
276
+ expect(tmm.delete(6, undefined, true).length).toBe(0);
277
+ expect(tmm.isAVLBalanced()).toBe(false);
220
278
 
221
- expect(treeMultimap.getHeight()).toBe(4);
279
+ expect(tmm.getHeight()).toBe(3);
222
280
 
223
- const removed7 = treeMultimap.delete(7, undefined, true);
281
+ const removed7 = tmm.delete(7, undefined, true);
224
282
  expect(removed7 instanceof Array);
225
283
  expect(removed7[0]);
226
284
  expect(removed7[0].deleted);
227
285
  if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
228
- expect(treeMultimap.isAVLBalanced()).toBe(false);
229
- expect(treeMultimap.getHeight()).toBe(4);
286
+ expect(tmm.isAVLBalanced()).toBe(false);
287
+ expect(tmm.getHeight()).toBe(3);
230
288
 
231
- const removed9 = treeMultimap.delete(9, undefined, true);
289
+ const removed9 = tmm.delete(9, undefined, true);
232
290
  expect(removed9 instanceof Array);
233
291
  expect(removed9[0]);
234
292
  expect(removed9[0].deleted);
235
293
  if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
236
- expect(treeMultimap.isAVLBalanced()).toBe(true);
237
- expect(treeMultimap.getHeight()).toBe(3);
294
+ expect(tmm.isAVLBalanced()).toBe(true);
295
+ expect(tmm.getHeight()).toBe(2);
238
296
 
239
- const removed14 = treeMultimap.delete(14, undefined, true);
297
+ const removed14 = tmm.delete(14, undefined, true);
240
298
  expect(removed14 instanceof Array);
241
299
  expect(removed14[0]);
242
300
  expect(removed14[0].deleted);
243
301
  if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
244
- expect(treeMultimap.isAVLBalanced()).toBe(true);
245
- expect(treeMultimap.getHeight()).toBe(2);
302
+ expect(tmm.isAVLBalanced()).toBe(true);
303
+ expect(tmm.getHeight()).toBe(1);
246
304
 
247
- expect(treeMultimap.isAVLBalanced()).toBe(true);
305
+ expect(tmm.isAVLBalanced()).toBe(true);
248
306
 
249
- const bfsIDs = treeMultimap.bfs(node => node.key);
307
+ const bfsIDs = tmm.bfs(node => node.key);
250
308
 
251
309
  expect(bfsIDs[0]).toBe(12);
252
310
  expect(bfsIDs[1]).toBe(2);
253
311
  expect(bfsIDs[2]).toBe(16);
254
312
 
255
- const bfsNodes = treeMultimap.bfs(node => node);
313
+ const bfsNodes = tmm.bfs(node => node);
256
314
 
257
315
  expect(bfsNodes[0].key).toBe(12);
258
316
  expect(bfsNodes[1].key).toBe(2);
259
317
  expect(bfsNodes[2].key).toBe(16);
260
318
 
261
- expect(treeMultimap.count).toBe(8);
319
+ expect(tmm.count).toBe(6);
320
+ expect(tmm.getMutableCount()).toBe(8);
262
321
  });
263
322
 
264
323
  it('should perform various operations on a Binary Search Tree with object values', () => {
@@ -287,9 +346,10 @@ describe('TreeMultiMap operations test1', () => {
287
346
 
288
347
  expect(objTreeMultiMap.root).toBeInstanceOf(TreeMultiMapNode);
289
348
 
290
- if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(11);
349
+ if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(5);
291
350
 
292
351
  expect(objTreeMultiMap.count).toBe(16);
352
+ expect(objTreeMultiMap.getMutableCount()).toBe(16);
293
353
 
294
354
  expect(objTreeMultiMap.has(6)).toBe(true);
295
355
  });
@@ -297,11 +357,11 @@ describe('TreeMultiMap operations test1', () => {
297
357
 
298
358
  describe('TreeMultiMap operations test recursively1', () => {
299
359
  it('should perform various operations on a Binary Search Tree with numeric values1', () => {
300
- const treeMultimap = new TreeMultiMap<number>([], { iterationType: IterationType.RECURSIVE });
360
+ const tmm = new TreeMultiMap<number>([], { iterationType: IterationType.RECURSIVE });
301
361
 
302
- expect(treeMultimap instanceof TreeMultiMap);
303
- treeMultimap.add([11, 11]);
304
- treeMultimap.add([3, 3]);
362
+ expect(tmm instanceof TreeMultiMap);
363
+ tmm.add([11, 11]);
364
+ tmm.add([3, 3]);
305
365
  const idAndValues: [number, number][] = [
306
366
  [11, 11],
307
367
  [3, 3],
@@ -320,42 +380,43 @@ describe('TreeMultiMap operations test recursively1', () => {
320
380
  [10, 10],
321
381
  [5, 5]
322
382
  ];
323
- treeMultimap.addMany(idAndValues);
324
- expect(treeMultimap.root).toBeInstanceOf(TreeMultiMapNode);
383
+ tmm.addMany(idAndValues);
384
+ expect(tmm.root).toBeInstanceOf(TreeMultiMapNode);
325
385
 
326
- if (treeMultimap.root) expect(treeMultimap.root.key).toBe(11);
386
+ if (tmm.root) expect(tmm.root.key).toBe(5);
327
387
 
328
- expect(treeMultimap.size).toBe(16);
329
- expect(treeMultimap.count).toBe(18);
388
+ expect(tmm.size).toBe(16);
389
+ expect(tmm.count).toBe(18);
390
+ expect(tmm.getMutableCount()).toBe(18);
330
391
 
331
- expect(treeMultimap.has(6));
392
+ expect(tmm.has(6));
332
393
 
333
- expect(treeMultimap.getHeight(6)).toBe(2);
334
- expect(treeMultimap.getDepth(6)).toBe(4);
335
- const nodeId10 = treeMultimap.getNode(10);
394
+ expect(tmm.getHeight(6)).toBe(1);
395
+ expect(tmm.getDepth(6)).toBe(3);
396
+ const nodeId10 = tmm.getNode(10);
336
397
  expect(nodeId10?.key).toBe(10);
337
398
 
338
- const nodeVal9 = treeMultimap.getNode(9, node => node.value);
399
+ const nodeVal9 = tmm.getNode(9, node => node.value);
339
400
  expect(nodeVal9?.key).toBe(9);
340
401
 
341
- const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
402
+ const nodesByCount1 = tmm.getNodes(1, node => node.count);
342
403
  expect(nodesByCount1.length).toBe(14);
343
404
 
344
- const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
405
+ const nodesByCount2 = tmm.getNodes(2, node => node.count);
345
406
  expect(nodesByCount2.length).toBe(2);
346
- const leftMost = treeMultimap.getLeftMost();
407
+ const leftMost = tmm.getLeftMost();
347
408
  expect(leftMost?.key).toBe(1);
348
409
 
349
- const node15 = treeMultimap.getNode(15);
350
- const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
351
- expect(minNodeBySpecificNode?.key).toBe(15);
410
+ const node15 = tmm.getNode(15);
411
+ const minNodeBySpecificNode = node15 && tmm.getLeftMost(node15);
412
+ expect(minNodeBySpecificNode?.key).toBe(14);
352
413
 
353
414
  let subTreeSum = 0;
354
- node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
355
- expect(subTreeSum).toBe(31);
415
+ node15 && tmm.dfs(node => (subTreeSum += node.key), 'pre', 15);
416
+ expect(subTreeSum).toBe(45);
356
417
  let lesserSum = 0;
357
- expect(treeMultimap.has(9)).toBe(true);
358
- treeMultimap.lesserOrGreaterTraverse(
418
+ expect(tmm.has(9)).toBe(true);
419
+ tmm.lesserOrGreaterTraverse(
359
420
  node => {
360
421
  lesserSum += node.key;
361
422
  return node.key;
@@ -367,160 +428,161 @@ describe('TreeMultiMap operations test recursively1', () => {
367
428
 
368
429
  expect(node15 instanceof TreeMultiMapNode);
369
430
  if (node15 instanceof TreeMultiMapNode) {
370
- const subTreeAdd = treeMultimap.dfs(node => (node.count += 1), 'pre', 15);
431
+ const subTreeAdd = tmm.dfs(node => (node.count += 1), 'pre', 15);
371
432
  expect(subTreeAdd);
372
433
  }
373
- const node11 = treeMultimap.getNode(11);
434
+ const node11 = tmm.getNode(11);
374
435
  expect(node11 instanceof TreeMultiMapNode);
375
436
  if (node11 instanceof TreeMultiMapNode) {
376
- const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
437
+ const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
377
438
  expect(allGreaterNodesAdded);
378
439
  }
379
440
 
380
- const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
441
+ const dfsInorderNodes = tmm.dfs(node => node, 'in');
381
442
  expect(dfsInorderNodes[0].key).toBe(1);
382
443
  expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
383
- expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
444
+ expect(tmm.isPerfectlyBalanced()).toBe(false);
384
445
 
385
- treeMultimap.perfectlyBalance();
446
+ tmm.perfectlyBalance();
386
447
 
387
- expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
388
- expect(treeMultimap.isAVLBalanced()).toBe(true);
448
+ expect(tmm.isPerfectlyBalanced()).toBe(false);
449
+ expect(tmm.isAVLBalanced()).toBe(false);
389
450
 
390
- const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
391
- expect(bfsNodesAfterBalanced[0].key).toBe(8);
451
+ const bfsNodesAfterBalanced = tmm.bfs(node => node);
452
+ expect(bfsNodesAfterBalanced[0].key).toBe(6);
392
453
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
393
454
 
394
- const removed11 = treeMultimap.delete(11, undefined, true);
455
+ const removed11 = tmm.delete(11, undefined, true);
395
456
  expect(removed11 instanceof Array);
396
457
  expect(removed11[0]);
397
458
  expect(removed11[0].deleted);
398
459
 
399
460
  if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
400
461
 
401
- expect(treeMultimap.isAVLBalanced()).toBe(true);
462
+ expect(tmm.isAVLBalanced()).toBe(false);
402
463
 
403
- expect(treeMultimap.getHeight(15)).toBe(2);
464
+ expect(tmm.getHeight(15)).toBe(1);
404
465
 
405
- const removed1 = treeMultimap.delete(1, undefined, true);
466
+ const removed1 = tmm.delete(1, undefined, true);
406
467
  expect(removed1 instanceof Array);
407
468
  expect(removed1[0]);
408
469
  expect(removed1[0].deleted);
409
470
  if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
410
471
 
411
- expect(treeMultimap.isAVLBalanced()).toBe(true);
472
+ expect(tmm.isAVLBalanced()).toBe(false);
412
473
 
413
- expect(treeMultimap.getHeight()).toBe(5);
474
+ expect(tmm.getHeight()).toBe(5);
414
475
 
415
- const removed4 = treeMultimap.delete(4, undefined, true);
476
+ const removed4 = tmm.delete(4, undefined, true);
416
477
  expect(removed4 instanceof Array);
417
478
  expect(removed4[0]);
418
479
  expect(removed4[0].deleted);
419
480
  if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
420
481
 
421
- expect(treeMultimap.isAVLBalanced()).toBe(true);
422
- expect(treeMultimap.getHeight()).toBe(5);
482
+ expect(tmm.isAVLBalanced()).toBe(false);
483
+ expect(tmm.getHeight()).toBe(5);
423
484
 
424
- const removed10 = treeMultimap.delete(10, undefined, true);
485
+ const removed10 = tmm.delete(10, undefined, true);
425
486
  expect(removed10 instanceof Array);
426
487
  expect(removed10[0]);
427
488
  expect(removed10[0].deleted);
428
489
  if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
429
- expect(treeMultimap.isAVLBalanced()).toBe(false);
490
+ expect(tmm.isAVLBalanced()).toBe(false);
430
491
 
431
- expect(treeMultimap.getHeight()).toBe(5);
492
+ expect(tmm.getHeight()).toBe(4);
432
493
 
433
- const removed15 = treeMultimap.delete(15, undefined, true);
494
+ const removed15 = tmm.delete(15, undefined, true);
434
495
  expect(removed15 instanceof Array);
435
496
  expect(removed15[0]);
436
497
  expect(removed15[0].deleted);
437
498
  if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
438
499
 
439
- expect(treeMultimap.isAVLBalanced()).toBe(true);
440
- expect(treeMultimap.getHeight()).toBe(4);
500
+ expect(tmm.isAVLBalanced()).toBe(false);
501
+ expect(tmm.getHeight()).toBe(3);
441
502
 
442
- const removed5 = treeMultimap.delete(5, undefined, true);
503
+ const removed5 = tmm.delete(5, undefined, true);
443
504
  expect(removed5 instanceof Array);
444
505
  expect(removed5[0]);
445
506
  expect(removed5[0].deleted);
446
507
  if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
447
508
 
448
- expect(treeMultimap.isAVLBalanced()).toBe(true);
449
- expect(treeMultimap.getHeight()).toBe(4);
509
+ expect(tmm.isAVLBalanced()).toBe(true);
510
+ expect(tmm.getHeight()).toBe(3);
450
511
 
451
- const removed13 = treeMultimap.delete(13, undefined, true);
512
+ const removed13 = tmm.delete(13, undefined, true);
452
513
  expect(removed13 instanceof Array);
453
514
  expect(removed13[0]);
454
515
  expect(removed13[0].deleted);
455
516
  if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
456
- expect(treeMultimap.isAVLBalanced()).toBe(true);
457
- expect(treeMultimap.getHeight()).toBe(4);
517
+ expect(tmm.isAVLBalanced()).toBe(true);
518
+ expect(tmm.getHeight()).toBe(3);
458
519
 
459
- const removed3 = treeMultimap.delete(3, undefined, true);
520
+ const removed3 = tmm.delete(3, undefined, true);
460
521
  expect(removed3 instanceof Array);
461
522
  expect(removed3[0]);
462
523
  expect(removed3[0].deleted);
463
524
  if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
464
- expect(treeMultimap.isAVLBalanced()).toBe(true);
465
- expect(treeMultimap.getHeight()).toBe(4);
525
+ expect(tmm.isAVLBalanced()).toBe(false);
526
+ expect(tmm.getHeight()).toBe(3);
466
527
 
467
- const removed8 = treeMultimap.delete(8, undefined, true);
528
+ const removed8 = tmm.delete(8, undefined, true);
468
529
  expect(removed8 instanceof Array);
469
530
  expect(removed8[0]);
470
531
  expect(removed8[0].deleted);
471
532
  if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
472
- expect(treeMultimap.isAVLBalanced()).toBe(false);
473
- expect(treeMultimap.getHeight()).toBe(4);
533
+ expect(tmm.isAVLBalanced()).toBe(false);
534
+ expect(tmm.getHeight()).toBe(3);
474
535
 
475
- const removed6 = treeMultimap.delete(6, undefined, true);
536
+ const removed6 = tmm.delete(6, undefined, true);
476
537
  expect(removed6 instanceof Array);
477
538
  expect(removed6[0]);
478
539
  expect(removed6[0].deleted);
479
540
  if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
480
- expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
481
- expect(treeMultimap.isAVLBalanced()).toBe(false);
541
+ expect(tmm.delete(6, undefined, true).length).toBe(0);
542
+ expect(tmm.isAVLBalanced()).toBe(false);
482
543
 
483
- expect(treeMultimap.getHeight()).toBe(4);
544
+ expect(tmm.getHeight()).toBe(3);
484
545
 
485
- const removed7 = treeMultimap.delete(7, undefined, true);
546
+ const removed7 = tmm.delete(7, undefined, true);
486
547
  expect(removed7 instanceof Array);
487
548
  expect(removed7[0]);
488
549
  expect(removed7[0].deleted);
489
550
  if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
490
- expect(treeMultimap.isAVLBalanced()).toBe(false);
491
- expect(treeMultimap.getHeight()).toBe(4);
551
+ expect(tmm.isAVLBalanced()).toBe(false);
552
+ expect(tmm.getHeight()).toBe(3);
492
553
 
493
- const removed9 = treeMultimap.delete(9, undefined, true);
554
+ const removed9 = tmm.delete(9, undefined, true);
494
555
  expect(removed9 instanceof Array);
495
556
  expect(removed9[0]);
496
557
  expect(removed9[0].deleted);
497
558
  if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
498
- expect(treeMultimap.isAVLBalanced()).toBe(true);
499
- expect(treeMultimap.getHeight()).toBe(3);
559
+ expect(tmm.isAVLBalanced()).toBe(true);
560
+ expect(tmm.getHeight()).toBe(2);
500
561
 
501
- const removed14 = treeMultimap.delete(14, undefined, true);
562
+ const removed14 = tmm.delete(14, undefined, true);
502
563
  expect(removed14 instanceof Array);
503
564
  expect(removed14[0]);
504
565
  expect(removed14[0].deleted);
505
566
  if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
506
- expect(treeMultimap.isAVLBalanced()).toBe(true);
507
- expect(treeMultimap.getHeight()).toBe(2);
567
+ expect(tmm.isAVLBalanced()).toBe(true);
568
+ expect(tmm.getHeight()).toBe(1);
508
569
 
509
- expect(treeMultimap.isAVLBalanced()).toBe(true);
570
+ expect(tmm.isAVLBalanced()).toBe(true);
510
571
 
511
- const bfsIDs = treeMultimap.bfs(node => node.key);
572
+ const bfsIDs = tmm.bfs(node => node.key);
512
573
 
513
574
  expect(bfsIDs[0]).toBe(12);
514
575
  expect(bfsIDs[1]).toBe(2);
515
576
  expect(bfsIDs[2]).toBe(16);
516
577
 
517
- const bfsNodes = treeMultimap.bfs(node => node);
578
+ const bfsNodes = tmm.bfs(node => node);
518
579
 
519
580
  expect(bfsNodes[0].key).toBe(12);
520
581
  expect(bfsNodes[1].key).toBe(2);
521
582
  expect(bfsNodes[2].key).toBe(16);
522
583
 
523
- expect(treeMultimap.count).toBe(8);
584
+ expect(tmm.count).toBe(6);
585
+ expect(tmm.getMutableCount()).toBe(8);
524
586
  });
525
587
 
526
588
  it('should perform various operations on a Binary Search Tree with object values', () => {
@@ -549,74 +611,142 @@ describe('TreeMultiMap operations test recursively1', () => {
549
611
 
550
612
  expect(objTreeMultiMap.root).toBeInstanceOf(TreeMultiMapNode);
551
613
 
552
- if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(11);
614
+ if (objTreeMultiMap.root) expect(objTreeMultiMap.root.key).toBe(5);
553
615
 
554
616
  expect(objTreeMultiMap.count).toBe(16);
617
+ expect(objTreeMultiMap.getMutableCount()).toBe(16);
555
618
 
556
619
  expect(objTreeMultiMap.has(6)).toBe(true);
557
620
  });
558
621
  });
559
622
 
560
- describe('TreeMultiMap Performance test', function () {
561
- const treeMS = new TreeMultiMap<number, number>();
623
+ describe('TreeMultiMap delete test', function () {
624
+ const tmm = new TreeMultiMap<number, number>();
562
625
  const inputSize = 1000; // Adjust input sizes as needed
563
626
 
564
627
  beforeEach(() => {
565
- treeMS.clear();
628
+ tmm.clear();
566
629
  });
567
630
 
568
631
  it(`Observe the time consumption of TreeMultiMap.dfs be good`, function () {
569
632
  const startDFS = performance.now();
570
- const dfs = treeMS.dfs(node => node);
633
+ const dfs = tmm.dfs(node => node);
571
634
  isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
572
635
  });
573
636
 
574
- it('Should the time consumption of lesserOrGreaterTraverse fitting O(n log n)', function () {
575
- const start = performance.now();
637
+ it('The structure remains normal after random deletion', function () {
638
+ for (let i = 0; i < inputSize; i++) {
639
+ tmm.add(i);
640
+ }
641
+
642
+ expect(tmm.size).toBe(inputSize);
643
+
644
+ for (let i = 0; i < inputSize; i++) {
645
+ const num = getRandomInt(0, inputSize - 1);
646
+ tmm.delete(num);
647
+ }
648
+
649
+ let nilCount = 0;
650
+ const dfs = (cur: TreeMultiMapNode<number>) => {
651
+ if (isNaN(cur.key)) nilCount++;
652
+ if (cur.left) dfs(cur.left);
653
+ if (cur.right) dfs(cur.right);
654
+ };
655
+ if (tmm.root) dfs(tmm.root);
656
+
657
+ expect(tmm.size).toBeLessThanOrEqual(inputSize);
658
+ expect(tmm.getHeight()).toBeGreaterThan(Math.log2(inputSize) - 1);
659
+ expect(tmm.getHeight()).toBeLessThan(Math.log2(inputSize) * 2);
660
+
661
+ expect(nilCount).toBe(tmm.size + 1);
662
+ });
663
+
664
+ it(`Random additions, complete deletions of structures are normal`, function () {
576
665
  for (let i = 0; i < inputSize; i++) {
577
- treeMS.add(i);
666
+ const num = getRandomInt(0, inputSize - 1);
667
+ if (i === 0 && isDebug) console.log(`first:`, num);
668
+ tmm.add(num);
578
669
  }
579
670
 
580
- isDebug && console.log('---add', performance.now() - start);
581
- const startL = performance.now();
582
- treeMS.lesserOrGreaterTraverse(node => (node.count += 1), CP.lt, inputSize / 2);
583
- isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
671
+ for (let i = 0; i < inputSize; i++) {
672
+ tmm.delete(i, undefined, true);
673
+ }
674
+
675
+ let nilCount = 0;
676
+ const dfs = (cur: TreeMultiMapNode<number>) => {
677
+ if (isNaN(cur.key)) nilCount++;
678
+ if (cur.left) dfs(cur.left);
679
+ if (cur.right) dfs(cur.right);
680
+ };
681
+ if (tmm.root) dfs(tmm.root);
682
+
683
+ expect(tmm.size).toBe(0);
684
+ expect(tmm.getHeight()).toBe(-1);
685
+ expect(nilCount).toBe(tmm.size + 1);
686
+
687
+ isDebug && tmm.print();
688
+ });
689
+
690
+ it(`Random additions, count deletions of structures are normal`, function () {
691
+ for (let i = 0; i < inputSize; i++) {
692
+ const num = getRandomInt(0, inputSize - 1);
693
+ if (i === 0 && isDebug) console.log(`first:`, num);
694
+ tmm.add(num);
695
+ }
696
+
697
+ for (let i = 0; i < inputSize; i++) {
698
+ tmm.delete(i);
699
+ }
700
+
701
+ let nanCount = 0;
702
+ const dfs = (cur: TreeMultiMapNode<number>) => {
703
+ if (isNaN(cur.key)) nanCount++;
704
+ if (cur.left) dfs(cur.left);
705
+ if (cur.right) dfs(cur.right);
706
+ };
707
+ if (tmm.root) dfs(tmm.root);
708
+
709
+ expect(tmm.size).toBeGreaterThanOrEqual(0);
710
+ expect(tmm.getHeight()).toBeGreaterThanOrEqual(0);
711
+ expect(nanCount).toBeLessThanOrEqual(inputSize);
712
+
713
+ isDebug && tmm.print();
584
714
  });
585
715
 
586
716
  it('should the clone method', () => {
587
- function checkTreeStructure(treeMultimap: TreeMultiMap<string, number>) {
588
- expect(treeMultimap.size).toBe(4);
589
- expect(treeMultimap.root?.key).toBe('4');
590
- expect(treeMultimap.root?.left?.key).toBe('1');
591
- expect(treeMultimap.root?.left?.left?.key).toBe(NaN);
592
- expect(treeMultimap.root?.left?.right?.key).toBe('2');
593
- expect(treeMultimap.root?.right?.key).toBe('5');
594
- expect(treeMultimap.root?.right?.left?.key).toBe(NaN);
595
- expect(treeMultimap.root?.right?.right?.key).toBe(NaN);
717
+ function checkTreeStructure(tmm: TreeMultiMap<string, number>) {
718
+ expect(tmm.size).toBe(4);
719
+ expect(tmm.root?.key).toBe('2');
720
+ expect(tmm.root?.left?.key).toBe('1');
721
+ expect(tmm.root?.left?.left?.key).toBe(NaN);
722
+ expect(tmm.root?.left?.right?.key).toBe(NaN);
723
+ expect(tmm.root?.right?.key).toBe('4');
724
+ expect(tmm.root?.right?.left?.key).toBe(NaN);
725
+ expect(tmm.root?.right?.right?.key).toBe('5');
596
726
  }
597
727
 
598
- const treeMultimap = new TreeMultiMap<string, number>();
599
- treeMultimap.addMany([
728
+ const tmm = new TreeMultiMap<string, number>();
729
+ tmm.addMany([
600
730
  ['2', 2],
601
731
  ['4', 4],
602
732
  ['5', 5],
603
733
  ['3', 3],
604
734
  ['1', 1]
605
735
  ]);
606
- expect(treeMultimap.size).toBe(5);
607
- expect(treeMultimap.root?.key).toBe('3');
608
- expect(treeMultimap.root?.left?.key).toBe('1');
609
- expect(treeMultimap.root?.left?.left?.key).toBe(NaN);
610
- expect(treeMultimap.root?.left?.right?.key).toBe('2');
611
- expect(treeMultimap.root?.right?.key).toBe('4');
612
- expect(treeMultimap.root?.right?.left?.key).toBe(NaN);
613
- expect(treeMultimap.root?.right?.right?.key).toBe('5');
614
- treeMultimap.delete('3');
615
- checkTreeStructure(treeMultimap);
616
- const cloned = treeMultimap.clone();
736
+ expect(tmm.size).toBe(5);
737
+ expect(tmm.root?.key).toBe('2');
738
+ expect(tmm.root?.left?.key).toBe('1');
739
+ expect(tmm.root?.left?.left?.key).toBe(NaN);
740
+ expect(tmm.root?.left?.right?.key).toBe(NaN);
741
+ expect(tmm.root?.right?.key).toBe('4');
742
+ expect(tmm.root?.right?.left?.key).toBe(`3`);
743
+ expect(tmm.root?.right?.right?.key).toBe('5');
744
+ tmm.delete('3');
745
+ checkTreeStructure(tmm);
746
+ const cloned = tmm.clone();
617
747
  checkTreeStructure(cloned);
618
748
  cloned.delete('1');
619
- expect(treeMultimap.size).toBe(4);
749
+ expect(tmm.size).toBe(4);
620
750
  expect(cloned.size).toBe(3);
621
751
  });
622
752
  });
@@ -689,9 +819,10 @@ describe('TreeMultiMap iterative methods test', () => {
689
819
 
690
820
  test('should clone work well', () => {
691
821
  expect(treeMM.count).toBe(21);
822
+ expect(treeMM.getMutableCount()).toBe(21);
692
823
  const cloned = treeMM.clone();
693
- expect(cloned.root?.left?.key).toBe(NaN);
694
- expect(cloned.root?.right?.value).toBe('b');
824
+ expect(cloned.root?.left?.key).toBe(1);
825
+ expect(cloned.root?.right?.value).toBe('c');
695
826
  });
696
827
 
697
828
  test('should keys', () => {