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.
Files changed (65) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +1 -37
  4. package/benchmark/report.json +24 -384
  5. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -47
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.js +29 -27
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.js +376 -265
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/bst.d.ts +56 -56
  15. package/dist/cjs/data-structures/binary-tree/bst.js +108 -78
  16. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -36
  19. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
  21. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +59 -49
  22. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  23. package/dist/cjs/data-structures/trie/trie.js +3 -3
  24. package/dist/cjs/interfaces/binary-tree.d.ts +5 -5
  25. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
  26. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -3
  27. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +21 -21
  28. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +64 -46
  29. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +20 -20
  30. package/dist/mjs/data-structures/binary-tree/avl-tree.js +29 -26
  31. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +186 -144
  32. package/dist/mjs/data-structures/binary-tree/binary-tree.js +376 -264
  33. package/dist/mjs/data-structures/binary-tree/bst.d.ts +56 -56
  34. package/dist/mjs/data-structures/binary-tree/bst.js +108 -76
  35. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +13 -13
  36. package/dist/mjs/data-structures/binary-tree/rb-tree.js +42 -35
  37. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +21 -21
  38. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +59 -48
  39. package/dist/mjs/data-structures/trie/trie.js +3 -3
  40. package/dist/mjs/interfaces/binary-tree.d.ts +5 -5
  41. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +13 -13
  42. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +3 -3
  43. package/dist/umd/data-structure-typed.js +596 -468
  44. package/dist/umd/data-structure-typed.min.js +5 -5
  45. package/dist/umd/data-structure-typed.min.js.map +1 -1
  46. package/package.json +6 -6
  47. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +60 -54
  48. package/src/data-structures/binary-tree/avl-tree.ts +32 -35
  49. package/src/data-structures/binary-tree/binary-tree.ts +440 -360
  50. package/src/data-structures/binary-tree/bst.ts +144 -113
  51. package/src/data-structures/binary-tree/rb-tree.ts +44 -43
  52. package/src/data-structures/binary-tree/tree-multi-map.ts +57 -61
  53. package/src/data-structures/trie/trie.ts +3 -3
  54. package/src/interfaces/binary-tree.ts +6 -6
  55. package/src/types/data-structures/binary-tree/binary-tree.ts +13 -14
  56. package/src/types/data-structures/binary-tree/bst.ts +3 -3
  57. package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +2 -2
  58. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +9 -1
  59. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +115 -3
  60. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +109 -4
  61. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +183 -46
  62. package/test/unit/data-structures/binary-tree/bst.test.ts +340 -21
  63. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +19 -0
  64. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +141 -3
  65. package/test/utils/array.ts +15 -12
@@ -1,5 +1,5 @@
1
1
  import { BinaryTreeNode, BST, BSTNode } from '../../../../src';
2
- import { isDebugTest, SYSTEM_MAX_CALL_STACK, isTestStackOverflow } from '../../../config';
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.value === 9);
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.value === 15);
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?.value).toEqual({
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 keyValueOrEntryOrRawElementToNode', () => {
453
+ it('should keyValueNodeEntryRawToNodeAndValue', () => {
454
454
  const bst = new BST<number>();
455
- const node0 = bst.keyValueOrEntryOrRawElementToNode(0);
456
- expect(node0).toEqual({
457
- _left: undefined,
458
- _right: undefined,
459
- key: 0,
460
- parent: undefined,
461
- value: undefined
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.keyValueOrEntryOrRawElementToNode(undefined);
465
- expect(nodeUndefined).toBe(undefined);
467
+ const nodeUndefined = bst.keyValueNodeEntryRawToNodeAndValue(undefined);
468
+ expect(nodeUndefined).toEqual([undefined, undefined]);
466
469
 
467
- const nodeNull = bst.keyValueOrEntryOrRawElementToNode(null);
468
- expect(nodeNull).toBe(undefined);
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?.value).toEqual({
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('b');
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?.value)).toEqual(['a', 'f', 'd', 'i']);
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.value === 9);
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.value === 9);
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?.value).toBe('c');
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
+ });
@@ -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, isDistinct = true) {
4
- if (isDistinct) {
5
- const set = new Set<number>();
6
- const ans: number[] = [];
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
- return ans;
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 = [