data-structure-typed 1.54.2 → 1.54.3

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 (91) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/LICENSE +2 -2
  3. package/README.md +14 -1
  4. package/README_zh-CN.md +1 -1
  5. package/benchmark/report.html +4 -1
  6. package/benchmark/report.json +76 -17
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
  8. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js +8 -7
  9. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
  10. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -12
  11. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +2 -2
  12. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +25 -21
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js +12 -8
  15. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +111 -225
  17. package/dist/cjs/data-structures/binary-tree/binary-tree.js +177 -144
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  19. package/dist/cjs/data-structures/binary-tree/bst.d.ts +59 -53
  20. package/dist/cjs/data-structures/binary-tree/bst.js +75 -119
  21. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  22. package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +18 -18
  23. package/dist/cjs/data-structures/binary-tree/red-black-tree.js +6 -6
  24. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
  25. package/dist/cjs/data-structures/binary-tree/tree-counter.d.ts +19 -19
  26. package/dist/cjs/data-structures/binary-tree/tree-counter.js +12 -12
  27. package/dist/cjs/data-structures/binary-tree/tree-counter.js.map +1 -1
  28. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +12 -12
  29. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +2 -2
  30. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  31. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
  32. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +1 -1
  33. package/dist/cjs/utils/utils.d.ts +2 -2
  34. package/dist/esm/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
  35. package/dist/esm/data-structures/binary-tree/avl-tree-counter.js +9 -8
  36. package/dist/esm/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
  37. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -12
  38. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +3 -3
  39. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  40. package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +25 -21
  41. package/dist/esm/data-structures/binary-tree/avl-tree.js +13 -9
  42. package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
  43. package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +111 -225
  44. package/dist/esm/data-structures/binary-tree/binary-tree.js +181 -148
  45. package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
  46. package/dist/esm/data-structures/binary-tree/bst.d.ts +59 -53
  47. package/dist/esm/data-structures/binary-tree/bst.js +76 -120
  48. package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
  49. package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +18 -18
  50. package/dist/esm/data-structures/binary-tree/red-black-tree.js +7 -7
  51. package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
  52. package/dist/esm/data-structures/binary-tree/tree-counter.d.ts +19 -19
  53. package/dist/esm/data-structures/binary-tree/tree-counter.js +13 -13
  54. package/dist/esm/data-structures/binary-tree/tree-counter.js.map +1 -1
  55. package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +12 -12
  56. package/dist/esm/data-structures/binary-tree/tree-multi-map.js +3 -3
  57. package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  58. package/dist/esm/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
  59. package/dist/esm/types/data-structures/binary-tree/bst.d.ts +1 -1
  60. package/dist/esm/utils/utils.d.ts +2 -2
  61. package/dist/umd/data-structure-typed.js +296 -279
  62. package/dist/umd/data-structure-typed.min.js +5 -12
  63. package/dist/umd/data-structure-typed.min.js.map +1 -1
  64. package/package.json +7 -7
  65. package/src/data-structures/binary-tree/avl-tree-counter.ts +30 -23
  66. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +25 -15
  67. package/src/data-structures/binary-tree/avl-tree.ts +35 -29
  68. package/src/data-structures/binary-tree/binary-tree.ts +469 -252
  69. package/src/data-structures/binary-tree/bst.ts +141 -143
  70. package/src/data-structures/binary-tree/red-black-tree.ts +27 -35
  71. package/src/data-structures/binary-tree/tree-counter.ts +33 -27
  72. package/src/data-structures/binary-tree/tree-multi-map.ts +25 -17
  73. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -0
  74. package/src/types/data-structures/binary-tree/bst.ts +1 -1
  75. package/src/utils/utils.ts +2 -2
  76. package/test/integration/compile.mjs +21 -21
  77. package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +71 -0
  78. package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +81 -0
  79. package/test/performance/{reportor.js → reportor.mjs} +264 -8
  80. package/test/performance/reportor.ts +1 -1
  81. package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +7 -7
  82. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +4 -5
  83. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +72 -5
  84. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +132 -82
  85. package/test/unit/data-structures/binary-tree/bst.test.ts +12 -12
  86. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +4 -12
  87. package/test/unit/data-structures/binary-tree/tree-counter.test.ts +4 -4
  88. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +5 -5
  89. package/test/utils/json2html.ts +0 -154
  90. package/test/performance/data-structures/binary-tree/avl-tree.test.js +0 -45
  91. /package/test/performance/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +0 -0
