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