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