@@ -217,20 +217,20 @@ describe('BinaryTree', () => {
217
217
  expect(cloned.root?.right?.key).toBe(6);
218
218
  expect(cloned.root?.right?.left?.key).toBe(3);
219
219
  expect(cloned.root?.right?.right).toBe(null);
220
- expect(cloned.dfs(node => node.key, 'PRE', cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
221
- expect(cloned.dfs(node => (node ? node.key : null), 'PRE', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
220
+ expect(cloned.dfs(node => node.key, 'PRE', false, cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
221
+ expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
222
222
  6,
223
223
  3,
224
224
  7,
225
225
  null
226
226
  ]);
227
- expect(cloned.dfs(node => (node ? node.key : node), 'PRE', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
227
+ expect(cloned.dfs(node => (node ? node.key : node), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
228
228
  6,
229
229
  3,
230
230
  7,
231
231
  null
232
232
  ]);
233
- expect(cloned.dfs(node => (node ? node.key : null), 'PRE', cloned.getNode(6), 'RECURSIVE', true)).toEqual([
233
+ expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'RECURSIVE', true)).toEqual([
234
234
  6,
235
235
  3,
236
236
  7,
@@ -532,11 +532,11 @@ describe('BinaryTree', () => {
532
532
  expect(binTree.dfs()).toEqual([]);
533
533
  expect([...binTree.values()]).toEqual([]);
534
534
  binTree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
535
- expect(binTree.dfs(node => node.key, 'PRE', undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
536
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'ITERATIVE', false)).toEqual([
537
- 4, 2, 1, 5, 6, 3, 7
538
- ]);
539
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'ITERATIVE', true)).toEqual([
535
+ expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
536
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', false)).toEqual(
537
+ [4, 2, 1, 5, 6, 3, 7]
538
+ );
539
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', true)).toEqual([
540
540
  4,
541
541
  2,
542
542
  null,
@@ -549,11 +549,11 @@ describe('BinaryTree', () => {
549
549
  null
550
550
  ]);
551
551
 
552
- expect(binTree.dfs(node => node.key, 'PRE', undefined, 'RECURSIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
553
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'RECURSIVE', false)).toEqual([
554
- 4, 2, 1, 5, 6, 3, 7
555
- ]);
556
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', undefined, 'RECURSIVE', true)).toEqual([
552
+ expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'RECURSIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
553
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', false)).toEqual(
554
+ [4, 2, 1, 5, 6, 3, 7]
555
+ );
556
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', true)).toEqual([
557
557
  4,
558
558
  2,
559
559
  null,
@@ -566,11 +566,11 @@ describe('BinaryTree', () => {
566
566
  null
567
567
  ]);
568
568
 
569
- expect(binTree.dfs(node => node.key, 'IN', undefined, 'ITERATIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
570
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'ITERATIVE', false)).toEqual([
569
+ expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'ITERATIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
570
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', false)).toEqual([
571
571
  2, 5, 1, 4, 7, 3, 6
572
572
  ]);
573
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'ITERATIVE', true)).toEqual([
573
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', true)).toEqual([
574
574
  null,
575
575
  2,
576
576
  5,
@@ -583,11 +583,11 @@ describe('BinaryTree', () => {
583
583
  null
584
584
  ]);
585
585
 
586
- expect(binTree.dfs(node => node.key, 'IN', undefined, 'RECURSIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
587
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'RECURSIVE', false)).toEqual([
586
+ expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'RECURSIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
587
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', false)).toEqual([
588
588
  2, 5, 1, 4, 7, 3, 6
589
589
  ]);
590
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', undefined, 'RECURSIVE', true)).toEqual([
590
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', true)).toEqual([
591
591
  null,
592
592
  2,
593
593
  5,
@@ -600,89 +600,71 @@ describe('BinaryTree', () => {
600
600
  null
601
601
  ]);
602
602
 
603
- expect(binTree.dfs(node => node.key, 'POST', undefined, 'ITERATIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
604
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'ITERATIVE', false)).toEqual([
605
- 5, 1, 2, 7, 3, 6, 4
606
- ]);
607
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'ITERATIVE', true)).toEqual([
608
- null,
609
- 5,
610
- null,
611
- 1,
612
- 2,
613
- 7,
614
- 3,
615
- null,
616
- 6,
617
- 4
618
- ]);
603
+ expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'ITERATIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
604
+ expect(
605
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', false)
606
+ ).toEqual([5, 1, 2, 7, 3, 6, 4]);
607
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', true)).toEqual(
608
+ [null, 5, null, 1, 2, 7, 3, null, 6, 4]
609
+ );
619
610
 
620
- expect(binTree.dfs(node => node.key, 'POST', undefined, 'RECURSIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
621
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'RECURSIVE', false)).toEqual([
622
- 5, 1, 2, 7, 3, 6, 4
623
- ]);
624
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', undefined, 'RECURSIVE', true)).toEqual([
625
- null,
626
- 5,
627
- null,
628
- 1,
629
- 2,
630
- 7,
631
- 3,
632
- null,
633
- 6,
634
- 4
635
- ]);
611
+ expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'RECURSIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
612
+ expect(
613
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', false)
614
+ ).toEqual([5, 1, 2, 7, 3, 6, 4]);
615
+ expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', true)).toEqual(
616
+ [null, 5, null, 1, 2, 7, 3, null, 6, 4]
617
+ );
636
618
  });
637
619
 
638
620
  it('should sub binTree traverse', () => {
639
621
  binTree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
640
- expect(binTree.dfs(node => node.key, 'PRE', binTree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
622
+ expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
641
623
  expect(
642
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'ITERATIVE', false)
624
+ binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', false)
643
625
  ).toEqual([6, 3, 7]);
644
626
  expect(
645
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'ITERATIVE', true)
627
+ binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', true)
646
628
  ).toEqual([6, 3, 7, null]);
647
629
 
648
- expect(binTree.dfs(node => node.key, 'PRE', binTree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
630
+ expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
649
631
  expect(
650
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'RECURSIVE', false)
632
+ binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', false)
651
633
  ).toEqual([6, 3, 7]);
652
634
  expect(
653
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', binTree.getNode(6), 'RECURSIVE', true)
635
+ binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', true)
654
636
  ).toEqual([6, 3, 7, null]);
655
637
 
656
- expect(binTree.dfs(node => node.key, 'IN', binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
638
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
657
639
  expect(
658
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'ITERATIVE', false)
640
+ binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', false)
659
641
  ).toEqual([7, 3, 6]);
660
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'ITERATIVE', true)).toEqual(
661
- [7, 3, 6, null]
662
- );
642
+ expect(
643
+ binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', true)
644
+ ).toEqual([7, 3, 6, null]);
663
645
 
664
- expect(binTree.dfs(node => node.key, 'IN', binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
646
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
665
647
  expect(
666
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'RECURSIVE', false)
648
+ binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', false)
667
649
  ).toEqual([7, 3, 6]);
668
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', binTree.getNode(6), 'RECURSIVE', true)).toEqual(
669
- [7, 3, 6, null]
670
- );
650
+ expect(
651
+ binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', true)
652
+ ).toEqual([7, 3, 6, null]);
671
653
 
672
- expect(binTree.dfs(node => node.key, 'POST', binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
654
+ expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
673
655
  expect(
674
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'ITERATIVE', false)
656
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', false)
675
657
  ).toEqual([7, 3, 6]);
676
658
  expect(
677
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'ITERATIVE', true)
659
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', true)
678
660
  ).toEqual([7, 3, null, 6]);
679
661
 
680
- expect(binTree.dfs(node => node.key, 'POST', binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
662
+ expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
681
663
  expect(
682
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'RECURSIVE', false)
664
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', false)
683
665
  ).toEqual([7, 3, 6]);
684
666
  expect(
685
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', binTree.getNode(6), 'RECURSIVE', true)
667
+ binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', true)
686
668
  ).toEqual([7, 3, null, 6]);
687
669
  });
688
670
 
@@ -814,7 +796,7 @@ describe('BinaryTree Morris Traversal', () => {
814
796
 
815
797
  expect(result).toEqual(expected);
816
798
  expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
817
- expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
799
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
818
800
  });
819
801
 
820
802
  it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
@@ -875,7 +857,7 @@ describe('BinaryTree toEntryFn', () => {
875
857
 
876
858
  expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
877
859
  expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
878
- expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
860
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
879
861
  });
880
862
 
881
863
  it('should toEntryFn with initial', () => {
@@ -890,7 +872,7 @@ describe('BinaryTree toEntryFn', () => {
890
872
 
891
873
  expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
892
874
  expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
893
- expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(expected);
875
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
894
876
  });
895
877
 
896
878
  it('should no toEntryFn', () => {
@@ -905,7 +887,7 @@ describe('BinaryTree toEntryFn', () => {
905
887
 
906
888
  expect(binTree.morris(node => node.key, 'IN')).toEqual(data.sort((a, b) => a.obj.id - b.obj.id));
907
889
  expect(binTree.dfs(node => node.key, 'IN')).toEqual(data);
908
- expect(binTree.dfs(node => node.key, 'IN', binTree.root, 'RECURSIVE')).toEqual(data);
890
+ expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(data);
909
891
  });
910
892
  });
911
893
 
@@ -953,19 +935,21 @@ describe('BinaryTree traversals', () => {
953
935
  );
954
936
 
955
937
  expect(binTree.dfs(node => node.key, 'PRE')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
956
- expect(binTree.dfs(node => node.key, 'PRE', binTree.root, 'RECURSIVE')).toEqual([
938
+ expect(binTree.dfs(node => node.key, 'PRE', false, binTree.root, 'RECURSIVE')).toEqual([
957
939
  35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
958
940
  ]);
959
941
  expect(
960
- binTree.dfs(node => node, 'PRE', binTree.root, 'ITERATIVE', true).map(node => (node === null ? null : node.key))
942
+ binTree
943
+ .dfs(node => node, 'PRE', false, binTree.root, 'ITERATIVE', true)
944
+ .map(node => (node === null ? null : node.key))
961
945
  ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
962
946
  expect(
963
- binTree.dfs(node => node, 'PRE', binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))
947
+ binTree.dfs(node => node, 'PRE', false, binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))
964
948
  ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
965
949
 
966
950
  expect(binTree.dfs(node => node.key, 'IN')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
967
951
  expect(binTree.dfs(node => node.key, 'POST')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
968
- expect(binTree.dfs(node => node.key, 'POST', binTree.root, 'RECURSIVE')).toEqual([
952
+ expect(binTree.dfs(node => node.key, 'POST', false, binTree.root, 'RECURSIVE')).toEqual([
969
953
  16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
970
954
  ]);
971
955
  expect(binTree.bfs(node => node.key, binTree.root, 'RECURSIVE')).toEqual([
@@ -1434,3 +1418,69 @@ describe('BinaryTree not map mode iterative methods test', () => {
1434
1418
  expect(cloned.get(cloned.root?.right)).toBe('c');
1435
1419
  });
1436
1420
  });
1421
+
1422
+ describe('classic use', () => {
1423
+ it('@example determine loan approval using a decision tree', () => {
1424
+ // Decision tree structure
1425
+ const loanDecisionTree = new BinaryTree<string>(
1426
+ ['stableIncome', 'goodCredit', 'Rejected', 'Approved', 'Rejected'],
1427
+ { isDuplicate: true }
1428
+ );
1429
+
1430
+ function determineLoanApproval(
1431
+ node?: BinaryTreeNode<string> | null,
1432
+ conditions?: { [key: string]: boolean }
1433
+ ): string {
1434
+ if (!node) throw new Error('Invalid node');
1435
+
1436
+ // If it's a leaf node, return the decision result
1437
+ if (!node.left && !node.right) return node.key;
1438
+
1439
+ // Check if a valid condition exists for the current node's key
1440
+ return conditions?.[node.key]
1441
+ ? determineLoanApproval(node.left, conditions)
1442
+ : determineLoanApproval(node.right, conditions);
1443
+ }
1444
+
1445
+ // Test case 1: Stable income and good credit score
1446
+ expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: true })).toBe('Approved');
1447
+
1448
+ // Test case 2: Stable income but poor credit score
1449
+ expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: false })).toBe('Rejected');
1450
+
1451
+ // Test case 3: No stable income
1452
+ expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: true })).toBe('Rejected');
1453
+
1454
+ // Test case 4: No stable income and poor credit score
1455
+ expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: false })).toBe('Rejected');
1456
+ });
1457
+
1458
+ it('@example evaluate the arithmetic expression represented by the binary tree', () => {
1459
+ const expressionTree = new BinaryTree<number | string>(['+', 3, '*', null, null, 5, '-', null, null, 2, 8]);
1460
+
1461
+ function evaluate(node?: BinaryTreeNode<number | string> | null): number {
1462
+ if (!node) return 0;
1463
+
1464
+ if (typeof node.key === 'number') return node.key;
1465
+
1466
+ const leftValue = evaluate(node.left); // Evaluate the left subtree
1467
+ const rightValue = evaluate(node.right); // Evaluate the right subtree
1468
+
1469
+ // Perform the operation based on the current node's operator
1470
+ switch (node.key) {
1471
+ case '+':
1472
+ return leftValue + rightValue;
1473
+ case '-':
1474
+ return leftValue - rightValue;
1475
+ case '*':
1476
+ return leftValue * rightValue;
1477
+ case '/':
1478
+ return rightValue !== 0 ? leftValue / rightValue : 0; // Handle division by zero
1479
+ default:
1480
+ throw new Error(`Unsupported operator: ${node.key}`);
1481
+ }
1482
+ }
1483
+
1484
+ expect(evaluate(expressionTree.root)).toBe(-27);
1485
+ });
1486
+ });
@@ -90,7 +90,7 @@ describe('BST operations test', () => {
90
90
  expect(nodes.map(node => node.key)).toEqual([15]);
91
91
 
92
92
  let subTreeSum = 0;
93
- if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', 15);
93
+ if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
94
94
  expect(subTreeSum).toBe(70);
95
95
 
96
96
  let lesserSum = 0;
@@ -299,7 +299,7 @@ describe('BST operations test', () => {
299
299
  expect(minNodeBySpecificNode?.key).toBe(12);
300
300
 
301
301
  let subTreeSum = 0;
302
- if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', node15);
302
+ if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
303
303
  expect(subTreeSum).toBe(70);
304
304
 
305
305
  let lesserSum = 0;
@@ -492,7 +492,7 @@ describe('BST operations test', () => {
492
492
 
493
493
  it('should search in range', () => {
494
494
  const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
495
- expect(bst.rangeSearch([4, 12])).toEqual([10, 12, 5, 7]);
495
+ expect(bst.rangeSearch([4, 12])).toEqual([5, 7, 10, 12]);
496
496
  expect(() => bst.rangeSearch([12, 4])).toThrow('low must be less than or equal to high');
497
497
  expect(bst.rangeSearch([12, 12])).toEqual([12]);
498
498
  });
@@ -535,7 +535,7 @@ describe('BST operations test recursively', () => {
535
535
  expect(minNodeBySpecificNode?.key).toBe(12);
536
536
 
537
537
  let subTreeSum = 0;
538
- if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', 15);
538
+ if (node15) bst.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
539
539
  expect(subTreeSum).toBe(70);
540
540
 
541
541
  let lesserSum = 0;
@@ -742,7 +742,7 @@ describe('BST operations test recursively', () => {
742
742
  expect(minNodeBySpecificNode?.key).toBe(12);
743
743
 
744
744
  let subTreeSum = 0;
745
- if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', node15);
745
+ if (node15) objBST.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
746
746
  expect(subTreeSum).toBe(70);
747
747
 
748
748
  let lesserSum = 0;
@@ -1080,10 +1080,10 @@ describe('BST Performance test', function () {
1080
1080
  it('should dfs as sub tree traversal, null should be ignored', () => {
1081
1081
  const bst = new BST();
1082
1082
  bst.addMany([4, 2, 6, 1, 3, 5, 7]);
1083
- expect(bst.dfs(node => node.key, 'PRE', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
1084
- expect(bst.dfs(node => node.key, 'PRE', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
1085
- expect(bst.dfs(node => node?.key ?? undefined, 'PRE', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
1086
- expect(bst.dfs(node => node?.key ?? undefined, 'PRE', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
1083
+ expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
1084
+ expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
1085
+ expect(bst.dfs(node => node?.key ?? undefined, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
1086
+ expect(bst.dfs(node => node?.key ?? undefined, 'PRE', false, bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
1087
1087
  });
1088
1088
  });
1089
1089
 
@@ -1565,9 +1565,9 @@ describe('classic use', () => {
1565
1565
  // Test case for finding elements in a given range
1566
1566
  it('@example Find elements in a range', () => {
1567
1567
  const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);
1568
- expect(bst.search(new Range(5, 10))).toEqual([10, 5, 7]);
1569
- expect(bst.rangeSearch([4, 12], node => node.key.toString())).toEqual(['10', '12', '5', '7']);
1570
- expect(bst.search(new Range(4, 12, true, false))).toEqual([10, 5, 7]);
1568
+ expect(bst.search(new Range(5, 10))).toEqual([5, 7, 10]);
1569
+ expect(bst.rangeSearch([4, 12], node => node.key.toString())).toEqual(['5', '7', '10', '12']);
1570
+ expect(bst.search(new Range(4, 12, true, false))).toEqual([5, 7, 10]);
1571
1571
  expect(bst.rangeSearch([15, 20])).toEqual([15, 18]);
1572
1572
  expect(bst.search(new Range(15, 20, false))).toEqual([18]);
1573
1573
  });
@@ -504,11 +504,11 @@ describe('RedBlackTree 2', () => {
504
504
  expect(rbTree.isBST()).toBe(true);
505
505
  expect(rbTree.isBST(rbTree.root, 'RECURSIVE')).toBe(true);
506
506
 
507
- expect(rbTree.dfs(n => n.key, 'IN', rbTree.root, 'ITERATIVE')).toEqual([
507
+ expect(rbTree.dfs(n => n.key, 'IN', false, rbTree.root, 'ITERATIVE')).toEqual([
508
508
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
509
509
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
510
510
  ]);
511
- expect(rbTree.dfs(n => n.key, 'IN', rbTree.root, 'RECURSIVE')).toEqual([
511
+ expect(rbTree.dfs(n => n.key, 'IN', false, rbTree.root, 'RECURSIVE')).toEqual([
512
512
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
513
513
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
514
514
  ]);
@@ -524,7 +524,7 @@ describe('RedBlackTree 2', () => {
524
524
 
525
525
  expect(rbTree.size).toBe(0);
526
526
  expect(rbTree.isBST()).toBe(true);
527
- expect(rbTree.dfs(n => n.key, 'IN', rbTree.root, 'ITERATIVE')).toEqual([]);
527
+ expect(rbTree.dfs(n => n.key, 'IN', false, rbTree.root, 'ITERATIVE')).toEqual([]);
528
528
 
529
529
  rbTree.clear();
530
530
  for (let i = 0; i < 1000; i++) {
@@ -838,14 +838,6 @@ describe('real world data', () => {
838
838
  });
839
839
 
840
840
  describe('classic use', () => {
841
- // Test case for finding elements in a given range
842
- it('@example Find elements in a range', () => {
843
- const bst = new RedBlackTree<number>([10, 5, 15, 3, 7, 12, 18]);
844
- expect(bst.search(new Range(5, 10))).toEqual([5, 10, 7]);
845
- expect(bst.search(new Range(4, 12))).toEqual([5, 10, 12, 7]);
846
- expect(bst.search(new Range(15, 20))).toEqual([15, 18]);
847
- });
848
-
849
841
  it('@example using Red-Black Tree as a price-based index for stock data', () => {
850
842
  // Define the structure of individual stock records
851
843
  interface StockRecord {
@@ -887,6 +879,6 @@ describe('classic use', () => {
887
879
  [200, 400], // Price range
888
880
  node => priceIndex.get(node)?.symbol // Extract stock symbols for the result
889
881
  );
890
- expect(stocksInRange).toEqual(['GOOGL', 'MSFT', 'META']); // Verify stocks in the range
882
+ expect(stocksInRange).toEqual(['GOOGL', 'META', 'MSFT']); // Verify stocks in the range
891
883
  });
892
884
  });
@@ -149,7 +149,7 @@ describe('TreeCounter operations test1', () => {
149
149
  expect(minNodeBySpecificNode?.key).toBe(14);
150
150
 
151
151
  let subTreeSum = 0;
152
- if (node15) treeCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
152
+ if (node15) treeCounter.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
153
153
  expect(subTreeSum).toBe(45);
154
154
  let lesserSum = 0;
155
155
  treeCounter.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
@@ -157,7 +157,7 @@ describe('TreeCounter operations test1', () => {
157
157
 
158
158
  expect(node15 instanceof TreeCounterNode);
159
159
  if (node15 instanceof TreeCounterNode) {
160
- const subTreeAdd = treeCounter.dfs(node => (node.count += 1), 'PRE', 15);
160
+ const subTreeAdd = treeCounter.dfs(node => (node.count += 1), 'PRE', false, 15);
161
161
  expect(subTreeAdd);
162
162
  }
163
163
  const node11 = treeCounter.getNode(11);
@@ -407,7 +407,7 @@ describe('TreeCounter operations test recursively1', () => {
407
407
  expect(minNodeBySpecificNode?.key).toBe(14);
408
408
 
409
409
  let subTreeSum = 0;
410
- if (node15) treeCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
410
+ if (node15) treeCounter.dfs(node => (subTreeSum += node.key), 'PRE', false, 15);
411
411
  expect(subTreeSum).toBe(45);
412
412
  let lesserSum = 0;
413
413
  expect(treeCounter.has(9)).toBe(true);
@@ -423,7 +423,7 @@ describe('TreeCounter operations test recursively1', () => {
423
423
 
424
424
  expect(node15 instanceof TreeCounterNode);
425
425
  if (node15 instanceof TreeCounterNode) {
426
- const subTreeAdd = treeCounter.dfs(node => (node.count += 1), 'PRE', 15);
426
+ const subTreeAdd = treeCounter.dfs(node => (node.count += 1), 'PRE', false, 15);
427
427
  expect(subTreeAdd);
428
428
  }
429
429
  const node11 = treeCounter.getNode(11);
@@ -519,11 +519,11 @@ describe('TreeMultiMap 2', () => {
519
519
  expect(tmm.isBST()).toBe(true);
520
520
  expect(tmm.isBST(tmm.root, 'RECURSIVE')).toBe(true);
521
521
 
522
- expect(tmm.dfs(n => n.key, 'IN', tmm.root, 'ITERATIVE')).toEqual([
522
+ expect(tmm.dfs(n => n.key, 'IN', false, tmm.root, 'ITERATIVE')).toEqual([
523
523
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
524
524
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
525
525
  ]);
526
- expect(tmm.dfs(n => n.key, 'IN', tmm.root, 'RECURSIVE')).toEqual([
526
+ expect(tmm.dfs(n => n.key, 'IN', false, tmm.root, 'RECURSIVE')).toEqual([
527
527
  49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
528
528
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
529
529
  ]);
@@ -539,7 +539,7 @@ describe('TreeMultiMap 2', () => {
539
539
 
540
540
  expect(tmm.size).toBe(0);
541
541
  expect(tmm.isBST()).toBe(true);
542
- expect(tmm.dfs(n => n.key, 'IN', tmm.root, 'ITERATIVE')).toEqual([]);
542
+ expect(tmm.dfs(n => n.key, 'IN', false, tmm.root, 'ITERATIVE')).toEqual([]);
543
543
 
544
544
  tmm.clear();
545
545
  for (let i = 0; i < 1000; i++) {
@@ -840,8 +840,8 @@ describe('classic use', () => {
840
840
  // Test case for finding elements in a given range
841
841
  it('@example Find elements in a range', () => {
842
842
  const tmm = new TreeMultiMap<number>([10, 5, 15, 3, 7, 12, 18]);
843
- expect(tmm.search(new Range(5, 10))).toEqual([5, 10, 7]);
844
- expect(tmm.search(new Range(4, 12))).toEqual([5, 10, 12, 7]);
843
+ expect(tmm.search(new Range(5, 10))).toEqual([5, 7, 10]);
844
+ expect(tmm.search(new Range(4, 12))).toEqual([5, 7, 10, 12]);
845
845
  expect(tmm.search(new Range(15, 20))).toEqual([15, 18]);
846
846
  });
847
847
  });