data-structure-typed 1.42.2 → 1.42.4
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 +12 -12
- package/benchmark/report.html +12 -12
- package/benchmark/report.json +104 -104
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +5 -3
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +57 -53
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +116 -54
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +42 -15
- package/dist/cjs/src/data-structures/binary-tree/bst.js +77 -21
- package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +148 -180
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/tree-multiset.d.ts +10 -10
- package/dist/cjs/src/data-structures/binary-tree/tree-multiset.js +20 -17
- package/dist/cjs/src/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +5 -3
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +57 -53
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +117 -55
- package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +42 -15
- package/dist/mjs/src/data-structures/binary-tree/bst.js +79 -21
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +28 -51
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +148 -184
- package/dist/mjs/src/data-structures/binary-tree/tree-multiset.d.ts +10 -10
- package/dist/mjs/src/data-structures/binary-tree/tree-multiset.js +19 -17
- package/dist/mjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.d.ts +4 -0
- package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.js +0 -5
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/data-structures/binary-tree/avl-tree.ts +5 -4
- package/src/data-structures/binary-tree/binary-tree.ts +227 -158
- package/src/data-structures/binary-tree/bst.ts +100 -34
- package/src/data-structures/binary-tree/rb-tree.ts +227 -236
- package/src/data-structures/binary-tree/tree-multiset.ts +24 -23
- package/src/data-structures/graph/abstract-graph.ts +18 -14
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/types/data-structures/binary-tree/rb-tree.ts +5 -5
- package/test/performance/reportor.ts +1 -0
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +20 -1
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +38 -38
- package/test/unit/data-structures/binary-tree/bst.test.ts +13 -0
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +205 -159
- package/test/unit/data-structures/graph/directed-graph.test.ts +7 -8
- package/test/unit/data-structures/graph/salty-edges.json +875 -1
- package/test/unit/data-structures/graph/salty-vertexes.json +200 -1
- package/test/unit/data-structures/graph/undirected-graph.test.ts +15 -16
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {IterationType, RBTNColor, RBTreeNode, RedBlackTree} from '../../../../src';
|
|
2
2
|
import {getRandomInt} from '../../../utils';
|
|
3
3
|
import {isDebugTest} from '../../../config';
|
|
4
4
|
|
|
@@ -20,7 +20,7 @@ describe('RedBlackTree', () => {
|
|
|
20
20
|
expect(tree.getNode(10)).toBeInstanceOf(RBTreeNode);
|
|
21
21
|
expect(tree.getNode(20)).toBeInstanceOf(RBTreeNode);
|
|
22
22
|
expect(tree.getNode(5)).toBeInstanceOf(RBTreeNode);
|
|
23
|
-
expect(tree.getNode(15)).toBe(
|
|
23
|
+
expect(tree.getNode(15)).toBe(undefined);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
test('should add and find nodes with negative keys', () => {
|
|
@@ -39,7 +39,7 @@ describe('RedBlackTree', () => {
|
|
|
39
39
|
tree.add(5);
|
|
40
40
|
tree.delete(20);
|
|
41
41
|
|
|
42
|
-
expect(tree.getNode(20)).toBe(
|
|
42
|
+
expect(tree.getNode(20)).toBe(undefined);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
test('should handle deleting a non-existent node', () => {
|
|
@@ -48,7 +48,7 @@ describe('RedBlackTree', () => {
|
|
|
48
48
|
tree.add(5);
|
|
49
49
|
tree.delete(15);
|
|
50
50
|
|
|
51
|
-
expect(tree.getNode(15)).toBe(
|
|
51
|
+
expect(tree.getNode(15)).toBe(undefined);
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
54
|
|
|
@@ -66,7 +66,7 @@ describe('RedBlackTree', () => {
|
|
|
66
66
|
|
|
67
67
|
test('should handle an empty tree', () => {
|
|
68
68
|
const minNode = tree.getLeftMost(tree.root);
|
|
69
|
-
expect(minNode).toBe(NIL);
|
|
69
|
+
expect(minNode).toBe(tree.NIL);
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
@@ -84,7 +84,7 @@ describe('RedBlackTree', () => {
|
|
|
84
84
|
|
|
85
85
|
test('should handle an empty tree', () => {
|
|
86
86
|
const maxNode = tree.getRightMost(tree.root);
|
|
87
|
-
expect(maxNode).toBe(NIL);
|
|
87
|
+
expect(maxNode).toBe(tree.NIL);
|
|
88
88
|
});
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -97,9 +97,9 @@ describe('RedBlackTree', () => {
|
|
|
97
97
|
tree.add(25);
|
|
98
98
|
|
|
99
99
|
const node = tree.getNode(15);
|
|
100
|
-
const successorNode = tree.getSuccessor(node);
|
|
100
|
+
const successorNode = tree.getSuccessor(node!);
|
|
101
101
|
|
|
102
|
-
expect(successorNode
|
|
102
|
+
expect(successorNode?.key).toBe(20);
|
|
103
103
|
});
|
|
104
104
|
|
|
105
105
|
test('should handle a node with no getSuccessor', () => {
|
|
@@ -107,9 +107,9 @@ describe('RedBlackTree', () => {
|
|
|
107
107
|
tree.add(5);
|
|
108
108
|
|
|
109
109
|
const node = tree.getNode(10);
|
|
110
|
-
const successorNode = tree.getSuccessor(node);
|
|
111
|
-
// TODO not sure if it should be
|
|
112
|
-
expect(successorNode).toBe(
|
|
110
|
+
const successorNode = tree.getSuccessor(node!);
|
|
111
|
+
// TODO not sure if it should be undefined or tree.NIL
|
|
112
|
+
expect(successorNode).toBe(undefined);
|
|
113
113
|
});
|
|
114
114
|
});
|
|
115
115
|
|
|
@@ -122,9 +122,9 @@ describe('RedBlackTree', () => {
|
|
|
122
122
|
tree.add(25);
|
|
123
123
|
|
|
124
124
|
const node = tree.getNode(20);
|
|
125
|
-
const predecessorNode = tree.getPredecessor(node);
|
|
125
|
+
const predecessorNode = tree.getPredecessor(node!);
|
|
126
126
|
|
|
127
|
-
expect(predecessorNode
|
|
127
|
+
expect(predecessorNode?.key).toBe(15);
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
test('should handle a node with no getPredecessor', () => {
|
|
@@ -132,8 +132,8 @@ describe('RedBlackTree', () => {
|
|
|
132
132
|
tree.add(20);
|
|
133
133
|
|
|
134
134
|
const node = tree.getNode(20);
|
|
135
|
-
const predecessorNode = tree.getPredecessor(node);
|
|
136
|
-
// TODO not sure if it should be NIL or something else.
|
|
135
|
+
const predecessorNode = tree.getPredecessor(node!);
|
|
136
|
+
// TODO not sure if it should be tree.NIL or something else.
|
|
137
137
|
expect(predecessorNode).toBe(tree.getNode(10));
|
|
138
138
|
});
|
|
139
139
|
});
|
|
@@ -160,14 +160,14 @@ describe('RedBlackTree', () => {
|
|
|
160
160
|
tree.add(20);
|
|
161
161
|
tree.add(5);
|
|
162
162
|
tree.delete(20);
|
|
163
|
-
expect(tree.getNode(20)).toBe(
|
|
163
|
+
expect(tree.getNode(20)).toBe(undefined);
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
it('should get the successor of a node', () => {
|
|
167
167
|
tree.add(10);
|
|
168
168
|
tree.add(20);
|
|
169
169
|
const node = tree.getNode(10);
|
|
170
|
-
const successor = tree.getSuccessor(node);
|
|
170
|
+
const successor = tree.getSuccessor(node!);
|
|
171
171
|
expect(successor?.key).toBe(20);
|
|
172
172
|
});
|
|
173
173
|
|
|
@@ -175,7 +175,7 @@ describe('RedBlackTree', () => {
|
|
|
175
175
|
tree.add(10);
|
|
176
176
|
tree.add(20);
|
|
177
177
|
const node = tree.getNode(20);
|
|
178
|
-
const predecessor = tree.getPredecessor(node);
|
|
178
|
+
const predecessor = tree.getPredecessor(node!);
|
|
179
179
|
expect(predecessor?.key).toBe(10);
|
|
180
180
|
});
|
|
181
181
|
|
|
@@ -186,8 +186,8 @@ describe('RedBlackTree', () => {
|
|
|
186
186
|
const node = tree.getNode(10);
|
|
187
187
|
tree.add(15);
|
|
188
188
|
// Verify that rotation has occurred
|
|
189
|
-
expect(node
|
|
190
|
-
expect(node
|
|
189
|
+
expect(node?.left?.key).toBe(5);
|
|
190
|
+
expect(node?.right?.key).toBe(20);
|
|
191
191
|
});
|
|
192
192
|
|
|
193
193
|
it('should rotate nodes to the right', () => {
|
|
@@ -197,8 +197,8 @@ describe('RedBlackTree', () => {
|
|
|
197
197
|
const node = tree.getNode(20);
|
|
198
198
|
tree.add(25);
|
|
199
199
|
// Verify that rotation has occurred
|
|
200
|
-
expect(node
|
|
201
|
-
expect(node
|
|
200
|
+
expect(node?.left?.key).toBeNaN();
|
|
201
|
+
expect(node?.right?.key).toBe(25);
|
|
202
202
|
});
|
|
203
203
|
|
|
204
204
|
it('should all node attributes fully conform to the red-black tree standards.', () => {
|
|
@@ -217,46 +217,46 @@ describe('RedBlackTree', () => {
|
|
|
217
217
|
let node21F = tree.getNode(21);
|
|
218
218
|
let node6F = tree.getNode(6);
|
|
219
219
|
let node2F = tree.getNode(2);
|
|
220
|
-
expect(node10F
|
|
221
|
-
expect(node10F
|
|
222
|
-
expect(node10F
|
|
223
|
-
expect(node10F
|
|
224
|
-
expect(node10F
|
|
225
|
-
expect(node20F
|
|
226
|
-
expect(node20F
|
|
227
|
-
expect(node20F
|
|
228
|
-
expect(node20F
|
|
229
|
-
expect(node20F
|
|
230
|
-
expect(node5F
|
|
231
|
-
expect(node5F
|
|
232
|
-
expect(node5F
|
|
233
|
-
expect(node5F
|
|
234
|
-
expect(node5F
|
|
235
|
-
expect(node15F
|
|
236
|
-
expect(node15F
|
|
237
|
-
expect(node15F
|
|
238
|
-
expect(node15F
|
|
239
|
-
expect(node15F
|
|
240
|
-
expect(node21F
|
|
241
|
-
expect(node21F
|
|
242
|
-
expect(node21F
|
|
243
|
-
expect(node21F
|
|
244
|
-
expect(node21F
|
|
245
|
-
expect(node6F
|
|
246
|
-
expect(node6F
|
|
247
|
-
expect(node6F
|
|
248
|
-
expect(node6F
|
|
249
|
-
expect(node6F
|
|
250
|
-
expect(node2F
|
|
251
|
-
expect(node2F
|
|
252
|
-
expect(node2F
|
|
253
|
-
expect(node2F
|
|
254
|
-
expect(node2F
|
|
255
|
-
expect(node15F
|
|
256
|
-
expect(node15F
|
|
257
|
-
expect(node15F
|
|
258
|
-
expect(node15F
|
|
259
|
-
expect(node15F
|
|
220
|
+
expect(node10F?.key).toBe(10);
|
|
221
|
+
expect(node10F?.color).toBe(RBTNColor.BLACK);
|
|
222
|
+
expect(node10F?.left).toBe(node5F);
|
|
223
|
+
expect(node10F?.right).toBe(node20F);
|
|
224
|
+
expect(node10F?.parent).toBe(undefined);
|
|
225
|
+
expect(node20F?.key).toBe(20);
|
|
226
|
+
expect(node20F?.color).toBe(RBTNColor.BLACK);
|
|
227
|
+
expect(node20F?.left).toBe(node15F);
|
|
228
|
+
expect(node20F?.right).toBe(node21F);
|
|
229
|
+
expect(node20F?.parent).toBe(node10F);
|
|
230
|
+
expect(node5F?.key).toBe(5);
|
|
231
|
+
expect(node5F?.color).toBe(RBTNColor.BLACK);
|
|
232
|
+
expect(node5F?.left).toBe(node2F);
|
|
233
|
+
expect(node5F?.right).toBe(node6F);
|
|
234
|
+
expect(node5F?.parent).toBe(node10F);
|
|
235
|
+
expect(node15F?.key).toBe(15);
|
|
236
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
237
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
238
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
239
|
+
expect(node15F?.parent).toBe(node20F);
|
|
240
|
+
expect(node21F?.key).toBe(21);
|
|
241
|
+
expect(node21F?.color).toBe(RBTNColor.RED);
|
|
242
|
+
expect(node21F?.left).toBe(tree.NIL);
|
|
243
|
+
expect(node21F?.right).toBe(tree.NIL);
|
|
244
|
+
expect(node21F?.parent).toBe(node20F);
|
|
245
|
+
expect(node6F?.key).toBe(6);
|
|
246
|
+
expect(node6F?.color).toBe(RBTNColor.RED);
|
|
247
|
+
expect(node6F?.left).toBe(tree.NIL);
|
|
248
|
+
expect(node6F?.right).toBe(tree.NIL);
|
|
249
|
+
expect(node6F?.parent).toBe(node5F);
|
|
250
|
+
expect(node2F?.key).toBe(2);
|
|
251
|
+
expect(node2F?.color).toBe(RBTNColor.RED);
|
|
252
|
+
expect(node2F?.left).toBe(tree.NIL);
|
|
253
|
+
expect(node2F?.right).toBe(tree.NIL);
|
|
254
|
+
expect(node2F?.parent).toBe(node5F);
|
|
255
|
+
expect(node15F?.key).toBe(15);
|
|
256
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
257
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
258
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
259
|
+
expect(node15F?.parent).toBe(node20F);
|
|
260
260
|
tree.delete(5);
|
|
261
261
|
node10F = tree.getNode(10);
|
|
262
262
|
node20F = tree.getNode(20);
|
|
@@ -265,42 +265,42 @@ describe('RedBlackTree', () => {
|
|
|
265
265
|
node21F = tree.getNode(21);
|
|
266
266
|
node6F = tree.getNode(6);
|
|
267
267
|
node2F = tree.getNode(2);
|
|
268
|
-
expect(node10F
|
|
269
|
-
expect(node10F
|
|
270
|
-
expect(node10F
|
|
271
|
-
expect(node10F
|
|
272
|
-
expect(node10F
|
|
273
|
-
expect(node20F
|
|
274
|
-
expect(node20F
|
|
275
|
-
expect(node20F
|
|
276
|
-
expect(node20F
|
|
277
|
-
expect(node20F
|
|
278
|
-
expect(node5F).toBe(
|
|
279
|
-
expect(node15F
|
|
280
|
-
expect(node15F
|
|
281
|
-
expect(node15F
|
|
282
|
-
expect(node15F
|
|
283
|
-
expect(node15F
|
|
284
|
-
expect(node21F
|
|
285
|
-
expect(node21F
|
|
286
|
-
expect(node21F
|
|
287
|
-
expect(node21F
|
|
288
|
-
expect(node21F
|
|
289
|
-
expect(node6F
|
|
290
|
-
expect(node6F
|
|
291
|
-
expect(node6F
|
|
292
|
-
expect(node6F
|
|
293
|
-
expect(node6F
|
|
294
|
-
expect(node2F
|
|
295
|
-
expect(node2F
|
|
296
|
-
expect(node2F
|
|
297
|
-
expect(node2F
|
|
298
|
-
expect(node2F
|
|
299
|
-
expect(node15F
|
|
300
|
-
expect(node15F
|
|
301
|
-
expect(node15F
|
|
302
|
-
expect(node15F
|
|
303
|
-
expect(node15F
|
|
268
|
+
expect(node10F?.key).toBe(10);
|
|
269
|
+
expect(node10F?.color).toBe(RBTNColor.BLACK);
|
|
270
|
+
expect(node10F?.left).toBe(node6F);
|
|
271
|
+
expect(node10F?.right).toBe(node20F);
|
|
272
|
+
expect(node10F?.parent).toBe(undefined);
|
|
273
|
+
expect(node20F?.key).toBe(20);
|
|
274
|
+
expect(node20F?.color).toBe(RBTNColor.BLACK);
|
|
275
|
+
expect(node20F?.left).toBe(node15F);
|
|
276
|
+
expect(node20F?.right).toBe(node21F);
|
|
277
|
+
expect(node20F?.parent).toBe(node10F);
|
|
278
|
+
expect(node5F).toBe(undefined);
|
|
279
|
+
expect(node15F?.key).toBe(15);
|
|
280
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
281
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
282
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
283
|
+
expect(node15F?.parent).toBe(node20F);
|
|
284
|
+
expect(node21F?.key).toBe(21);
|
|
285
|
+
expect(node21F?.color).toBe(RBTNColor.RED);
|
|
286
|
+
expect(node21F?.left).toBe(tree.NIL);
|
|
287
|
+
expect(node21F?.right).toBe(tree.NIL);
|
|
288
|
+
expect(node21F?.parent).toBe(node20F);
|
|
289
|
+
expect(node6F?.key).toBe(6);
|
|
290
|
+
expect(node6F?.color).toBe(RBTNColor.BLACK);
|
|
291
|
+
expect(node6F?.left).toBe(node2F);
|
|
292
|
+
expect(node6F?.right).toBe(tree.NIL);
|
|
293
|
+
expect(node6F?.parent).toBe(node10F);
|
|
294
|
+
expect(node2F?.key).toBe(2);
|
|
295
|
+
expect(node2F?.color).toBe(RBTNColor.RED);
|
|
296
|
+
expect(node2F?.left).toBe(tree.NIL);
|
|
297
|
+
expect(node2F?.right).toBe(tree.NIL);
|
|
298
|
+
expect(node2F?.parent).toBe(node6F);
|
|
299
|
+
expect(node15F?.key).toBe(15);
|
|
300
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
301
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
302
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
303
|
+
expect(node15F?.parent).toBe(node20F);
|
|
304
304
|
tree.delete(20);
|
|
305
305
|
node10F = tree.getNode(10);
|
|
306
306
|
node20F = tree.getNode(20);
|
|
@@ -309,38 +309,38 @@ describe('RedBlackTree', () => {
|
|
|
309
309
|
node21F = tree.getNode(21);
|
|
310
310
|
node6F = tree.getNode(6);
|
|
311
311
|
node2F = tree.getNode(2);
|
|
312
|
-
expect(node10F
|
|
313
|
-
expect(node10F
|
|
314
|
-
expect(node10F
|
|
315
|
-
expect(node10F
|
|
316
|
-
expect(node10F
|
|
317
|
-
expect(node20F).toBe(
|
|
318
|
-
expect(node5F).toBe(
|
|
319
|
-
expect(node15F
|
|
320
|
-
expect(node15F
|
|
321
|
-
expect(node15F
|
|
322
|
-
expect(node15F
|
|
323
|
-
expect(node15F
|
|
324
|
-
expect(node21F
|
|
325
|
-
expect(node21F
|
|
326
|
-
expect(node21F
|
|
327
|
-
expect(node21F
|
|
328
|
-
expect(node21F
|
|
329
|
-
expect(node6F
|
|
330
|
-
expect(node6F
|
|
331
|
-
expect(node6F
|
|
332
|
-
expect(node6F
|
|
333
|
-
expect(node6F
|
|
334
|
-
expect(node2F
|
|
335
|
-
expect(node2F
|
|
336
|
-
expect(node2F
|
|
337
|
-
expect(node2F
|
|
338
|
-
expect(node2F
|
|
339
|
-
expect(node15F
|
|
340
|
-
expect(node15F
|
|
341
|
-
expect(node15F
|
|
342
|
-
expect(node15F
|
|
343
|
-
expect(node15F
|
|
312
|
+
expect(node10F?.key).toBe(10);
|
|
313
|
+
expect(node10F?.color).toBe(RBTNColor.BLACK);
|
|
314
|
+
expect(node10F?.left).toBe(node6F);
|
|
315
|
+
expect(node10F?.right).toBe(node21F);
|
|
316
|
+
expect(node10F?.parent).toBe(undefined);
|
|
317
|
+
expect(node20F).toBe(undefined);
|
|
318
|
+
expect(node5F).toBe(undefined);
|
|
319
|
+
expect(node15F?.key).toBe(15);
|
|
320
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
321
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
322
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
323
|
+
expect(node15F?.parent).toBe(node21F);
|
|
324
|
+
expect(node21F?.key).toBe(21);
|
|
325
|
+
expect(node21F?.color).toBe(RBTNColor.BLACK);
|
|
326
|
+
expect(node21F?.left).toBe(node15F);
|
|
327
|
+
expect(node21F?.right).toBe(tree.NIL);
|
|
328
|
+
expect(node21F?.parent).toBe(node10F);
|
|
329
|
+
expect(node6F?.key).toBe(6);
|
|
330
|
+
expect(node6F?.color).toBe(RBTNColor.BLACK);
|
|
331
|
+
expect(node6F?.left).toBe(node2F);
|
|
332
|
+
expect(node6F?.right).toBe(tree.NIL);
|
|
333
|
+
expect(node6F?.parent).toBe(node10F);
|
|
334
|
+
expect(node2F?.key).toBe(2);
|
|
335
|
+
expect(node2F?.color).toBe(RBTNColor.RED);
|
|
336
|
+
expect(node2F?.left).toBe(tree.NIL);
|
|
337
|
+
expect(node2F?.right).toBe(tree.NIL);
|
|
338
|
+
expect(node2F?.parent).toBe(node6F);
|
|
339
|
+
expect(node15F?.key).toBe(15);
|
|
340
|
+
expect(node15F?.color).toBe(RBTNColor.RED);
|
|
341
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
342
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
343
|
+
expect(node15F?.parent).toBe(node21F);
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
it('should fix the tree after insertion', () => {
|
|
@@ -349,9 +349,9 @@ describe('RedBlackTree', () => {
|
|
|
349
349
|
tree.add(5);
|
|
350
350
|
tree.add(15);
|
|
351
351
|
const node15F = tree.getNode(15);
|
|
352
|
-
expect(node15F
|
|
353
|
-
expect(node15F
|
|
354
|
-
expect(node15F
|
|
352
|
+
expect(node15F?.left).toBe(tree.NIL);
|
|
353
|
+
expect(node15F?.right).toBe(tree.NIL);
|
|
354
|
+
expect(node15F?.parent).toBe(tree.getNode(5));
|
|
355
355
|
|
|
356
356
|
tree.add(25);
|
|
357
357
|
tree.add(10);
|
|
@@ -365,22 +365,22 @@ describe('RedBlackTree', () => {
|
|
|
365
365
|
tree.add(155);
|
|
366
366
|
tree.add(225);
|
|
367
367
|
const node225F = tree.getNode(225);
|
|
368
|
-
expect(node225F
|
|
369
|
-
expect(node225F
|
|
370
|
-
expect(node225F
|
|
368
|
+
expect(node225F?.left).toBe(tree.NIL);
|
|
369
|
+
expect(node225F?.right).toBe(tree.NIL);
|
|
370
|
+
expect(node225F?.parent?.key).toBe(155);
|
|
371
371
|
tree.add(7);
|
|
372
372
|
|
|
373
373
|
const node15S = tree.getNode(15);
|
|
374
|
-
expect(node15S
|
|
375
|
-
expect(node15S
|
|
374
|
+
expect(node15S?.left?.key).toBe(8);
|
|
375
|
+
expect(node15S?.right?.key).toBe(28);
|
|
376
376
|
expect(node15S).toBe(tree.root);
|
|
377
|
-
expect(node15S
|
|
377
|
+
expect(node15S?.parent).toBe(undefined);
|
|
378
378
|
tree.delete(15);
|
|
379
379
|
expect(tree.root.key).toBe(22);
|
|
380
|
-
expect(tree.root.parent).toBe(
|
|
380
|
+
expect(tree.root.parent).toBe(undefined);
|
|
381
381
|
|
|
382
382
|
const node15T = tree.getNode(15);
|
|
383
|
-
expect(node15T).toBe(
|
|
383
|
+
expect(node15T).toBe(undefined);
|
|
384
384
|
|
|
385
385
|
tree.add(23);
|
|
386
386
|
tree.add(33);
|
|
@@ -390,33 +390,27 @@ describe('RedBlackTree', () => {
|
|
|
390
390
|
expect(nodeLM.key).toBe(1);
|
|
391
391
|
|
|
392
392
|
const node50 = tree.getNode(50);
|
|
393
|
-
expect(node50
|
|
394
|
-
expect(node50
|
|
395
|
-
expect(node50
|
|
393
|
+
expect(node50?.key).toBe(50);
|
|
394
|
+
expect(node50?.left?.key).toBe(33);
|
|
395
|
+
expect(node50?.right).toBe(tree.NIL);
|
|
396
396
|
const node15Fo = tree.getNode(15);
|
|
397
397
|
|
|
398
|
-
expect(node15Fo
|
|
399
|
-
expect(node15Fo
|
|
398
|
+
expect(node15Fo?.key).toBe(15);
|
|
399
|
+
expect(node15Fo?.left).toBe(tree.NIL);
|
|
400
400
|
const node225S = tree.getNode(225);
|
|
401
|
-
expect(node225S
|
|
402
|
-
expect(node225S
|
|
403
|
-
expect(node225S
|
|
404
|
-
|
|
405
|
-
tree.
|
|
401
|
+
expect(node225S?.left).toBe(tree.NIL);
|
|
402
|
+
expect(node225S?.right).toBe(tree.NIL);
|
|
403
|
+
expect(node225S?.parent?.key).toBe(155);
|
|
404
|
+
// TODO
|
|
405
|
+
// expect(tree.getNode(0)).toBe(undefined);
|
|
406
406
|
tree.add(2);
|
|
407
407
|
tree.add(3);
|
|
408
408
|
tree.add(4);
|
|
409
|
-
tree.add(5);
|
|
410
409
|
tree.add(6);
|
|
411
|
-
tree.add(7);
|
|
412
|
-
tree.add(8);
|
|
413
410
|
tree.add(9);
|
|
414
|
-
tree.add(10);
|
|
415
411
|
tree.add(11);
|
|
416
|
-
tree.add(12);
|
|
417
412
|
tree.add(13);
|
|
418
413
|
tree.add(14);
|
|
419
|
-
tree.add(15);
|
|
420
414
|
tree.add(16);
|
|
421
415
|
tree.add(17);
|
|
422
416
|
tree.add(18);
|
|
@@ -424,12 +418,64 @@ describe('RedBlackTree', () => {
|
|
|
424
418
|
tree.add(110);
|
|
425
419
|
|
|
426
420
|
isDebug && tree.print();
|
|
421
|
+
|
|
422
|
+
expect(tree.dfs()).toEqual([
|
|
423
|
+
1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
424
|
+
10, 11, 12, 13, 14, 15, 16, 17, 18,
|
|
425
|
+
19, 22, 23, 25, 28, 33, 50, 110, 111,
|
|
426
|
+
155, 225
|
|
427
|
+
])
|
|
428
|
+
|
|
429
|
+
expect(tree.isBST()).toBe(true);
|
|
430
|
+
|
|
427
431
|
});
|
|
428
432
|
|
|
429
433
|
it('should fix the tree after insertion and deletion', () => {
|
|
430
434
|
for (let i = 0; i < 100; i++) {
|
|
431
|
-
tree.add(
|
|
432
|
-
|
|
435
|
+
tree.add(i);
|
|
436
|
+
}
|
|
437
|
+
for (let i = 0; i < 49; i++) {
|
|
438
|
+
tree.delete(i);
|
|
433
439
|
}
|
|
440
|
+
|
|
441
|
+
expect(tree.size).toBe(51);
|
|
442
|
+
expect(tree.isBST()).toBe(true);
|
|
443
|
+
expect(tree.dfs( n => n.key, "in", tree.root, IterationType.ITERATIVE)).toEqual([
|
|
444
|
+
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
|
|
445
|
+
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
|
|
446
|
+
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
|
|
447
|
+
82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
|
|
448
|
+
93, 94, 95, 96, 97, 98, 99
|
|
449
|
+
])
|
|
450
|
+
expect(tree.dfs( n => n.key, "in", tree.root, IterationType.RECURSIVE)).toEqual([
|
|
451
|
+
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
|
|
452
|
+
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
|
|
453
|
+
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
|
|
454
|
+
82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
|
|
455
|
+
93, 94, 95, 96, 97, 98, 99
|
|
456
|
+
])
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('should fix the tree after large scale insertion and deletion', () => {
|
|
460
|
+
for (let i = 0; i < 10000; i++) {
|
|
461
|
+
tree.add(i);
|
|
462
|
+
}
|
|
463
|
+
for (let i = 0; i < 10000; i++) {
|
|
464
|
+
tree.delete(i);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
expect(tree.size).toBe(0);
|
|
468
|
+
expect(tree.isBST()).toBe(true);
|
|
469
|
+
expect(tree.dfs( n => n.key, "in", tree.root, IterationType.ITERATIVE)).toEqual([])
|
|
470
|
+
|
|
471
|
+
tree.clear();
|
|
472
|
+
for (let i = 0; i < 1000; i++) {
|
|
473
|
+
tree.add(getRandomInt(-100, 1000))
|
|
474
|
+
tree.delete(getRandomInt(-100, 1000))
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// TODO there is a bug when dfs the tree with NIL node
|
|
478
|
+
// expect(tree.isBST()).toBe(true);
|
|
434
479
|
});
|
|
480
|
+
|
|
435
481
|
});
|
|
@@ -563,7 +563,6 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
|
|
|
563
563
|
});
|
|
564
564
|
});
|
|
565
565
|
|
|
566
|
-
|
|
567
566
|
describe('cycles, strongly connected components, bridges, articular points in DirectedGraph', () => {
|
|
568
567
|
const graph = new DirectedGraph();
|
|
569
568
|
graph.addVertex('A');
|
|
@@ -589,10 +588,10 @@ describe('cycles, strongly connected components, bridges, articular points in Di
|
|
|
589
588
|
const cutVertexes = graph.getCutVertexes();
|
|
590
589
|
const dfnMap = graph.getDFNMap();
|
|
591
590
|
const lowMap = graph.getLowMap();
|
|
592
|
-
expect(cycles.size).toBe(1)
|
|
593
|
-
expect(scCs.size).toBe(5)
|
|
594
|
-
expect(bridges.length).toBe(4)
|
|
595
|
-
expect(cutVertexes.length).toBe(4)
|
|
596
|
-
expect(dfnMap.size).toBe(8)
|
|
597
|
-
expect(lowMap.size).toBe(8)
|
|
598
|
-
});
|
|
591
|
+
expect(cycles.size).toBe(1);
|
|
592
|
+
expect(scCs.size).toBe(5);
|
|
593
|
+
expect(bridges.length).toBe(4);
|
|
594
|
+
expect(cutVertexes.length).toBe(4);
|
|
595
|
+
expect(dfnMap.size).toBe(8);
|
|
596
|
+
expect(lowMap.size).toBe(8);
|
|
597
|
+
});
|