data-structure-typed 1.38.9 → 1.39.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 (153) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +9 -9
  3. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  4. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  5. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +8 -0
  6. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +17 -0
  7. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
  9. package/dist/cjs/data-structures/binary-tree/binary-tree.js +8 -8
  10. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
  12. package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
  13. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  16. package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
  17. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +4 -4
  18. package/dist/cjs/data-structures/graph/abstract-graph.js +5 -5
  19. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  20. package/dist/cjs/data-structures/graph/directed-graph.d.ts +4 -4
  21. package/dist/cjs/data-structures/graph/directed-graph.js +6 -6
  22. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  23. package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
  24. package/dist/cjs/data-structures/graph/map-graph.js +1 -1
  25. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  26. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +3 -3
  27. package/dist/cjs/data-structures/graph/undirected-graph.js +4 -4
  28. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  29. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  30. package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
  31. package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
  32. package/dist/cjs/data-structures/heap/heap.d.ts +10 -5
  33. package/dist/cjs/data-structures/heap/heap.js +10 -10
  34. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  35. package/dist/cjs/data-structures/heap/max-heap.d.ts +4 -1
  36. package/dist/cjs/data-structures/heap/max-heap.js +9 -7
  37. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/min-heap.d.ts +4 -1
  39. package/dist/cjs/data-structures/heap/min-heap.js +9 -7
  40. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  41. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  42. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  43. package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
  44. package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
  45. package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
  46. package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
  47. package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
  48. package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
  49. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +4 -1
  50. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +9 -7
  51. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  52. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +4 -1
  53. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +9 -7
  54. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  55. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +5 -2
  56. package/dist/cjs/data-structures/priority-queue/priority-queue.js +2 -2
  57. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  58. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  59. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  60. package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
  61. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  62. package/dist/cjs/types/helpers.d.ts +1 -4
  63. package/dist/cjs/types/helpers.js.map +1 -1
  64. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  65. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.d.ts +8 -0
  66. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +17 -0
  67. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
  68. package/dist/mjs/data-structures/binary-tree/binary-tree.js +8 -8
  69. package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
  70. package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
  71. package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  72. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +4 -4
  73. package/dist/mjs/data-structures/graph/abstract-graph.js +5 -5
  74. package/dist/mjs/data-structures/graph/directed-graph.d.ts +4 -4
  75. package/dist/mjs/data-structures/graph/directed-graph.js +6 -6
  76. package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
  77. package/dist/mjs/data-structures/graph/map-graph.js +1 -1
  78. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +3 -3
  79. package/dist/mjs/data-structures/graph/undirected-graph.js +4 -4
  80. package/dist/mjs/data-structures/heap/heap.d.ts +10 -5
  81. package/dist/mjs/data-structures/heap/heap.js +10 -10
  82. package/dist/mjs/data-structures/heap/max-heap.d.ts +4 -1
  83. package/dist/mjs/data-structures/heap/max-heap.js +9 -7
  84. package/dist/mjs/data-structures/heap/min-heap.d.ts +4 -1
  85. package/dist/mjs/data-structures/heap/min-heap.js +9 -7
  86. package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
  87. package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
  88. package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
  89. package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
  90. package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +4 -1
  91. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +9 -7
  92. package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +4 -1
  93. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +9 -7
  94. package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +5 -2
  95. package/dist/mjs/data-structures/priority-queue/priority-queue.js +2 -2
  96. package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
  97. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  98. package/dist/mjs/types/helpers.d.ts +1 -4
  99. package/dist/umd/data-structure-typed.min.js +1 -1
  100. package/dist/umd/data-structure-typed.min.js.map +1 -1
  101. package/package.json +5 -5
  102. package/src/data-structures/binary-tree/avl-tree.ts +5 -4
  103. package/src/data-structures/binary-tree/binary-indexed-tree.ts +21 -1
  104. package/src/data-structures/binary-tree/binary-tree.ts +37 -93
  105. package/src/data-structures/binary-tree/bst.ts +11 -17
  106. package/src/data-structures/binary-tree/rb-tree.ts +2 -1
  107. package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
  108. package/src/data-structures/graph/abstract-graph.ts +16 -15
  109. package/src/data-structures/graph/directed-graph.ts +8 -7
  110. package/src/data-structures/graph/map-graph.ts +2 -2
  111. package/src/data-structures/graph/undirected-graph.ts +9 -8
  112. package/src/data-structures/hash/hash-map.ts +1 -1
  113. package/src/data-structures/hash/tree-map.ts +1 -2
  114. package/src/data-structures/hash/tree-set.ts +1 -2
  115. package/src/data-structures/heap/heap.ts +12 -12
  116. package/src/data-structures/heap/max-heap.ts +8 -6
  117. package/src/data-structures/heap/min-heap.ts +8 -6
  118. package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
  119. package/src/data-structures/matrix/matrix.ts +1 -1
  120. package/src/data-structures/matrix/matrix2d.ts +1 -3
  121. package/src/data-structures/matrix/vector2d.ts +1 -4
  122. package/src/data-structures/priority-queue/max-priority-queue.ts +8 -6
  123. package/src/data-structures/priority-queue/min-priority-queue.ts +8 -6
  124. package/src/data-structures/priority-queue/priority-queue.ts +3 -3
  125. package/src/data-structures/queue/deque.ts +4 -5
  126. package/src/data-structures/queue/queue.ts +1 -1
  127. package/src/interfaces/binary-tree.ts +2 -2
  128. package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
  129. package/src/types/data-structures/matrix/navigator.ts +1 -1
  130. package/src/types/helpers.ts +1 -7
  131. package/src/types/utils/utils.ts +1 -1
  132. package/src/types/utils/validate-type.ts +2 -2
  133. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +141 -1
  134. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +35 -0
  135. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +269 -47
  136. package/test/unit/data-structures/binary-tree/bst.test.ts +391 -1
  137. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
  138. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +241 -186
  139. package/test/unit/data-structures/graph/directed-graph.test.ts +37 -7
  140. package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
  141. package/test/unit/data-structures/graph/overall.test.ts +2 -2
  142. package/test/unit/data-structures/graph/undirected-graph.test.ts +84 -2
  143. package/test/unit/data-structures/heap/heap.test.ts +2 -2
  144. package/test/unit/data-structures/heap/max-heap.test.ts +1 -1
  145. package/test/unit/data-structures/heap/min-heap.test.ts +1 -1
  146. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +1 -1
  147. package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
  148. package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
  149. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  150. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +3 -3
  151. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +10 -10
  152. package/test/unit/data-structures/queue/deque.test.ts +264 -1
  153. package/test/unit/data-structures/queue/queue.test.ts +3 -1
