data-structure-typed 1.54.2 → 2.0.0

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 (213) 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 +28 -1
  6. package/benchmark/report.json +327 -18
  7. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +14 -40
  8. package/dist/cjs/data-structures/base/iterable-element-base.js +14 -11
  9. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
  10. package/dist/cjs/data-structures/base/linear-base.d.ts +277 -0
  11. package/dist/cjs/data-structures/base/linear-base.js +553 -0
  12. package/dist/cjs/data-structures/base/linear-base.js.map +1 -0
  13. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
  14. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js +8 -7
  15. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +23 -19
  17. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +51 -38
  18. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  19. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +89 -21
  20. package/dist/cjs/data-structures/binary-tree/avl-tree.js +76 -8
  21. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  22. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +173 -225
  23. package/dist/cjs/data-structures/binary-tree/binary-tree.js +244 -149
  24. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  25. package/dist/cjs/data-structures/binary-tree/bst.d.ts +62 -56
  26. package/dist/cjs/data-structures/binary-tree/bst.js +89 -133
  27. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  28. package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +19 -25
  29. package/dist/cjs/data-structures/binary-tree/red-black-tree.js +7 -13
  30. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
  31. package/dist/cjs/data-structures/binary-tree/tree-counter.d.ts +19 -19
  32. package/dist/cjs/data-structures/binary-tree/tree-counter.js +12 -12
  33. package/dist/cjs/data-structures/binary-tree/tree-counter.js.map +1 -1
  34. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +186 -25
  35. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +211 -41
  36. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  37. package/dist/cjs/data-structures/graph/abstract-graph.js +2 -2
  38. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  39. package/dist/cjs/data-structures/heap/heap.d.ts +3 -11
  40. package/dist/cjs/data-structures/heap/heap.js +0 -10
  41. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  42. package/dist/cjs/data-structures/heap/max-heap.d.ts +2 -2
  43. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  44. package/dist/cjs/data-structures/heap/min-heap.d.ts +2 -2
  45. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  46. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  47. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +131 -146
  48. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  49. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +79 -75
  50. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +217 -169
  51. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  52. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  53. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  54. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  55. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  56. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +2 -2
  57. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  58. package/dist/cjs/data-structures/queue/deque.d.ts +130 -91
  59. package/dist/cjs/data-structures/queue/deque.js +269 -169
  60. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  61. package/dist/cjs/data-structures/queue/queue.d.ts +84 -40
  62. package/dist/cjs/data-structures/queue/queue.js +134 -50
  63. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  64. package/dist/cjs/data-structures/stack/stack.d.ts +3 -11
  65. package/dist/cjs/data-structures/stack/stack.js +0 -10
  66. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  67. package/dist/cjs/data-structures/trie/trie.d.ts +4 -3
  68. package/dist/cjs/data-structures/trie/trie.js +3 -0
  69. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  70. package/dist/cjs/types/data-structures/base/base.d.ts +9 -4
  71. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  72. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
  73. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +1 -1
  74. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  75. package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  76. package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  77. package/dist/cjs/types/data-structures/queue/deque.d.ts +2 -3
  78. package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -2
  79. package/dist/cjs/utils/utils.d.ts +2 -2
  80. package/dist/esm/data-structures/base/iterable-element-base.d.ts +14 -40
  81. package/dist/esm/data-structures/base/iterable-element-base.js +14 -11
  82. package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
  83. package/dist/esm/data-structures/base/linear-base.d.ts +277 -0
  84. package/dist/esm/data-structures/base/linear-base.js +549 -0
  85. package/dist/esm/data-structures/base/linear-base.js.map +1 -0
  86. package/dist/esm/data-structures/binary-tree/avl-tree-counter.d.ts +21 -20
  87. package/dist/esm/data-structures/binary-tree/avl-tree-counter.js +9 -8
  88. package/dist/esm/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
  89. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +23 -19
  90. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +52 -38
  91. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  92. package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +89 -21
  93. package/dist/esm/data-structures/binary-tree/avl-tree.js +77 -9
  94. package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
  95. package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +173 -225
  96. package/dist/esm/data-structures/binary-tree/binary-tree.js +248 -153
  97. package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
  98. package/dist/esm/data-structures/binary-tree/bst.d.ts +62 -56
  99. package/dist/esm/data-structures/binary-tree/bst.js +90 -132
  100. package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
  101. package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +19 -25
  102. package/dist/esm/data-structures/binary-tree/red-black-tree.js +8 -14
  103. package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
  104. package/dist/esm/data-structures/binary-tree/tree-counter.d.ts +19 -19
  105. package/dist/esm/data-structures/binary-tree/tree-counter.js +13 -13
  106. package/dist/esm/data-structures/binary-tree/tree-counter.js.map +1 -1
  107. package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +186 -25
  108. package/dist/esm/data-structures/binary-tree/tree-multi-map.js +212 -41
  109. package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  110. package/dist/esm/data-structures/graph/abstract-graph.js +2 -2
  111. package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
  112. package/dist/esm/data-structures/heap/heap.d.ts +3 -11
  113. package/dist/esm/data-structures/heap/heap.js +0 -10
  114. package/dist/esm/data-structures/heap/heap.js.map +1 -1
  115. package/dist/esm/data-structures/heap/max-heap.d.ts +2 -2
  116. package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
  117. package/dist/esm/data-structures/heap/min-heap.d.ts +2 -2
  118. package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
  119. package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  120. package/dist/esm/data-structures/linked-list/doubly-linked-list.js +132 -148
  121. package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  122. package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +79 -75
  123. package/dist/esm/data-structures/linked-list/singly-linked-list.js +217 -170
  124. package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
  125. package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  126. package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  127. package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  128. package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  129. package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -2
  130. package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
  131. package/dist/esm/data-structures/queue/deque.d.ts +130 -91
  132. package/dist/esm/data-structures/queue/deque.js +269 -169
  133. package/dist/esm/data-structures/queue/deque.js.map +1 -1
  134. package/dist/esm/data-structures/queue/queue.d.ts +84 -40
  135. package/dist/esm/data-structures/queue/queue.js +135 -51
  136. package/dist/esm/data-structures/queue/queue.js.map +1 -1
  137. package/dist/esm/data-structures/stack/stack.d.ts +3 -11
  138. package/dist/esm/data-structures/stack/stack.js +0 -10
  139. package/dist/esm/data-structures/stack/stack.js.map +1 -1
  140. package/dist/esm/data-structures/trie/trie.d.ts +4 -3
  141. package/dist/esm/data-structures/trie/trie.js +3 -0
  142. package/dist/esm/data-structures/trie/trie.js.map +1 -1
  143. package/dist/esm/types/data-structures/base/base.d.ts +9 -4
  144. package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  145. package/dist/esm/types/data-structures/binary-tree/binary-tree.d.ts +1 -0
  146. package/dist/esm/types/data-structures/binary-tree/bst.d.ts +1 -1
  147. package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  148. package/dist/esm/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  149. package/dist/esm/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  150. package/dist/esm/types/data-structures/queue/deque.d.ts +2 -3
  151. package/dist/esm/types/data-structures/queue/queue.d.ts +2 -2
  152. package/dist/esm/utils/utils.d.ts +2 -2
  153. package/dist/umd/data-structure-typed.js +1548 -920
  154. package/dist/umd/data-structure-typed.min.js +5 -12
  155. package/dist/umd/data-structure-typed.min.js.map +1 -1
  156. package/package.json +7 -7
  157. package/src/data-structures/base/iterable-element-base.ts +29 -20
  158. package/src/data-structures/base/linear-base.ts +649 -0
  159. package/src/data-structures/binary-tree/avl-tree-counter.ts +30 -23
  160. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +74 -49
  161. package/src/data-structures/binary-tree/avl-tree.ts +99 -29
  162. package/src/data-structures/binary-tree/binary-tree.ts +474 -257
  163. package/src/data-structures/binary-tree/bst.ts +150 -152
  164. package/src/data-structures/binary-tree/red-black-tree.ts +27 -35
  165. package/src/data-structures/binary-tree/tree-counter.ts +33 -27
  166. package/src/data-structures/binary-tree/tree-multi-map.ts +235 -53
  167. package/src/data-structures/graph/abstract-graph.ts +2 -2
  168. package/src/data-structures/heap/heap.ts +3 -14
  169. package/src/data-structures/heap/max-heap.ts +2 -2
  170. package/src/data-structures/heap/min-heap.ts +2 -2
  171. package/src/data-structures/linked-list/doubly-linked-list.ts +144 -160
  172. package/src/data-structures/linked-list/singly-linked-list.ts +241 -185
  173. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -5
  174. package/src/data-structures/priority-queue/min-priority-queue.ts +2 -5
  175. package/src/data-structures/priority-queue/priority-queue.ts +2 -2
  176. package/src/data-structures/queue/deque.ts +286 -183
  177. package/src/data-structures/queue/queue.ts +149 -63
  178. package/src/data-structures/stack/stack.ts +3 -18
  179. package/src/data-structures/trie/trie.ts +7 -3
  180. package/src/types/data-structures/base/base.ts +17 -8
  181. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
  182. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -0
  183. package/src/types/data-structures/binary-tree/bst.ts +1 -1
  184. package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
  185. package/src/types/data-structures/linked-list/doubly-linked-list.ts +2 -2
  186. package/src/types/data-structures/linked-list/singly-linked-list.ts +2 -2
  187. package/src/types/data-structures/queue/deque.ts +2 -3
  188. package/src/types/data-structures/queue/queue.ts +2 -2
  189. package/src/utils/utils.ts +2 -2
  190. package/test/integration/all-in-one.test.ts +1 -1
  191. package/test/integration/avl-tree.test.ts +1 -1
  192. package/test/integration/bst.test.ts +2 -2
  193. package/test/integration/compile.mjs +21 -21
  194. package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +71 -0
  195. package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +81 -0
  196. package/test/performance/{reportor.js → reportor.mjs} +264 -8
  197. package/test/performance/reportor.ts +1 -1
  198. package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +7 -7
  199. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +172 -5
  200. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +72 -4
  201. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +132 -82
  202. package/test/unit/data-structures/binary-tree/bst.test.ts +12 -12
  203. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +5 -13
  204. package/test/unit/data-structures/binary-tree/tree-counter.test.ts +4 -4
  205. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +168 -10
  206. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +135 -27
  207. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +111 -11
  208. package/test/unit/data-structures/queue/deque.test.ts +241 -60
  209. package/test/unit/data-structures/queue/queue.test.ts +118 -19
  210. package/test/unit/unrestricted-interconversion.test.ts +1 -1
  211. package/test/utils/json2html.ts +0 -154
  212. package/test/performance/data-structures/binary-tree/avl-tree.test.js +0 -45
  213. /package/test/performance/data-structures/binary-tree/{rb-tree.test.ts → red-black-tree.test.ts} +0 -0
