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