@@ -1,4 +1,4 @@
1
- import {BST, BSTNode, CP} from '../../../../src';
1
+ import {BST, BSTNode, CP, IterationType} from '../../../../src';
2
2
  import {isDebugTest} from '../../../config';
3
3
 
4
4
  const isDebug = isDebugTest;
@@ -393,6 +393,396 @@ describe('BST operations test', () => {
393
393
  });
394
394
  });
395
395
 
396
+ describe('BST operations test recursively', () => {
397
+ it('should perform various operations on a Binary Search Tree with numeric values', () => {
398
+ const bst = new BST({iterationType: IterationType.RECURSIVE});
399
+ expect(bst).toBeInstanceOf(BST);
400
+ bst.add(11, 11);
401
+ bst.add(3, 3);
402
+ const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
403
+ bst.addMany(idsAndValues, idsAndValues, false);
404
+ expect(bst.root).toBeInstanceOf(BSTNode);
405
+
406
+ if (bst.root) expect(bst.root.key).toBe(11);
407
+
408
+ expect(bst.size).toBe(16);
409
+
410
+ expect(bst.has(6)).toBe(true);
411
+
412
+ const node6 = bst.get(6);
413
+ expect(node6 && bst.getHeight(6)).toBe(2);
414
+ expect(node6 && bst.getDepth(6)).toBe(3);
415
+
416
+ const nodeId10 = bst.get(10);
417
+ expect(nodeId10?.key).toBe(10);
418
+
419
+ const nodeVal9 = bst.get(9, node => node.val);
420
+ expect(nodeVal9?.key).toBe(9);
421
+
422
+ const leftMost = bst.getLeftMost();
423
+ expect(leftMost?.key).toBe(1);
424
+
425
+ const node15 = bst.get(15);
426
+ const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
427
+ expect(minNodeBySpecificNode?.key).toBe(12);
428
+
429
+ let subTreeSum = 0;
430
+ node15 && bst.subTreeTraverse(node => (subTreeSum += node.key), 15);
431
+ expect(subTreeSum).toBe(70);
432
+
433
+ let lesserSum = 0;
434
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
435
+ expect(lesserSum).toBe(45);
436
+
437
+ expect(node15).toBeInstanceOf(BSTNode);
438
+
439
+ const node11 = bst.get(11);
440
+ expect(node11).toBeInstanceOf(BSTNode);
441
+
442
+ const dfsInorderNodes = bst.dfs(node => node, 'in');
443
+ expect(dfsInorderNodes[0].key).toBe(1);
444
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
445
+
446
+ bst.perfectlyBalance();
447
+ expect(bst.isPerfectlyBalanced()).toBe(true);
448
+
449
+ const bfsNodesAfterBalanced: BSTNode<number>[] = [];
450
+ bst.bfs(node => bfsNodesAfterBalanced.push(node));
451
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
452
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
453
+
454
+ const removed11 = bst.delete(11);
455
+ expect(removed11).toBeInstanceOf(Array);
456
+ expect(removed11[0]).toBeDefined();
457
+ expect(removed11[0].deleted).toBeDefined();
458
+
459
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
460
+
461
+ expect(bst.isAVLBalanced()).toBe(true);
462
+
463
+ expect(bst.getHeight(15)).toBe(1);
464
+
465
+ const removed1 = bst.delete(1);
466
+ expect(removed1).toBeInstanceOf(Array);
467
+ expect(removed1[0]).toBeDefined();
468
+ expect(removed1[0].deleted).toBeDefined();
469
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
470
+
471
+ expect(bst.isAVLBalanced()).toBe(true);
472
+
473
+ expect(bst.getHeight()).toBe(4);
474
+
475
+ const removed4 = bst.delete(4);
476
+ expect(removed4).toBeInstanceOf(Array);
477
+ expect(removed4[0]).toBeDefined();
478
+ expect(removed4[0].deleted).toBeDefined();
479
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
480
+ expect(bst.isAVLBalanced()).toBe(true);
481
+ expect(bst.getHeight()).toBe(4);
482
+
483
+ const removed10 = bst.delete(10);
484
+ expect(removed10).toBeInstanceOf(Array);
485
+ expect(removed10[0]).toBeDefined();
486
+ expect(removed10[0].deleted).toBeDefined();
487
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
488
+ expect(bst.isAVLBalanced()).toBe(false);
489
+ expect(bst.getHeight()).toBe(4);
490
+
491
+ const removed15 = bst.delete(15);
492
+ expect(removed15).toBeInstanceOf(Array);
493
+ expect(removed15[0]).toBeDefined();
494
+ expect(removed15[0].deleted).toBeDefined();
495
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
496
+
497
+ expect(bst.isAVLBalanced()).toBe(true);
498
+ expect(bst.getHeight()).toBe(3);
499
+
500
+ const removed5 = bst.delete(5);
501
+ expect(removed5).toBeInstanceOf(Array);
502
+ expect(removed5[0]).toBeDefined();
503
+ expect(removed5[0].deleted).toBeDefined();
504
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
505
+
506
+ expect(bst.isAVLBalanced()).toBe(true);
507
+ expect(bst.getHeight()).toBe(3);
508
+
509
+ const removed13 = bst.delete(13);
510
+ expect(removed13).toBeInstanceOf(Array);
511
+ expect(removed13[0]).toBeDefined();
512
+ expect(removed13[0].deleted).toBeDefined();
513
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
514
+ expect(bst.isAVLBalanced()).toBe(true);
515
+ expect(bst.getHeight()).toBe(3);
516
+
517
+ const removed3 = bst.delete(3);
518
+ expect(removed3).toBeInstanceOf(Array);
519
+ expect(removed3[0]).toBeDefined();
520
+ expect(removed3[0].deleted).toBeDefined();
521
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
522
+ expect(bst.isAVLBalanced()).toBe(false);
523
+ expect(bst.getHeight()).toBe(3);
524
+
525
+ const removed8 = bst.delete(8);
526
+ expect(removed8).toBeInstanceOf(Array);
527
+ expect(removed8[0]).toBeDefined();
528
+ expect(removed8[0].deleted).toBeDefined();
529
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
530
+ expect(bst.isAVLBalanced()).toBe(true);
531
+ expect(bst.getHeight()).toBe(3);
532
+
533
+ const removed6 = bst.delete(6);
534
+ expect(removed6).toBeInstanceOf(Array);
535
+ expect(removed6[0]).toBeDefined();
536
+ expect(removed6[0].deleted).toBeDefined();
537
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
538
+ expect(bst.delete(6).length).toBe(0);
539
+ expect(bst.isAVLBalanced()).toBe(false);
540
+ expect(bst.getHeight()).toBe(3);
541
+
542
+ const removed7 = bst.delete(7);
543
+ expect(removed7).toBeInstanceOf(Array);
544
+ expect(removed7[0]).toBeDefined();
545
+ expect(removed7[0].deleted).toBeDefined();
546
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
547
+ expect(bst.isAVLBalanced()).toBe(false);
548
+ expect(bst.getHeight()).toBe(3);
549
+
550
+ const removed9 = bst.delete(9);
551
+ expect(removed9).toBeInstanceOf(Array);
552
+ expect(removed9[0]).toBeDefined();
553
+ expect(removed9[0].deleted).toBeDefined();
554
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
555
+ expect(bst.isAVLBalanced()).toBe(false);
556
+ expect(bst.getHeight()).toBe(3);
557
+
558
+ const removed14 = bst.delete(14);
559
+ expect(removed14).toBeInstanceOf(Array);
560
+ expect(removed14[0]).toBeDefined();
561
+ expect(removed14[0].deleted).toBeDefined();
562
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
563
+ expect(bst.isAVLBalanced()).toBe(false);
564
+ expect(bst.getHeight()).toBe(2);
565
+
566
+ expect(bst.isAVLBalanced()).toBe(false);
567
+
568
+ const bfsIDs: number[] = [];
569
+ bst.bfs(node => bfsIDs.push(node.key));
570
+ expect(bfsIDs[0]).toBe(2);
571
+ expect(bfsIDs[1]).toBe(12);
572
+ expect(bfsIDs[2]).toBe(16);
573
+
574
+ const bfsNodes: BSTNode<number>[] = [];
575
+ bst.bfs(node => bfsNodes.push(node));
576
+ expect(bfsNodes[0].key).toBe(2);
577
+ expect(bfsNodes[1].key).toBe(12);
578
+ expect(bfsNodes[2].key).toBe(16);
579
+ });
580
+
581
+ it('should perform various operations on a Binary Search Tree with object values', () => {
582
+ const objBST = new BST<{key: number; keyA: number}>();
583
+ expect(objBST).toBeInstanceOf(BST);
584
+ objBST.add(11, {key: 11, keyA: 11});
585
+ objBST.add(3, {key: 3, keyA: 3});
586
+ const values = [
587
+ {key: 15, keyA: 15},
588
+ {key: 1, keyA: 1},
589
+ {key: 8, keyA: 8},
590
+ {key: 13, keyA: 13},
591
+ {key: 16, keyA: 16},
592
+ {key: 2, keyA: 2},
593
+ {key: 6, keyA: 6},
594
+ {key: 9, keyA: 9},
595
+ {key: 12, keyA: 12},
596
+ {key: 14, keyA: 14},
597
+ {key: 4, keyA: 4},
598
+ {key: 7, keyA: 7},
599
+ {key: 10, keyA: 10},
600
+ {key: 5, keyA: 5}
601
+ ];
602
+
603
+ objBST.addMany(
604
+ values.map(item => item.key),
605
+ values,
606
+ false
607
+ );
608
+
609
+ expect(objBST.root).toBeInstanceOf(BSTNode);
610
+
611
+ if (objBST.root) expect(objBST.root.key).toBe(11);
612
+
613
+ expect(objBST.has(6)).toBe(true);
614
+
615
+ const node6 = objBST.get(6);
616
+ expect(node6 && objBST.getHeight(node6)).toBe(2);
617
+ expect(node6 && objBST.getDepth(node6)).toBe(3);
618
+
619
+ const nodeId10 = objBST.get(10);
620
+ expect(nodeId10?.key).toBe(10);
621
+
622
+ const nodeVal9 = objBST.get(9);
623
+ expect(nodeVal9?.key).toBe(9);
624
+
625
+ const leftMost = objBST.getLeftMost();
626
+ expect(leftMost?.key).toBe(1);
627
+
628
+ const node15 = objBST.get(15);
629
+ expect(node15?.val).toEqual({key: 15, keyA: 15});
630
+ const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
631
+ expect(minNodeBySpecificNode?.key).toBe(12);
632
+
633
+ let subTreeSum = 0;
634
+ node15 && objBST.subTreeTraverse(node => (subTreeSum += node.key), node15);
635
+ expect(subTreeSum).toBe(70);
636
+
637
+ let lesserSum = 0;
638
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
639
+ expect(lesserSum).toBe(45);
640
+
641
+ expect(node15).toBeInstanceOf(BSTNode);
642
+
643
+ const node11 = objBST.get(11);
644
+ expect(node11).toBeInstanceOf(BSTNode);
645
+
646
+ const dfsInorderNodes = objBST.dfs(node => node, 'in');
647
+ expect(dfsInorderNodes[0].key).toBe(1);
648
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
649
+
650
+ objBST.perfectlyBalance();
651
+ expect(objBST.isPerfectlyBalanced()).toBe(true);
652
+
653
+ const bfsNodesAfterBalanced: BSTNode<{key: number; keyA: number}>[] = [];
654
+ objBST.bfs(node => bfsNodesAfterBalanced.push(node));
655
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
656
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
657
+
658
+ const removed11 = objBST.delete(11);
659
+ expect(removed11).toBeInstanceOf(Array);
660
+ expect(removed11[0]).toBeDefined();
661
+ expect(removed11[0].deleted).toBeDefined();
662
+
663
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
664
+
665
+ expect(objBST.isAVLBalanced()).toBe(true);
666
+
667
+ expect(node15 && objBST.getHeight(node15)).toBe(2);
668
+
669
+ const removed1 = objBST.delete(1);
670
+ expect(removed1).toBeInstanceOf(Array);
671
+ expect(removed1[0]).toBeDefined();
672
+ expect(removed1[0].deleted).toBeDefined();
673
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
674
+
675
+ expect(objBST.isAVLBalanced()).toBe(true);
676
+
677
+ expect(objBST.getHeight()).toBe(4);
678
+
679
+ const removed4 = objBST.delete(4);
680
+ expect(removed4).toBeInstanceOf(Array);
681
+ expect(removed4[0]).toBeDefined();
682
+ expect(removed4[0].deleted).toBeDefined();
683
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
684
+ expect(objBST.isAVLBalanced()).toBe(true);
685
+ expect(objBST.getHeight()).toBe(4);
686
+
687
+ const removed10 = objBST.delete(10);
688
+ expect(removed10).toBeInstanceOf(Array);
689
+ expect(removed10[0]).toBeDefined();
690
+ expect(removed10[0].deleted).toBeDefined();
691
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
692
+ expect(objBST.isAVLBalanced()).toBe(false);
693
+ expect(objBST.getHeight()).toBe(4);
694
+
695
+ const removed15 = objBST.delete(15);
696
+ expect(removed15).toBeInstanceOf(Array);
697
+ expect(removed15[0]).toBeDefined();
698
+ expect(removed15[0].deleted).toBeDefined();
699
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
700
+
701
+ expect(objBST.isAVLBalanced()).toBe(true);
702
+ expect(objBST.getHeight()).toBe(3);
703
+
704
+ const removed5 = objBST.delete(5);
705
+ expect(removed5).toBeInstanceOf(Array);
706
+ expect(removed5[0]).toBeDefined();
707
+ expect(removed5[0].deleted).toBeDefined();
708
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
709
+
710
+ expect(objBST.isAVLBalanced()).toBe(true);
711
+ expect(objBST.getHeight()).toBe(3);
712
+
713
+ const removed13 = objBST.delete(13);
714
+ expect(removed13).toBeInstanceOf(Array);
715
+ expect(removed13[0]).toBeDefined();
716
+ expect(removed13[0].deleted).toBeDefined();
717
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
718
+ expect(objBST.isAVLBalanced()).toBe(true);
719
+ expect(objBST.getHeight()).toBe(3);
720
+
721
+ const removed3 = objBST.delete(3);
722
+ expect(removed3).toBeInstanceOf(Array);
723
+ expect(removed3[0]).toBeDefined();
724
+ expect(removed3[0].deleted).toBeDefined();
725
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
726
+ expect(objBST.isAVLBalanced()).toBe(false);
727
+ expect(objBST.getHeight()).toBe(3);
728
+
729
+ const removed8 = objBST.delete(8);
730
+ expect(removed8).toBeInstanceOf(Array);
731
+ expect(removed8[0]).toBeDefined();
732
+ expect(removed8[0].deleted).toBeDefined();
733
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
734
+ expect(objBST.isAVLBalanced()).toBe(true);
735
+ expect(objBST.getHeight()).toBe(3);
736
+
737
+ const removed6 = objBST.delete(6);
738
+ expect(removed6).toBeInstanceOf(Array);
739
+ expect(removed6[0]).toBeDefined();
740
+ expect(removed6[0].deleted).toBeDefined();
741
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
742
+ expect(objBST.delete(6).length).toBe(0);
743
+ expect(objBST.isAVLBalanced()).toBe(false);
744
+ expect(objBST.getHeight()).toBe(3);
745
+
746
+ const removed7 = objBST.delete(7);
747
+ expect(removed7).toBeInstanceOf(Array);
748
+ expect(removed7[0]).toBeDefined();
749
+ expect(removed7[0].deleted).toBeDefined();
750
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
751
+ expect(objBST.isAVLBalanced()).toBe(false);
752
+ expect(objBST.getHeight()).toBe(3);
753
+
754
+ const removed9 = objBST.delete(9);
755
+ expect(removed9).toBeInstanceOf(Array);
756
+ expect(removed9[0]).toBeDefined();
757
+ expect(removed9[0].deleted).toBeDefined();
758
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
759
+ expect(objBST.isAVLBalanced()).toBe(false);
760
+ expect(objBST.getHeight()).toBe(3);
761
+
762
+ const removed14 = objBST.delete(14);
763
+ expect(removed14).toBeInstanceOf(Array);
764
+ expect(removed14[0]).toBeDefined();
765
+ expect(removed14[0].deleted).toBeDefined();
766
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
767
+ expect(objBST.isAVLBalanced()).toBe(false);
768
+ expect(objBST.getHeight()).toBe(2);
769
+
770
+ expect(objBST.isAVLBalanced()).toBe(false);
771
+
772
+ const bfsIDs: number[] = [];
773
+ objBST.bfs(node => bfsIDs.push(node.key));
774
+ expect(bfsIDs[0]).toBe(2);
775
+ expect(bfsIDs[1]).toBe(12);
776
+ expect(bfsIDs[2]).toBe(16);
777
+
778
+ const bfsNodes: BSTNode<{key: number; keyA: number}>[] = [];
779
+ objBST.bfs(node => bfsNodes.push(node));
780
+ expect(bfsNodes[0].key).toBe(2);
781
+ expect(bfsNodes[1].key).toBe(12);
782
+ expect(bfsNodes[2].key).toBe(16);
783
+ });
784
+ });
785
+
396
786
  describe('BST Performance test', function () {
397
787
  const bst = new BST<BSTNode<number>>();
398
788
  const inputSize = 10000; // Adjust input sizes as needed
@@ -1,14 +1,80 @@
1
- // import {RBTree, RBTreeNode} from '../../../../src';
1
+ import {RBTree, RBTreeNode} from '../../../../src';
2
+
3
+ describe('RBTreeNode', () => {
4
+ it('should create an instance of RBTreeNode', () => {
5
+ const node = new RBTreeNode<number>(1);
6
+ expect(node).toBeInstanceOf(RBTreeNode);
7
+ });
8
+
9
+ it('should set and get the ID correctly', () => {
10
+ const node = new RBTreeNode<number>(1);
11
+ expect(node.key).toBe(1);
12
+
13
+ node.key = 2;
14
+ expect(node.key).toBe(2);
15
+ });
16
+
17
+ it('should set and get the value correctly', () => {
18
+ const node: RBTreeNode<number> = new RBTreeNode<number>(1, 42);
19
+ expect(node.val).toBe(42);
20
+
21
+ node.val = 55;
22
+ expect(node.val).toBe(55);
23
+ });
24
+
25
+ it('should set and get the left child correctly', () => {
26
+ const node1 = new RBTreeNode<number>(1);
27
+ const node2 = new RBTreeNode<number>(2);
28
+
29
+ node1.left = node2;
30
+
31
+ expect(node1.left).toBe(node2);
32
+ expect(node2.parent).toBe(node1);
33
+ });
34
+
35
+ it('should set and get the right child correctly', () => {
36
+ const node1 = new RBTreeNode<number>(1);
37
+ const node2 = new RBTreeNode<number>(2);
38
+
39
+ node1.right = node2;
40
+
41
+ expect(node1.right).toBe(node2);
42
+ expect(node2.parent).toBe(node1);
43
+ });
44
+
45
+ it('should set and get the parent correctly', () => {
46
+ const node1 = new RBTreeNode<number>(1);
47
+ const node2 = new RBTreeNode<number>(2);
48
+
49
+ node1.left = node2;
50
+
51
+ expect(node2.parent).toBe(node1);
52
+ expect(node1.left).toBe(node2);
53
+ });
54
+
55
+ it('should determine family position correctly', () => {
56
+ const root = new RBTreeNode<number>(1);
57
+ const leftChild = new RBTreeNode<number>(2);
58
+ const rightChild = new RBTreeNode<number>(3);
59
+
60
+ root.left = leftChild;
61
+ root.right = rightChild;
62
+
63
+ expect(leftChild.familyPosition).toBe('LEFT');
64
+ expect(rightChild.familyPosition).toBe('RIGHT');
65
+ expect(root.familyPosition).toBe('ROOT');
66
+ });
67
+ });
2
68
 
3
69
  describe('Red-Black Tree Tests', () => {
4
- // let tree: RBTree<RBTreeNode<number>>;
5
- //
6
- // beforeEach(() => {
7
- // tree = new RBTree<RBTreeNode<number>>();
8
- // });
70
+ let tree: RBTree<RBTreeNode<number>>;
71
+
72
+ beforeEach(() => {
73
+ tree = new RBTree<RBTreeNode<number>>();
74
+ });
9
75
 
10
76
  test('Insertion and In-order Traverse', () => {
11
- // tree.add(5);
77
+ tree.add(5);
12
78
  // tree.add(3);
13
79
  // tree.add(7);
14
80
  // tree.add(2);