@@ -50,7 +50,7 @@ describe('AVLTreeMultiMap Test', () => {
50
50
  expect(getMinNodeBySpecificNode?.key).toBe(12);
51
51
 
52
52
  let subTreeSum = 0;
53
- if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
53
+ if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
54
54
  expect(subTreeSum).toBe(70);
55
55
 
56
56
  let lesserSum = 0;
@@ -176,7 +176,7 @@ describe('AVLTreeMultiMap Test recursively', () => {
176
176
  expect(getMinNodeBySpecificNode?.key).toBe(12);
177
177
 
178
178
  let subTreeSum = 0;
179
- if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
179
+ if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
180
180
  expect(subTreeSum).toBe(70);
181
181
 
182
182
  let lesserSum = 0;
@@ -509,7 +509,7 @@ describe('AVLTreeMultiMap not map mode', () => {
509
509
  expect(getMinNodeBySpecificNode?.key).toBe(12);
510
510
 
511
511
  let subTreeSum = 0;
512
- if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
512
+ if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
513
513
  expect(subTreeSum).toBe(70);
514
514
 
515
515
  let lesserSum = 0;
@@ -527,7 +527,6 @@ describe('AVLTreeMultiMap not map mode test recursively', () => {
527
527
  const avlTmm = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
528
528
 
529
529
  for (const i of arr) avlTmm.add([i, [i]]);
530
-
531
530
  const node6 = avlTmm.getNode(6);
532
531
 
533
532
  expect(node6 && avlTmm.getHeight(node6)).toBe(3);
@@ -544,7 +543,7 @@ describe('AVLTreeMultiMap not map mode test recursively', () => {
544
543
  expect(getMinNodeBySpecificNode?.key).toBe(12);
545
544
 
546
545
  let subTreeSum = 0;
547
- if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', node15);
546
+ if (node15) avlTmm.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
548
547
  expect(subTreeSum).toBe(70);
549
548
 
550
549
  let lesserSum = 0;
@@ -571,3 +570,171 @@ describe('AVLTreeMultiMap iterative methods not map mode', () => {
571
570
  expect(cloned.get(cloned.root?.right?.key)).toEqual(['c']);
572
571
  });
573
572
  });
573
+
574
+ describe('classic use', () => {
575
+ // Test suite for TreeMultiMap with player ranking and equipment
576
+ it('players ranked by score with their equipment', () => {
577
+ type Equipment = {
578
+ name: string; // Equipment name
579
+ quality: 'legendary' | 'epic' | 'rare' | 'common';
580
+ level: number;
581
+ };
582
+
583
+ type Player = {
584
+ name: string;
585
+ score: number;
586
+ equipments: Equipment[];
587
+ };
588
+
589
+ // Mock player data with their scores and equipment
590
+ const players: Player[] = [
591
+ {
592
+ name: 'DragonSlayer',
593
+ score: 8750,
594
+ equipments: [
595
+ { name: 'AWM', quality: 'legendary', level: 85 },
596
+ { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
597
+ { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
598
+ { name: 'Compensator', quality: 'epic', level: 78 },
599
+ { name: 'Vertical Grip', quality: 'rare', level: 72 }
600
+ ]
601
+ },
602
+ {
603
+ name: 'ShadowNinja',
604
+ score: 7200,
605
+ equipments: [
606
+ { name: 'M416', quality: 'epic', level: 75 },
607
+ { name: 'Ghillie Suit', quality: 'rare', level: 70 },
608
+ { name: 'Red Dot Sight', quality: 'common', level: 65 },
609
+ { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
610
+ ]
611
+ },
612
+ {
613
+ name: 'RuneMaster',
614
+ score: 9100,
615
+ equipments: [
616
+ { name: 'KAR98K', quality: 'legendary', level: 90 },
617
+ { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
618
+ { name: 'Holographic Sight', quality: 'epic', level: 82 },
619
+ { name: 'Suppressor', quality: 'legendary', level: 88 },
620
+ { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
621
+ ]
622
+ },
623
+ {
624
+ name: 'BattleKing',
625
+ score: 8500,
626
+ equipments: [
627
+ { name: 'AUG', quality: 'epic', level: 82 },
628
+ { name: 'Red Dot Sight', quality: 'rare', level: 75 },
629
+ { name: 'Extended Mag', quality: 'common', level: 70 },
630
+ { name: 'Tactical Stock', quality: 'rare', level: 76 }
631
+ ]
632
+ },
633
+ {
634
+ name: 'SniperElite',
635
+ score: 7800,
636
+ equipments: [
637
+ { name: 'M24', quality: 'legendary', level: 88 },
638
+ { name: 'Compensator', quality: 'epic', level: 80 },
639
+ { name: 'Scope 8x', quality: 'legendary', level: 85 },
640
+ { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
641
+ ]
642
+ },
643
+ {
644
+ name: 'RushMaster',
645
+ score: 7500,
646
+ equipments: [
647
+ { name: 'Vector', quality: 'rare', level: 72 },
648
+ { name: 'Level 2 Helmet', quality: 'common', level: 65 },
649
+ { name: 'Quickdraw Mag', quality: 'common', level: 60 },
650
+ { name: 'Laser Sight', quality: 'rare', level: 68 }
651
+ ]
652
+ },
653
+ {
654
+ name: 'GhostWarrior',
655
+ score: 8200,
656
+ equipments: [
657
+ { name: 'SCAR-L', quality: 'epic', level: 78 },
658
+ { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
659
+ { name: 'Holographic Sight', quality: 'epic', level: 75 },
660
+ { name: 'Suppressor', quality: 'rare', level: 72 },
661
+ { name: 'Vertical Grip', quality: 'common', level: 65 }
662
+ ]
663
+ },
664
+ {
665
+ name: 'DeathDealer',
666
+ score: 7300,
667
+ equipments: [
668
+ { name: 'SKS', quality: 'epic', level: 76 },
669
+ { name: 'Holographic Sight', quality: 'rare', level: 68 },
670
+ { name: 'Extended Mag', quality: 'common', level: 65 }
671
+ ]
672
+ },
673
+ {
674
+ name: 'StormRider',
675
+ score: 8900,
676
+ equipments: [
677
+ { name: 'MK14', quality: 'legendary', level: 92 },
678
+ { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
679
+ { name: 'Scope 8x', quality: 'epic', level: 80 },
680
+ { name: 'Suppressor', quality: 'legendary', level: 88 },
681
+ { name: 'Tactical Stock', quality: 'rare', level: 75 }
682
+ ]
683
+ },
684
+ {
685
+ name: 'CombatLegend',
686
+ score: 7600,
687
+ equipments: [
688
+ { name: 'UMP45', quality: 'rare', level: 74 },
689
+ { name: 'Level 2 Vest', quality: 'common', level: 67 },
690
+ { name: 'Red Dot Sight', quality: 'common', level: 62 },
691
+ { name: 'Extended Mag', quality: 'rare', level: 70 }
692
+ ]
693
+ }
694
+ ];
695
+
696
+ // Create a TreeMultiMap for player rankings
697
+ const playerRankings = new AVLTreeMultiMap<number, Equipment, Player>(players, {
698
+ toEntryFn: ({ score, equipments }) => [score, equipments],
699
+ isMapMode: false
700
+ });
701
+
702
+ const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
703
+ expect(topPlayersEquipments).toEqual([
704
+ [
705
+ {
706
+ name: 'MK14',
707
+ quality: 'legendary',
708
+ level: 92
709
+ },
710
+ { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
711
+ {
712
+ name: 'Scope 8x',
713
+ quality: 'epic',
714
+ level: 80
715
+ },
716
+ { name: 'Suppressor', quality: 'legendary', level: 88 },
717
+ {
718
+ name: 'Tactical Stock',
719
+ quality: 'rare',
720
+ level: 75
721
+ }
722
+ ],
723
+ [
724
+ { name: 'KAR98K', quality: 'legendary', level: 90 },
725
+ {
726
+ name: 'Level 3 Vest',
727
+ quality: 'legendary',
728
+ level: 85
729
+ },
730
+ { name: 'Holographic Sight', quality: 'epic', level: 82 },
731
+ {
732
+ name: 'Suppressor',
733
+ quality: 'legendary',
734
+ level: 88
735
+ },
736
+ { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
737
+ ]
738
+ ]);
739
+ });
740
+ });
@@ -24,7 +24,7 @@ describe('AVL Tree Test', () => {
24
24
  expect(getMinNodeBySpecificNode?.key).toBe(12);
25
25
 
26
26
  let subTreeSum = 0;
27
- if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
27
+ if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
28
28
  expect(subTreeSum).toBe(70);
29
29
 
30
30
  let lesserSum = 0;
@@ -150,7 +150,7 @@ describe('AVL Tree Test recursively', () => {
150
150
  expect(getMinNodeBySpecificNode?.key).toBe(12);
151
151
 
152
152
  let subTreeSum = 0;
153
- if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
153
+ if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
154
154
  expect(subTreeSum).toBe(70);
155
155
 
156
156
  let lesserSum = 0;
@@ -480,7 +480,7 @@ describe('AVL Tree not map mode', () => {
480
480
  expect(getMinNodeBySpecificNode?.key).toBe(12);
481
481
 
482
482
  let subTreeSum = 0;
483
- if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
483
+ if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
484
484
  expect(subTreeSum).toBe(70);
485
485
 
486
486
  let lesserSum = 0;
@@ -515,7 +515,7 @@ describe('AVL Tree not map mode test recursively', () => {
515
515
  expect(getMinNodeBySpecificNode?.key).toBe(12);
516
516
 
517
517
  let subTreeSum = 0;
518
- if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', node15);
518
+ if (node15) avlTree.dfs(node => (subTreeSum += node.key), 'PRE', false, node15);
519
519
  expect(subTreeSum).toBe(70);
520
520
 
521
521
  let lesserSum = 0;
@@ -542,3 +542,71 @@ describe('AVLTree iterative methods not map mode', () => {
542
542
  expect(cloned.get(cloned.root?.right?.key)).toBe('c');
543
543
  });
544
544
  });
545
+
546
+ describe('classic use', () => {
547
+ // Test case for finding elements in a given range
548
+ it('@example Find elements in a range', () => {
549
+ // In interval queries, AVL trees, with their strictly balanced structure and lower height, offer better query efficiency, making them ideal for frequent and high-performance interval queries. In contrast, Red-Black trees, with lower update costs, are more suitable for scenarios involving frequent insertions and deletions where the requirements for interval queries are less demanding.
550
+ type Datum = { timestamp: Date; temperature: number };
551
+ // Fixed dataset of CPU temperature readings
552
+ const cpuData: Datum[] = [
553
+ { timestamp: new Date('2024-12-02T00:00:00'), temperature: 55.1 },
554
+ { timestamp: new Date('2024-12-02T00:01:00'), temperature: 56.3 },
555
+ { timestamp: new Date('2024-12-02T00:02:00'), temperature: 54.8 },
556
+ { timestamp: new Date('2024-12-02T00:03:00'), temperature: 57.2 },
557
+ { timestamp: new Date('2024-12-02T00:04:00'), temperature: 58.0 },
558
+ { timestamp: new Date('2024-12-02T00:05:00'), temperature: 59.4 },
559
+ { timestamp: new Date('2024-12-02T00:06:00'), temperature: 60.1 },
560
+ { timestamp: new Date('2024-12-02T00:07:00'), temperature: 61.3 },
561
+ { timestamp: new Date('2024-12-02T00:08:00'), temperature: 62.0 },
562
+ { timestamp: new Date('2024-12-02T00:09:00'), temperature: 63.5 },
563
+ { timestamp: new Date('2024-12-02T00:10:00'), temperature: 64.0 },
564
+ { timestamp: new Date('2024-12-02T00:11:00'), temperature: 62.8 },
565
+ { timestamp: new Date('2024-12-02T00:12:00'), temperature: 61.5 },
566
+ { timestamp: new Date('2024-12-02T00:13:00'), temperature: 60.2 },
567
+ { timestamp: new Date('2024-12-02T00:14:00'), temperature: 59.8 },
568
+ { timestamp: new Date('2024-12-02T00:15:00'), temperature: 58.6 },
569
+ { timestamp: new Date('2024-12-02T00:16:00'), temperature: 57.4 },
570
+ { timestamp: new Date('2024-12-02T00:17:00'), temperature: 56.2 },
571
+ { timestamp: new Date('2024-12-02T00:18:00'), temperature: 55.7 },
572
+ { timestamp: new Date('2024-12-02T00:19:00'), temperature: 54.5 },
573
+ { timestamp: new Date('2024-12-02T00:20:00'), temperature: 53.2 },
574
+ { timestamp: new Date('2024-12-02T00:21:00'), temperature: 52.8 },
575
+ { timestamp: new Date('2024-12-02T00:22:00'), temperature: 51.9 },
576
+ { timestamp: new Date('2024-12-02T00:23:00'), temperature: 50.5 },
577
+ { timestamp: new Date('2024-12-02T00:24:00'), temperature: 49.8 },
578
+ { timestamp: new Date('2024-12-02T00:25:00'), temperature: 48.7 },
579
+ { timestamp: new Date('2024-12-02T00:26:00'), temperature: 47.5 },
580
+ { timestamp: new Date('2024-12-02T00:27:00'), temperature: 46.3 },
581
+ { timestamp: new Date('2024-12-02T00:28:00'), temperature: 45.9 },
582
+ { timestamp: new Date('2024-12-02T00:29:00'), temperature: 45.0 }
583
+ ];
584
+
585
+ // Create an AVL tree to store CPU temperature data
586
+ const cpuTemperatureTree = new AVLTree<Date, number, Datum>(cpuData, {
587
+ toEntryFn: ({ timestamp, temperature }) => [timestamp, temperature]
588
+ });
589
+
590
+ // Query a specific time range (e.g., from 00:05 to 00:15)
591
+ const rangeStart = new Date('2024-12-02T00:05:00');
592
+ const rangeEnd = new Date('2024-12-02T00:15:00');
593
+ const rangeResults = cpuTemperatureTree.rangeSearch([rangeStart, rangeEnd], node => ({
594
+ minute: node ? node.key.getMinutes() : 0,
595
+ temperature: cpuTemperatureTree.get(node ? node.key : undefined)
596
+ }));
597
+
598
+ expect(rangeResults).toEqual([
599
+ { minute: 5, temperature: 59.4 },
600
+ { minute: 6, temperature: 60.1 },
601
+ { minute: 7, temperature: 61.3 },
602
+ { minute: 8, temperature: 62 },
603
+ { minute: 9, temperature: 63.5 },
604
+ { minute: 10, temperature: 64 },
605
+ { minute: 11, temperature: 62.8 },
606
+ { minute: 12, temperature: 61.5 },
607
+ { minute: 13, temperature: 60.2 },
608
+ { minute: 14, temperature: 59.8 },
609
+ { minute: 15, temperature: 58.6 }
610
+ ]);
611
+ });
612
+ });
@@ -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
+ });