data-structure-typed 1.52.9 → 1.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +13 -13
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +24 -384
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -47
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +29 -27
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +376 -265
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +56 -56
- package/dist/cjs/data-structures/binary-tree/bst.js +108 -78
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -36
- 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 +21 -21
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +59 -49
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.js +3 -3
- package/dist/cjs/interfaces/binary-tree.d.ts +5 -5
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -46
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +29 -26
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +376 -264
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +56 -56
- package/dist/mjs/data-structures/binary-tree/bst.js +108 -76
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +42 -35
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +59 -48
- package/dist/mjs/data-structures/trie/trie.js +3 -3
- package/dist/mjs/interfaces/binary-tree.d.ts +5 -5
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
- package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/umd/data-structure-typed.js +596 -468
- package/dist/umd/data-structure-typed.min.js +5 -5
- 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 +60 -54
- package/src/data-structures/binary-tree/avl-tree.ts +32 -35
- package/src/data-structures/binary-tree/binary-tree.ts +440 -360
- package/src/data-structures/binary-tree/bst.ts +144 -113
- package/src/data-structures/binary-tree/rb-tree.ts +44 -43
- package/src/data-structures/binary-tree/tree-multi-map.ts +57 -61
- package/src/data-structures/trie/trie.ts +3 -3
- package/src/interfaces/binary-tree.ts +6 -6
- package/src/types/data-structures/binary-tree/binary-tree.ts +13 -14
- package/src/types/data-structures/binary-tree/bst.ts +3 -3
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +2 -2
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +9 -1
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +115 -3
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +109 -4
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +183 -46
- package/test/unit/data-structures/binary-tree/bst.test.ts +340 -21
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +19 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +141 -3
- package/test/utils/array.ts +15 -12
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BinaryTreeNode, BST, BSTNode } from '../../../../src';
|
|
2
|
-
import { isDebugTest,
|
|
2
|
+
import { isDebugTest, isTestStackOverflow, SYSTEM_MAX_CALL_STACK } from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
5
5
|
|
|
@@ -74,7 +74,7 @@ describe('BST operations test', () => {
|
|
|
74
74
|
const nodeId10 = bst.getNode(10);
|
|
75
75
|
expect(nodeId10?.key).toBe(10);
|
|
76
76
|
|
|
77
|
-
const nodeVal9 = bst.getNode(node => node.
|
|
77
|
+
const nodeVal9 = bst.getNode(node => node.key === 9);
|
|
78
78
|
expect(nodeVal9?.key).toBe(9);
|
|
79
79
|
|
|
80
80
|
const leftMost = bst.getLeftMost();
|
|
@@ -86,7 +86,7 @@ describe('BST operations test', () => {
|
|
|
86
86
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node => node, node15);
|
|
87
87
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
88
88
|
|
|
89
|
-
const nodes = bst.getNodes(node => node.
|
|
89
|
+
const nodes = bst.getNodes(node => node.key === 15);
|
|
90
90
|
expect(nodes.map(node => node.key)).toEqual([15]);
|
|
91
91
|
|
|
92
92
|
let subTreeSum = 0;
|
|
@@ -291,7 +291,7 @@ describe('BST operations test', () => {
|
|
|
291
291
|
expect(leftMost).toBe(1);
|
|
292
292
|
|
|
293
293
|
const node15 = objBST.getNode(15);
|
|
294
|
-
expect(node15
|
|
294
|
+
expect(objBST.get(node15)).toEqual({
|
|
295
295
|
name: 'Alice',
|
|
296
296
|
age: 15
|
|
297
297
|
});
|
|
@@ -450,22 +450,44 @@ describe('BST operations test', () => {
|
|
|
450
450
|
expect(bfsNodes[2].key).toBe(16);
|
|
451
451
|
});
|
|
452
452
|
|
|
453
|
-
it('should
|
|
453
|
+
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
454
454
|
const bst = new BST<number>();
|
|
455
|
-
const node0 = bst.
|
|
456
|
-
expect(node0).toEqual(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
455
|
+
const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
|
|
456
|
+
expect(node0).toEqual([
|
|
457
|
+
{
|
|
458
|
+
_left: undefined,
|
|
459
|
+
_right: undefined,
|
|
460
|
+
key: 0,
|
|
461
|
+
parent: undefined,
|
|
462
|
+
value: undefined
|
|
463
|
+
},
|
|
464
|
+
undefined
|
|
465
|
+
]);
|
|
463
466
|
|
|
464
|
-
const nodeUndefined = bst.
|
|
465
|
-
expect(nodeUndefined).
|
|
467
|
+
const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
468
|
+
expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
466
469
|
|
|
467
|
-
const nodeNull = bst.
|
|
468
|
-
expect(nodeNull).
|
|
470
|
+
const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
|
|
471
|
+
expect(nodeNull).toEqual([undefined, undefined]);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it('should replace value', () => {
|
|
475
|
+
const tree = new BST<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
476
|
+
expect(tree.get(1)).toBe('1');
|
|
477
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
478
|
+
tree.add(1, 'a');
|
|
479
|
+
expect(tree.get(1)).toBe('a');
|
|
480
|
+
tree.add([1, 'b']);
|
|
481
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
482
|
+
expect(tree.get(1)).toBe('b');
|
|
483
|
+
const treeMap = new BST<number>([4, 5, [1, '1'], 2, 3]);
|
|
484
|
+
expect(treeMap.get(1)).toBe('1');
|
|
485
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
486
|
+
treeMap.add(1, 'a');
|
|
487
|
+
expect(treeMap.get(1)).toBe('a');
|
|
488
|
+
treeMap.add([1, 'b']);
|
|
489
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
490
|
+
expect(treeMap.get(1)).toBe('b');
|
|
469
491
|
});
|
|
470
492
|
});
|
|
471
493
|
|
|
@@ -496,7 +518,7 @@ describe('BST operations test recursively', () => {
|
|
|
496
518
|
expect(nodeId10?.key).toBe(10);
|
|
497
519
|
|
|
498
520
|
const nodeVal9 = bst.getNode(node => node.value === 9);
|
|
499
|
-
expect(nodeVal9?.key).toBe(undefined);
|
|
521
|
+
expect(bst.get(nodeVal9?.key)).toBe(undefined);
|
|
500
522
|
|
|
501
523
|
const leftMost = bst.getLeftMost();
|
|
502
524
|
expect(leftMost).toBe(1);
|
|
@@ -705,7 +727,7 @@ describe('BST operations test recursively', () => {
|
|
|
705
727
|
expect(leftMost).toBe(1);
|
|
706
728
|
|
|
707
729
|
const node15 = objBST.getNode(15);
|
|
708
|
-
expect(node15
|
|
730
|
+
expect(objBST.get(node15)).toEqual({
|
|
709
731
|
key: 15,
|
|
710
732
|
keyA: 15
|
|
711
733
|
});
|
|
@@ -1132,7 +1154,7 @@ describe('BST iterative methods test', () => {
|
|
|
1132
1154
|
it('should clone work well', () => {
|
|
1133
1155
|
const cloned = bst.clone();
|
|
1134
1156
|
expect(cloned.root?.left).toBe(undefined);
|
|
1135
|
-
expect(cloned.root?.right?.value).toBe(
|
|
1157
|
+
expect(cloned.root?.right?.value).toBe(undefined);
|
|
1136
1158
|
});
|
|
1137
1159
|
|
|
1138
1160
|
it('should keys', () => {
|
|
@@ -1207,6 +1229,303 @@ describe('BST iterative methods test', () => {
|
|
|
1207
1229
|
);
|
|
1208
1230
|
|
|
1209
1231
|
expect(balanced.leaves()).toEqual([1, 6, 4, 9]);
|
|
1210
|
-
expect(balanced.leaves(node => node
|
|
1232
|
+
expect(balanced.leaves(node => balanced.get(node))).toEqual(['a', 'f', 'd', 'i']);
|
|
1233
|
+
});
|
|
1234
|
+
});
|
|
1235
|
+
|
|
1236
|
+
describe('BST operations not map mode test', () => {
|
|
1237
|
+
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
1238
|
+
const bst = new BST<number, number>([], { isMapMode: false });
|
|
1239
|
+
expect(bst).toBeInstanceOf(BST);
|
|
1240
|
+
bst.add([11, 11]);
|
|
1241
|
+
bst.add([3, 3]);
|
|
1242
|
+
const idsAndValues: [number, number][] = [
|
|
1243
|
+
[15, 15],
|
|
1244
|
+
[1, 1],
|
|
1245
|
+
[8, 8],
|
|
1246
|
+
[13, 13],
|
|
1247
|
+
[16, 16],
|
|
1248
|
+
[2, 2],
|
|
1249
|
+
[6, 6],
|
|
1250
|
+
[9, 9],
|
|
1251
|
+
[12, 12],
|
|
1252
|
+
[14, 14],
|
|
1253
|
+
[4, 4],
|
|
1254
|
+
[7, 7],
|
|
1255
|
+
[10, 10],
|
|
1256
|
+
[5, 5]
|
|
1257
|
+
];
|
|
1258
|
+
bst.addMany(idsAndValues, undefined, false);
|
|
1259
|
+
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
1260
|
+
|
|
1261
|
+
if (bst.root) expect(bst.root.key).toBe(11);
|
|
1262
|
+
|
|
1263
|
+
expect(bst.size).toBe(16);
|
|
1264
|
+
|
|
1265
|
+
expect(bst.has(6)).toBe(true);
|
|
1266
|
+
|
|
1267
|
+
const node6 = bst.getNode(6);
|
|
1268
|
+
expect(node6 && bst.getHeight(6)).toBe(2);
|
|
1269
|
+
expect(node6 && bst.getDepth(6)).toBe(3);
|
|
1270
|
+
|
|
1271
|
+
const nodeId10 = bst.getNode(10);
|
|
1272
|
+
expect(nodeId10?.key).toBe(10);
|
|
1273
|
+
|
|
1274
|
+
const nodeVal9 = bst.getNode(node => node.key === 9);
|
|
1275
|
+
expect(nodeVal9?.key).toBe(9);
|
|
1276
|
+
|
|
1277
|
+
const leftMost = bst.getLeftMost();
|
|
1278
|
+
expect(leftMost).toBe(1);
|
|
1279
|
+
|
|
1280
|
+
expect(bst.isBST()).toBe(true);
|
|
1281
|
+
|
|
1282
|
+
const node15 = bst.getNode(15);
|
|
1283
|
+
const minNodeBySpecificNode = node15 && bst.getLeftMost(node => node, node15);
|
|
1284
|
+
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
1285
|
+
|
|
1286
|
+
const nodes = bst.getNodes(node => node.key === 15);
|
|
1287
|
+
expect(nodes.map(node => node.key)).toEqual([15]);
|
|
1288
|
+
});
|
|
1289
|
+
|
|
1290
|
+
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1291
|
+
const objBST = new BST<number, { name: string; age: number }>([], { isMapMode: false });
|
|
1292
|
+
expect(objBST).toBeInstanceOf(BST);
|
|
1293
|
+
objBST.add([11, { name: '11', age: 11 }]);
|
|
1294
|
+
objBST.add([3, { name: '3', age: 3 }]);
|
|
1295
|
+
|
|
1296
|
+
objBST.addMany(
|
|
1297
|
+
[15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
|
|
1298
|
+
[
|
|
1299
|
+
{ name: 'Alice', age: 15 },
|
|
1300
|
+
{ name: 'Bob', age: 1 },
|
|
1301
|
+
{ name: 'Charlie', age: 8 },
|
|
1302
|
+
{ name: 'David', age: 13 },
|
|
1303
|
+
{ name: 'Emma', age: 16 },
|
|
1304
|
+
{ name: 'Frank', age: 2 },
|
|
1305
|
+
{ name: 'Grace', age: 6 },
|
|
1306
|
+
{ name: 'Hannah', age: 9 },
|
|
1307
|
+
{ name: 'Isaac', age: 12 },
|
|
1308
|
+
{ name: 'Jack', age: 14 },
|
|
1309
|
+
{ name: 'Katie', age: 4 },
|
|
1310
|
+
{ name: 'Liam', age: 7 },
|
|
1311
|
+
{ name: 'Mia', age: 10 },
|
|
1312
|
+
{ name: 'Noah', age: 5 }
|
|
1313
|
+
],
|
|
1314
|
+
false
|
|
1315
|
+
);
|
|
1316
|
+
|
|
1317
|
+
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
1318
|
+
|
|
1319
|
+
if (objBST.root) expect(objBST.root.key).toBe(11);
|
|
1320
|
+
|
|
1321
|
+
expect(objBST.has(6)).toBe(true);
|
|
1322
|
+
|
|
1323
|
+
const node6 = objBST.getNode(6);
|
|
1324
|
+
expect(node6 && objBST.getHeight(node6)).toBe(2);
|
|
1325
|
+
expect(node6 && objBST.getDepth(node6)).toBe(3);
|
|
1326
|
+
|
|
1327
|
+
const nodeId10 = objBST.getNode(10);
|
|
1328
|
+
expect(nodeId10?.key).toBe(10);
|
|
1329
|
+
|
|
1330
|
+
const nodeVal9 = objBST.getNode(9);
|
|
1331
|
+
expect(nodeVal9?.key).toBe(9);
|
|
1332
|
+
|
|
1333
|
+
const leftMost = objBST.getLeftMost();
|
|
1334
|
+
expect(leftMost).toBe(1);
|
|
1335
|
+
|
|
1336
|
+
const node15 = objBST.getNode(15);
|
|
1337
|
+
expect(objBST.get(node15)).toEqual({
|
|
1338
|
+
name: 'Alice',
|
|
1339
|
+
age: 15
|
|
1340
|
+
});
|
|
1341
|
+
});
|
|
1342
|
+
|
|
1343
|
+
it('should keyValueNodeEntryRawToNodeAndValue', () => {
|
|
1344
|
+
const bst = new BST<number>([], { isMapMode: false });
|
|
1345
|
+
const node0 = bst.keyValueNodeEntryRawToNodeAndValue(0);
|
|
1346
|
+
expect(node0).toEqual([
|
|
1347
|
+
{
|
|
1348
|
+
_left: undefined,
|
|
1349
|
+
_right: undefined,
|
|
1350
|
+
key: 0,
|
|
1351
|
+
parent: undefined,
|
|
1352
|
+
value: undefined
|
|
1353
|
+
},
|
|
1354
|
+
undefined
|
|
1355
|
+
]);
|
|
1356
|
+
|
|
1357
|
+
const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
|
|
1358
|
+
expect(nodeUndefined).toEqual([undefined, undefined]);
|
|
1359
|
+
|
|
1360
|
+
const nodeNull = bst.keyValueNodeEntryRawToNodeAndValue(null);
|
|
1361
|
+
expect(nodeNull).toEqual([undefined, undefined]);
|
|
1362
|
+
});
|
|
1363
|
+
});
|
|
1364
|
+
|
|
1365
|
+
describe('BST operations not map mode test recursively', () => {
|
|
1366
|
+
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
1367
|
+
const bst = new BST<number>([], {
|
|
1368
|
+
iterationType: 'RECURSIVE',
|
|
1369
|
+
isMapMode: false
|
|
1370
|
+
});
|
|
1371
|
+
expect(bst).toBeInstanceOf(BST);
|
|
1372
|
+
bst.add([11, 11]);
|
|
1373
|
+
bst.add([3, 3]);
|
|
1374
|
+
const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
1375
|
+
bst.addMany(idsAndValues, undefined, false);
|
|
1376
|
+
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
1377
|
+
|
|
1378
|
+
if (bst.root) expect(bst.root.key).toBe(11);
|
|
1379
|
+
|
|
1380
|
+
expect(bst.size).toBe(16);
|
|
1381
|
+
|
|
1382
|
+
expect(bst.has(6)).toBe(true);
|
|
1383
|
+
|
|
1384
|
+
const node6 = bst.getNode(6);
|
|
1385
|
+
expect(node6 && bst.getHeight(6)).toBe(2);
|
|
1386
|
+
expect(node6 && bst.getDepth(6)).toBe(3);
|
|
1387
|
+
|
|
1388
|
+
const nodeId10 = bst.getNode(10);
|
|
1389
|
+
expect(bst.get(10)).toBe(undefined);
|
|
1390
|
+
expect(nodeId10?.key).toBe(10);
|
|
1391
|
+
|
|
1392
|
+
const nodeVal9 = bst.getNode(node => node.key === 9);
|
|
1393
|
+
expect(bst.get(nodeVal9?.key)).toBe(undefined);
|
|
1394
|
+
});
|
|
1395
|
+
|
|
1396
|
+
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1397
|
+
const objBST = new BST<number, { key: number; keyA: number }>([], { isMapMode: false });
|
|
1398
|
+
expect(objBST).toBeInstanceOf(BST);
|
|
1399
|
+
objBST.add([11, { key: 11, keyA: 11 }]);
|
|
1400
|
+
objBST.add([3, { key: 3, keyA: 3 }]);
|
|
1401
|
+
const entries: [number, { key: number; keyA: number }][] = [
|
|
1402
|
+
[15, { key: 15, keyA: 15 }],
|
|
1403
|
+
[1, { key: 1, keyA: 1 }],
|
|
1404
|
+
[8, { key: 8, keyA: 8 }],
|
|
1405
|
+
[13, { key: 13, keyA: 13 }],
|
|
1406
|
+
[16, { key: 16, keyA: 16 }],
|
|
1407
|
+
[2, { key: 2, keyA: 2 }],
|
|
1408
|
+
[6, { key: 6, keyA: 6 }],
|
|
1409
|
+
[9, { key: 9, keyA: 9 }],
|
|
1410
|
+
[12, { key: 12, keyA: 12 }],
|
|
1411
|
+
[14, { key: 14, keyA: 14 }],
|
|
1412
|
+
[4, { key: 4, keyA: 4 }],
|
|
1413
|
+
[7, { key: 7, keyA: 7 }],
|
|
1414
|
+
[10, { key: 10, keyA: 10 }],
|
|
1415
|
+
[5, { key: 5, keyA: 5 }]
|
|
1416
|
+
];
|
|
1417
|
+
|
|
1418
|
+
objBST.addMany(entries, undefined, false);
|
|
1419
|
+
|
|
1420
|
+
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
1421
|
+
|
|
1422
|
+
if (objBST.root) expect(objBST.root.key).toBe(11);
|
|
1423
|
+
|
|
1424
|
+
expect(objBST.has(6)).toBe(true);
|
|
1425
|
+
|
|
1426
|
+
const node6 = objBST.getNode(6);
|
|
1427
|
+
expect(objBST.get(6)).toEqual({
|
|
1428
|
+
key: 6,
|
|
1429
|
+
keyA: 6
|
|
1430
|
+
});
|
|
1431
|
+
expect(node6 && objBST.getHeight(node6)).toBe(2);
|
|
1432
|
+
expect(node6 && objBST.getDepth(node6)).toBe(3);
|
|
1433
|
+
|
|
1434
|
+
const nodeId10 = objBST.getNode(10);
|
|
1435
|
+
expect(nodeId10?.key).toBe(10);
|
|
1436
|
+
|
|
1437
|
+
const nodeVal9 = objBST.getNode(9);
|
|
1438
|
+
expect(nodeVal9?.key).toBe(9);
|
|
1439
|
+
|
|
1440
|
+
const leftMost = objBST.getLeftMost();
|
|
1441
|
+
expect(leftMost).toBe(1);
|
|
1442
|
+
|
|
1443
|
+
const node15 = objBST.getNode(15);
|
|
1444
|
+
expect(objBST.get(node15)).toEqual({
|
|
1445
|
+
key: 15,
|
|
1446
|
+
keyA: 15
|
|
1447
|
+
});
|
|
1448
|
+
});
|
|
1449
|
+
});
|
|
1450
|
+
|
|
1451
|
+
describe('BST iterative methods not map mode test', () => {
|
|
1452
|
+
let bst: BST<number, string>;
|
|
1453
|
+
beforeEach(() => {
|
|
1454
|
+
bst = new BST();
|
|
1455
|
+
bst.addMany(
|
|
1456
|
+
[
|
|
1457
|
+
[1, 'a'],
|
|
1458
|
+
[2, 'b'],
|
|
1459
|
+
[3, 'c']
|
|
1460
|
+
],
|
|
1461
|
+
[],
|
|
1462
|
+
false
|
|
1463
|
+
);
|
|
1464
|
+
});
|
|
1465
|
+
|
|
1466
|
+
it('should clone work well', () => {
|
|
1467
|
+
const cloned = bst.clone();
|
|
1468
|
+
expect(cloned.root?.left).toBe(undefined);
|
|
1469
|
+
expect(cloned.get(cloned.root?.right)).toBe('b');
|
|
1470
|
+
});
|
|
1471
|
+
|
|
1472
|
+
it('should collapsed, unbalanced, balanced bst leaves', () => {
|
|
1473
|
+
const collapsedToLinkedList = new BST();
|
|
1474
|
+
collapsedToLinkedList.addMany(
|
|
1475
|
+
[
|
|
1476
|
+
[1, 'a'],
|
|
1477
|
+
[2, 'b'],
|
|
1478
|
+
[3, 'c'],
|
|
1479
|
+
[4, 'd'],
|
|
1480
|
+
[5, 'e'],
|
|
1481
|
+
[6, 'f'],
|
|
1482
|
+
[7, 'g'],
|
|
1483
|
+
[8, 'h'],
|
|
1484
|
+
[9, 'i']
|
|
1485
|
+
],
|
|
1486
|
+
[],
|
|
1487
|
+
false
|
|
1488
|
+
);
|
|
1489
|
+
|
|
1490
|
+
expect(collapsedToLinkedList.leaves()).toEqual([9]);
|
|
1491
|
+
|
|
1492
|
+
const unbalanced = new BST();
|
|
1493
|
+
unbalanced.addMany(
|
|
1494
|
+
[
|
|
1495
|
+
[2, 'b'],
|
|
1496
|
+
[1, 'a'],
|
|
1497
|
+
[3, 'c'],
|
|
1498
|
+
[4, 'd'],
|
|
1499
|
+
[5, 'e'],
|
|
1500
|
+
[6, 'f'],
|
|
1501
|
+
[7, 'g'],
|
|
1502
|
+
[8, 'h'],
|
|
1503
|
+
[9, 'i']
|
|
1504
|
+
],
|
|
1505
|
+
[],
|
|
1506
|
+
false
|
|
1507
|
+
);
|
|
1508
|
+
|
|
1509
|
+
expect(unbalanced.leaves()).toEqual([1, 9]);
|
|
1510
|
+
|
|
1511
|
+
const balanced = new BST();
|
|
1512
|
+
balanced.addMany(
|
|
1513
|
+
[
|
|
1514
|
+
[2, 'b'],
|
|
1515
|
+
[1, 'a'],
|
|
1516
|
+
[3, 'c'],
|
|
1517
|
+
[4, 'd'],
|
|
1518
|
+
[5, 'e'],
|
|
1519
|
+
[6, 'f'],
|
|
1520
|
+
[7, 'g'],
|
|
1521
|
+
[8, 'h'],
|
|
1522
|
+
[9, 'i']
|
|
1523
|
+
],
|
|
1524
|
+
[],
|
|
1525
|
+
true
|
|
1526
|
+
);
|
|
1527
|
+
|
|
1528
|
+
expect(balanced.leaves()).toEqual([1, 6, 4, 9]);
|
|
1529
|
+
expect(balanced.leaves(node => balanced.get(node?.key))).toEqual(['a', 'f', 'd', 'i']);
|
|
1211
1530
|
});
|
|
1212
1531
|
});
|
|
@@ -182,6 +182,25 @@ describe('RedBlackTree 1', () => {
|
|
|
182
182
|
expect(rbTree.size).toBe(4);
|
|
183
183
|
expect(cloned.size).toBe(3);
|
|
184
184
|
});
|
|
185
|
+
|
|
186
|
+
it('should replace value', () => {
|
|
187
|
+
const tree = new RedBlackTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
188
|
+
expect(tree.get(1)).toBe('1');
|
|
189
|
+
expect(tree.getNode(1)?.value).toBe('1');
|
|
190
|
+
tree.add(1, 'a');
|
|
191
|
+
expect(tree.get(1)).toBe('a');
|
|
192
|
+
tree.add([1, 'b']);
|
|
193
|
+
expect(tree.getNode(1)?.value).toBe('b');
|
|
194
|
+
expect(tree.get(1)).toBe('b');
|
|
195
|
+
const treeMap = new RedBlackTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
196
|
+
expect(treeMap.get(1)).toBe('1');
|
|
197
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
198
|
+
treeMap.add(1, 'a');
|
|
199
|
+
expect(treeMap.get(1)).toBe('a');
|
|
200
|
+
treeMap.add([1, 'b']);
|
|
201
|
+
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
202
|
+
expect(treeMap.get(1)).toBe('b');
|
|
203
|
+
});
|
|
185
204
|
});
|
|
186
205
|
|
|
187
206
|
describe('RedBlackTree 2', () => {
|
|
@@ -133,7 +133,7 @@ describe('TreeMultiMap operations test1', () => {
|
|
|
133
133
|
const nodeId10 = tmm.getNode(10);
|
|
134
134
|
expect(nodeId10?.key).toBe(10);
|
|
135
135
|
|
|
136
|
-
const nodeVal9 = tmm.getNode(node => node.
|
|
136
|
+
const nodeVal9 = tmm.getNode(node => node.key === 9);
|
|
137
137
|
expect(nodeVal9?.key).toBe(9);
|
|
138
138
|
|
|
139
139
|
const nodesByCount1 = tmm.getNodes(node => node.count === 1);
|
|
@@ -391,7 +391,7 @@ describe('TreeMultiMap operations test recursively1', () => {
|
|
|
391
391
|
const nodeId10 = tmm.getNode(10);
|
|
392
392
|
expect(nodeId10?.key).toBe(10);
|
|
393
393
|
|
|
394
|
-
const nodeVal9 = tmm.getNode(node => node.
|
|
394
|
+
const nodeVal9 = tmm.getNode(node => node.key === 9);
|
|
395
395
|
expect(nodeVal9?.key).toBe(9);
|
|
396
396
|
|
|
397
397
|
const nodesByCount1 = tmm.getNodes(node => node.count === 1);
|
|
@@ -817,7 +817,8 @@ describe('TreeMultiMap iterative methods test', () => {
|
|
|
817
817
|
expect(treeMM.getComputedCount()).toBe(21);
|
|
818
818
|
const cloned = treeMM.clone();
|
|
819
819
|
expect(cloned.root?.left?.key).toBe(1);
|
|
820
|
-
expect(cloned.root?.right
|
|
820
|
+
if (cloned.isMapMode) expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
821
|
+
else expect(cloned.root?.right?.value).toBe(undefined);
|
|
821
822
|
});
|
|
822
823
|
|
|
823
824
|
it('should keys', () => {
|
|
@@ -835,3 +836,140 @@ describe('TreeMultiMap iterative methods test', () => {
|
|
|
835
836
|
expect(leaves).toEqual([1, 3]);
|
|
836
837
|
});
|
|
837
838
|
});
|
|
839
|
+
|
|
840
|
+
describe('TreeMultiMap count not map mode', () => {
|
|
841
|
+
let tmm: TreeMultiMap<number>;
|
|
842
|
+
beforeEach(() => {
|
|
843
|
+
tmm = new TreeMultiMap<number>([], { isMapMode: false });
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
it('Should added node count ', () => {
|
|
847
|
+
tmm.addMany([
|
|
848
|
+
[1, 1],
|
|
849
|
+
[2, 2],
|
|
850
|
+
[3, 3],
|
|
851
|
+
[4, 4],
|
|
852
|
+
[5, 5]
|
|
853
|
+
]);
|
|
854
|
+
const newNode = new TreeMultiMapNode(3, undefined, 10);
|
|
855
|
+
tmm.add(newNode, 33, 20);
|
|
856
|
+
// TODO expect(tmm.count).toBe(25);
|
|
857
|
+
expect(tmm.count).toBe(15);
|
|
858
|
+
expect(tmm.getComputedCount()).toBe(15);
|
|
859
|
+
expect(tmm.getNode(3)?.count).toBe(11);
|
|
860
|
+
});
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
describe('TreeMultiMap operations test1 not map mode', () => {
|
|
864
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
865
|
+
const tmm = new TreeMultiMap<number, number>([], { isMapMode: false });
|
|
866
|
+
|
|
867
|
+
expect(tmm instanceof TreeMultiMap);
|
|
868
|
+
|
|
869
|
+
tmm.add([11, 11]);
|
|
870
|
+
tmm.add([3, 3]);
|
|
871
|
+
const idAndValues: [number, number][] = [
|
|
872
|
+
[11, 11],
|
|
873
|
+
[3, 3],
|
|
874
|
+
[15, 15],
|
|
875
|
+
[1, 1],
|
|
876
|
+
[8, 8],
|
|
877
|
+
[13, 13],
|
|
878
|
+
[16, 16],
|
|
879
|
+
[2, 2],
|
|
880
|
+
[6, 6],
|
|
881
|
+
[9, 9],
|
|
882
|
+
[12, 12],
|
|
883
|
+
[14, 14],
|
|
884
|
+
[4, 4],
|
|
885
|
+
[7, 7],
|
|
886
|
+
[10, 10],
|
|
887
|
+
[5, 5]
|
|
888
|
+
];
|
|
889
|
+
tmm.addMany(idAndValues);
|
|
890
|
+
expect(tmm.root instanceof TreeMultiMapNode);
|
|
891
|
+
|
|
892
|
+
if (tmm.root) expect(tmm.root.key == 11);
|
|
893
|
+
|
|
894
|
+
expect(tmm.size).toBe(16);
|
|
895
|
+
expect(tmm.count).toBe(18);
|
|
896
|
+
expect(tmm.getComputedCount()).toBe(18);
|
|
897
|
+
|
|
898
|
+
expect(tmm.has(6));
|
|
899
|
+
if (isDebug) tmm.print();
|
|
900
|
+
expect(tmm.getHeight(6)).toBe(1);
|
|
901
|
+
expect(tmm.getDepth(6)).toBe(3);
|
|
902
|
+
const nodeId10 = tmm.getNode(10);
|
|
903
|
+
expect(nodeId10?.key).toBe(10);
|
|
904
|
+
|
|
905
|
+
const nodeVal9 = tmm.getNode(node => node.key === 9);
|
|
906
|
+
expect(nodeVal9?.key).toBe(9);
|
|
907
|
+
});
|
|
908
|
+
});
|
|
909
|
+
|
|
910
|
+
describe('TreeMultiMap operations test recursively1 not map mode', () => {
|
|
911
|
+
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
912
|
+
const tmm = new TreeMultiMap<number>([], {
|
|
913
|
+
iterationType: 'RECURSIVE',
|
|
914
|
+
isMapMode: false
|
|
915
|
+
});
|
|
916
|
+
|
|
917
|
+
expect(tmm instanceof TreeMultiMap);
|
|
918
|
+
tmm.add([11, 11]);
|
|
919
|
+
tmm.add([3, 3]);
|
|
920
|
+
const idAndValues: [number, number][] = [
|
|
921
|
+
[11, 11],
|
|
922
|
+
[3, 3],
|
|
923
|
+
[15, 15],
|
|
924
|
+
[1, 1],
|
|
925
|
+
[8, 8],
|
|
926
|
+
[13, 13],
|
|
927
|
+
[16, 16],
|
|
928
|
+
[2, 2],
|
|
929
|
+
[6, 6],
|
|
930
|
+
[9, 9],
|
|
931
|
+
[12, 12],
|
|
932
|
+
[14, 14],
|
|
933
|
+
[4, 4],
|
|
934
|
+
[7, 7],
|
|
935
|
+
[10, 10],
|
|
936
|
+
[5, 5]
|
|
937
|
+
];
|
|
938
|
+
tmm.addMany(idAndValues);
|
|
939
|
+
expect(tmm.root).toBeInstanceOf(TreeMultiMapNode);
|
|
940
|
+
|
|
941
|
+
if (tmm.root) expect(tmm.root.key).toBe(5);
|
|
942
|
+
|
|
943
|
+
expect(tmm.size).toBe(16);
|
|
944
|
+
expect(tmm.count).toBe(18);
|
|
945
|
+
expect(tmm.getComputedCount()).toBe(18);
|
|
946
|
+
|
|
947
|
+
expect(tmm.has(6));
|
|
948
|
+
|
|
949
|
+
expect(tmm.getHeight(6)).toBe(1);
|
|
950
|
+
expect(tmm.getDepth(6)).toBe(3);
|
|
951
|
+
const nodeId10 = tmm.getNode(10);
|
|
952
|
+
expect(nodeId10?.key).toBe(10);
|
|
953
|
+
|
|
954
|
+
const nodeVal9 = tmm.getNode(node => node.key === 9);
|
|
955
|
+
expect(nodeVal9?.key).toBe(9);
|
|
956
|
+
});
|
|
957
|
+
});
|
|
958
|
+
|
|
959
|
+
describe('TreeMultiMap iterative methods test not map mode', () => {
|
|
960
|
+
let treeMM: TreeMultiMap<number, string>;
|
|
961
|
+
beforeEach(() => {
|
|
962
|
+
treeMM = new TreeMultiMap<number, string>([], { isMapMode: false });
|
|
963
|
+
treeMM.add(1, 'a', 10);
|
|
964
|
+
treeMM.add([2, 'b'], undefined, 10);
|
|
965
|
+
treeMM.add([3, 'c'], undefined, 1);
|
|
966
|
+
});
|
|
967
|
+
|
|
968
|
+
it('should clone work well', () => {
|
|
969
|
+
expect(treeMM.count).toBe(21);
|
|
970
|
+
expect(treeMM.getComputedCount()).toBe(21);
|
|
971
|
+
const cloned = treeMM.clone();
|
|
972
|
+
expect(cloned.root?.left?.key).toBe(1);
|
|
973
|
+
expect(cloned.get(cloned.root?.right)).toBe(undefined);
|
|
974
|
+
});
|
|
975
|
+
});
|
package/test/utils/array.ts
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { getRandomInt } from './number';
|
|
2
2
|
|
|
3
|
-
export function getRandomIntArray(length: number = 1000, min: number = -1000, max: number = 1000,
|
|
4
|
-
if (
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
while (ans.length < length) {
|
|
8
|
-
const num = getRandomInt(min, max);
|
|
9
|
-
if (!set.has(num)) {
|
|
10
|
-
ans.push(num);
|
|
11
|
-
set.add(num);
|
|
12
|
-
}
|
|
3
|
+
export function getRandomIntArray(length: number = 1000, min: number = -1000, max: number = 1000, unique = true) {
|
|
4
|
+
if (unique) {
|
|
5
|
+
if (max - min + 1 < length) {
|
|
6
|
+
throw new Error("Range too small for unique values with the specified length");
|
|
13
7
|
}
|
|
14
|
-
|
|
8
|
+
|
|
9
|
+
const allNumbers = Array.from({ length: max - min + 1 }, (_, i) => i + min);
|
|
10
|
+
|
|
11
|
+
for (let i = allNumbers.length - 1; i > 0; i--) {
|
|
12
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
13
|
+
[allNumbers[i], allNumbers[j]] = [allNumbers[j], allNumbers[i]];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return allNumbers.slice(0, length);
|
|
17
|
+
} else {
|
|
18
|
+
return Array.from({ length }, () => Math.floor(Math.random() * (max - min + 1)) + min);
|
|
15
19
|
}
|
|
16
|
-
return new Array<number>(length).fill(0).map(() => getRandomInt(min, max));
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
const words = [
|