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.
- package/CHANGELOG.md +1 -1
- package/README.md +13 -18
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +167 -143
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +32 -28
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.js +17 -17
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +158 -141
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +416 -396
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -0
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +84 -76
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/types/common.d.ts +6 -0
- package/dist/cjs/types/common.js +8 -1
- package/dist/cjs/types/common.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -0
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -0
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +32 -28
- package/dist/mjs/data-structures/binary-tree/bst.js +17 -17
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +158 -141
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +413 -396
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -0
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +84 -76
- package/dist/mjs/types/common.d.ts +6 -0
- package/dist/mjs/types/common.js +7 -0
- package/dist/umd/data-structure-typed.js +519 -467
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +1 -1
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +5 -1
- package/src/data-structures/binary-tree/avl-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +31 -29
- package/src/data-structures/binary-tree/bst.ts +18 -18
- package/src/data-structures/binary-tree/rb-tree.ts +436 -405
- package/src/data-structures/binary-tree/tree-multi-map.ts +85 -82
- package/src/types/common.ts +7 -0
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +26 -16
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +4 -1
- package/test/unit/data-structures/binary-tree/overall.test.ts +23 -21
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +387 -324
- 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
|
|
17
|
+
let tmm: TreeMultiMap<number>;
|
|
17
18
|
beforeEach(() => {
|
|
18
|
-
|
|
19
|
+
tmm = new TreeMultiMap<number>();
|
|
19
20
|
});
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
30
|
-
expect(
|
|
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
|
-
|
|
38
|
+
tmm.addMany([
|
|
35
39
|
[1, 1],
|
|
36
40
|
[2, 2],
|
|
37
41
|
[3, 3]
|
|
38
42
|
]);
|
|
39
|
-
|
|
40
|
-
expect(
|
|
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
|
|
103
|
+
const tmm = new TreeMultiMap();
|
|
104
|
+
|
|
105
|
+
expect(tmm instanceof TreeMultiMap);
|
|
47
106
|
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
70
|
-
expect(
|
|
71
|
-
|
|
72
|
-
if (treeMultimap.root) expect(treeMultimap.root.key == 11);
|
|
127
|
+
tmm.addMany(idAndValues);
|
|
128
|
+
expect(tmm.root instanceof TreeMultiMapNode);
|
|
73
129
|
|
|
74
|
-
|
|
75
|
-
expect(treeMultimap.count).toBe(18);
|
|
130
|
+
if (tmm.root) expect(tmm.root.key == 11);
|
|
76
131
|
|
|
77
|
-
expect(
|
|
132
|
+
expect(tmm.size).toBe(16);
|
|
133
|
+
expect(tmm.count).toBe(18);
|
|
134
|
+
expect(tmm.getMutableCount()).toBe(18);
|
|
78
135
|
|
|
79
|
-
expect(
|
|
80
|
-
|
|
81
|
-
|
|
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 =
|
|
143
|
+
const nodeVal9 = tmm.getNode(9, node => node.value);
|
|
85
144
|
expect(nodeVal9?.key).toBe(9);
|
|
86
145
|
|
|
87
|
-
const nodesByCount1 =
|
|
146
|
+
const nodesByCount1 = tmm.getNodes(1, node => node.count);
|
|
88
147
|
expect(nodesByCount1.length).toBe(14);
|
|
89
148
|
|
|
90
|
-
const nodesByCount2 =
|
|
149
|
+
const nodesByCount2 = tmm.getNodes(2, node => node.count);
|
|
91
150
|
expect(nodesByCount2.length).toBe(2);
|
|
92
|
-
const leftMost =
|
|
151
|
+
const leftMost = tmm.getLeftMost();
|
|
93
152
|
expect(leftMost?.key).toBe(1);
|
|
94
153
|
|
|
95
|
-
const node15 =
|
|
96
|
-
const minNodeBySpecificNode = node15 &&
|
|
97
|
-
expect(minNodeBySpecificNode?.key).toBe(
|
|
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 &&
|
|
101
|
-
expect(subTreeSum).toBe(
|
|
159
|
+
node15 && tmm.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
160
|
+
expect(subTreeSum).toBe(45);
|
|
102
161
|
let lesserSum = 0;
|
|
103
|
-
|
|
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 =
|
|
167
|
+
const subTreeAdd = tmm.dfs(node => (node.count += 1), 'pre', 15);
|
|
109
168
|
expect(subTreeAdd);
|
|
110
169
|
}
|
|
111
|
-
const node11 =
|
|
170
|
+
const node11 = tmm.getNode(11);
|
|
112
171
|
expect(node11 instanceof TreeMultiMapNode);
|
|
113
172
|
if (node11 instanceof TreeMultiMapNode) {
|
|
114
|
-
const allGreaterNodesAdded =
|
|
173
|
+
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
115
174
|
expect(allGreaterNodesAdded);
|
|
116
175
|
}
|
|
117
176
|
|
|
118
|
-
const dfsInorderNodes =
|
|
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(
|
|
180
|
+
expect(tmm.isPerfectlyBalanced()).toBe(false);
|
|
181
|
+
tmm.perfectlyBalance();
|
|
182
|
+
expect(tmm.isPerfectlyBalanced()).toBe(false);
|
|
122
183
|
|
|
123
|
-
|
|
184
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
124
185
|
|
|
125
|
-
|
|
126
|
-
expect(
|
|
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 =
|
|
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(
|
|
197
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
140
198
|
|
|
141
|
-
expect(
|
|
199
|
+
expect(tmm.getHeight(15)).toBe(1);
|
|
142
200
|
|
|
143
|
-
const removed1 =
|
|
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(
|
|
207
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
150
208
|
|
|
151
|
-
expect(
|
|
209
|
+
expect(tmm.getHeight()).toBe(5);
|
|
152
210
|
|
|
153
|
-
const removed4 =
|
|
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(
|
|
160
|
-
expect(
|
|
217
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
218
|
+
expect(tmm.getHeight()).toBe(5);
|
|
161
219
|
|
|
162
|
-
const removed10 =
|
|
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(
|
|
225
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
168
226
|
|
|
169
|
-
expect(
|
|
227
|
+
expect(tmm.getHeight()).toBe(4);
|
|
170
228
|
|
|
171
|
-
const removed15 =
|
|
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(
|
|
178
|
-
expect(
|
|
235
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
236
|
+
expect(tmm.getHeight()).toBe(3);
|
|
179
237
|
|
|
180
|
-
const removed5 =
|
|
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(
|
|
187
|
-
expect(
|
|
244
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
245
|
+
expect(tmm.getHeight()).toBe(3);
|
|
188
246
|
|
|
189
|
-
const removed13 =
|
|
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(
|
|
195
|
-
expect(
|
|
252
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
253
|
+
expect(tmm.getHeight()).toBe(3);
|
|
196
254
|
|
|
197
|
-
const removed3 =
|
|
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(
|
|
203
|
-
expect(
|
|
260
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
261
|
+
expect(tmm.getHeight()).toBe(3);
|
|
204
262
|
|
|
205
|
-
const removed8 =
|
|
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(
|
|
211
|
-
expect(
|
|
268
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
269
|
+
expect(tmm.getHeight()).toBe(3);
|
|
212
270
|
|
|
213
|
-
const removed6 =
|
|
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(
|
|
219
|
-
expect(
|
|
276
|
+
expect(tmm.delete(6, undefined, true).length).toBe(0);
|
|
277
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
220
278
|
|
|
221
|
-
expect(
|
|
279
|
+
expect(tmm.getHeight()).toBe(3);
|
|
222
280
|
|
|
223
|
-
const removed7 =
|
|
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(
|
|
229
|
-
expect(
|
|
286
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
287
|
+
expect(tmm.getHeight()).toBe(3);
|
|
230
288
|
|
|
231
|
-
const removed9 =
|
|
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(
|
|
237
|
-
expect(
|
|
294
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
295
|
+
expect(tmm.getHeight()).toBe(2);
|
|
238
296
|
|
|
239
|
-
const removed14 =
|
|
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(
|
|
245
|
-
expect(
|
|
302
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
303
|
+
expect(tmm.getHeight()).toBe(1);
|
|
246
304
|
|
|
247
|
-
expect(
|
|
305
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
248
306
|
|
|
249
|
-
const bfsIDs =
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
|
360
|
+
const tmm = new TreeMultiMap<number>([], { iterationType: IterationType.RECURSIVE });
|
|
301
361
|
|
|
302
|
-
expect(
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
324
|
-
expect(
|
|
383
|
+
tmm.addMany(idAndValues);
|
|
384
|
+
expect(tmm.root).toBeInstanceOf(TreeMultiMapNode);
|
|
325
385
|
|
|
326
|
-
if (
|
|
386
|
+
if (tmm.root) expect(tmm.root.key).toBe(5);
|
|
327
387
|
|
|
328
|
-
expect(
|
|
329
|
-
expect(
|
|
388
|
+
expect(tmm.size).toBe(16);
|
|
389
|
+
expect(tmm.count).toBe(18);
|
|
390
|
+
expect(tmm.getMutableCount()).toBe(18);
|
|
330
391
|
|
|
331
|
-
expect(
|
|
392
|
+
expect(tmm.has(6));
|
|
332
393
|
|
|
333
|
-
expect(
|
|
334
|
-
expect(
|
|
335
|
-
const nodeId10 =
|
|
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 =
|
|
399
|
+
const nodeVal9 = tmm.getNode(9, node => node.value);
|
|
339
400
|
expect(nodeVal9?.key).toBe(9);
|
|
340
401
|
|
|
341
|
-
const nodesByCount1 =
|
|
402
|
+
const nodesByCount1 = tmm.getNodes(1, node => node.count);
|
|
342
403
|
expect(nodesByCount1.length).toBe(14);
|
|
343
404
|
|
|
344
|
-
const nodesByCount2 =
|
|
405
|
+
const nodesByCount2 = tmm.getNodes(2, node => node.count);
|
|
345
406
|
expect(nodesByCount2.length).toBe(2);
|
|
346
|
-
const leftMost =
|
|
407
|
+
const leftMost = tmm.getLeftMost();
|
|
347
408
|
expect(leftMost?.key).toBe(1);
|
|
348
409
|
|
|
349
|
-
const node15 =
|
|
350
|
-
const minNodeBySpecificNode = node15 &&
|
|
351
|
-
expect(minNodeBySpecificNode?.key).toBe(
|
|
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 &&
|
|
355
|
-
expect(subTreeSum).toBe(
|
|
415
|
+
node15 && tmm.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
416
|
+
expect(subTreeSum).toBe(45);
|
|
356
417
|
let lesserSum = 0;
|
|
357
|
-
expect(
|
|
358
|
-
|
|
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 =
|
|
431
|
+
const subTreeAdd = tmm.dfs(node => (node.count += 1), 'pre', 15);
|
|
371
432
|
expect(subTreeAdd);
|
|
372
433
|
}
|
|
373
|
-
const node11 =
|
|
434
|
+
const node11 = tmm.getNode(11);
|
|
374
435
|
expect(node11 instanceof TreeMultiMapNode);
|
|
375
436
|
if (node11 instanceof TreeMultiMapNode) {
|
|
376
|
-
const allGreaterNodesAdded =
|
|
437
|
+
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
377
438
|
expect(allGreaterNodesAdded);
|
|
378
439
|
}
|
|
379
440
|
|
|
380
|
-
const dfsInorderNodes =
|
|
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(
|
|
444
|
+
expect(tmm.isPerfectlyBalanced()).toBe(false);
|
|
384
445
|
|
|
385
|
-
|
|
446
|
+
tmm.perfectlyBalance();
|
|
386
447
|
|
|
387
|
-
expect(
|
|
388
|
-
expect(
|
|
448
|
+
expect(tmm.isPerfectlyBalanced()).toBe(false);
|
|
449
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
389
450
|
|
|
390
|
-
const bfsNodesAfterBalanced =
|
|
391
|
-
expect(bfsNodesAfterBalanced[0].key).toBe(
|
|
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 =
|
|
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(
|
|
462
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
402
463
|
|
|
403
|
-
expect(
|
|
464
|
+
expect(tmm.getHeight(15)).toBe(1);
|
|
404
465
|
|
|
405
|
-
const removed1 =
|
|
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(
|
|
472
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
412
473
|
|
|
413
|
-
expect(
|
|
474
|
+
expect(tmm.getHeight()).toBe(5);
|
|
414
475
|
|
|
415
|
-
const removed4 =
|
|
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(
|
|
422
|
-
expect(
|
|
482
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
483
|
+
expect(tmm.getHeight()).toBe(5);
|
|
423
484
|
|
|
424
|
-
const removed10 =
|
|
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(
|
|
490
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
430
491
|
|
|
431
|
-
expect(
|
|
492
|
+
expect(tmm.getHeight()).toBe(4);
|
|
432
493
|
|
|
433
|
-
const removed15 =
|
|
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(
|
|
440
|
-
expect(
|
|
500
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
501
|
+
expect(tmm.getHeight()).toBe(3);
|
|
441
502
|
|
|
442
|
-
const removed5 =
|
|
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(
|
|
449
|
-
expect(
|
|
509
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
510
|
+
expect(tmm.getHeight()).toBe(3);
|
|
450
511
|
|
|
451
|
-
const removed13 =
|
|
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(
|
|
457
|
-
expect(
|
|
517
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
518
|
+
expect(tmm.getHeight()).toBe(3);
|
|
458
519
|
|
|
459
|
-
const removed3 =
|
|
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(
|
|
465
|
-
expect(
|
|
525
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
526
|
+
expect(tmm.getHeight()).toBe(3);
|
|
466
527
|
|
|
467
|
-
const removed8 =
|
|
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(
|
|
473
|
-
expect(
|
|
533
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
534
|
+
expect(tmm.getHeight()).toBe(3);
|
|
474
535
|
|
|
475
|
-
const removed6 =
|
|
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(
|
|
481
|
-
expect(
|
|
541
|
+
expect(tmm.delete(6, undefined, true).length).toBe(0);
|
|
542
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
482
543
|
|
|
483
|
-
expect(
|
|
544
|
+
expect(tmm.getHeight()).toBe(3);
|
|
484
545
|
|
|
485
|
-
const removed7 =
|
|
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(
|
|
491
|
-
expect(
|
|
551
|
+
expect(tmm.isAVLBalanced()).toBe(false);
|
|
552
|
+
expect(tmm.getHeight()).toBe(3);
|
|
492
553
|
|
|
493
|
-
const removed9 =
|
|
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(
|
|
499
|
-
expect(
|
|
559
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
560
|
+
expect(tmm.getHeight()).toBe(2);
|
|
500
561
|
|
|
501
|
-
const removed14 =
|
|
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(
|
|
507
|
-
expect(
|
|
567
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
568
|
+
expect(tmm.getHeight()).toBe(1);
|
|
508
569
|
|
|
509
|
-
expect(
|
|
570
|
+
expect(tmm.isAVLBalanced()).toBe(true);
|
|
510
571
|
|
|
511
|
-
const bfsIDs =
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
|
561
|
-
const
|
|
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
|
-
|
|
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 =
|
|
633
|
+
const dfs = tmm.dfs(node => node);
|
|
571
634
|
isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
|
|
572
635
|
});
|
|
573
636
|
|
|
574
|
-
it('
|
|
575
|
-
|
|
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
|
-
|
|
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
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
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(
|
|
588
|
-
expect(
|
|
589
|
-
expect(
|
|
590
|
-
expect(
|
|
591
|
-
expect(
|
|
592
|
-
expect(
|
|
593
|
-
expect(
|
|
594
|
-
expect(
|
|
595
|
-
expect(
|
|
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
|
|
599
|
-
|
|
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(
|
|
607
|
-
expect(
|
|
608
|
-
expect(
|
|
609
|
-
expect(
|
|
610
|
-
expect(
|
|
611
|
-
expect(
|
|
612
|
-
expect(
|
|
613
|
-
expect(
|
|
614
|
-
|
|
615
|
-
checkTreeStructure(
|
|
616
|
-
const cloned =
|
|
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(
|
|
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(
|
|
694
|
-
expect(cloned.root?.right?.value).toBe('
|
|
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', () => {
|