data-structure-typed 1.54.0 → 1.54.2

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 (498) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +1 -0
  3. package/benchmark/report.html +1 -28
  4. package/benchmark/report.json +17 -326
  5. package/dist/{mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts → cjs/data-structures/binary-tree/avl-tree-counter.d.ts} +54 -47
  6. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js +408 -0
  7. package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js.map +1 -0
  8. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +71 -177
  9. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +135 -340
  10. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +102 -57
  12. package/dist/cjs/data-structures/binary-tree/avl-tree.js +110 -47
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +3 -0
  15. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +3 -0
  16. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +240 -190
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.js +269 -240
  19. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/bst.d.ts +145 -112
  21. package/dist/cjs/data-structures/binary-tree/bst.js +180 -129
  22. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  23. package/dist/cjs/data-structures/binary-tree/index.d.ts +2 -0
  24. package/dist/cjs/data-structures/binary-tree/index.js +2 -0
  25. package/dist/cjs/data-structures/binary-tree/index.js.map +1 -1
  26. package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +100 -82
  27. package/dist/cjs/data-structures/binary-tree/red-black-tree.js +115 -79
  28. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
  29. package/dist/{mjs/data-structures/binary-tree/tree-multi-map.d.ts → cjs/data-structures/binary-tree/tree-counter.d.ts} +74 -64
  30. package/dist/cjs/data-structures/binary-tree/tree-counter.js +445 -0
  31. package/dist/cjs/data-structures/binary-tree/tree-counter.js.map +1 -0
  32. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +78 -174
  33. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +142 -377
  34. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  35. package/dist/cjs/data-structures/graph/directed-graph.d.ts +3 -0
  36. package/dist/cjs/data-structures/graph/directed-graph.js +3 -0
  37. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  38. package/dist/cjs/data-structures/graph/map-graph.d.ts +3 -0
  39. package/dist/cjs/data-structures/graph/map-graph.js +3 -0
  40. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  41. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +3 -0
  42. package/dist/cjs/data-structures/graph/undirected-graph.js +3 -0
  43. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  44. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +3 -0
  45. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +3 -0
  46. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  47. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +3 -0
  48. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +3 -0
  49. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/matrix/matrix.d.ts +3 -0
  51. package/dist/cjs/data-structures/matrix/matrix.js +3 -0
  52. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  53. package/dist/cjs/data-structures/matrix/navigator.d.ts +3 -0
  54. package/dist/cjs/data-structures/matrix/navigator.js +3 -0
  55. package/dist/cjs/data-structures/matrix/navigator.js.map +1 -1
  56. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +3 -0
  57. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +3 -0
  58. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  59. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +3 -0
  60. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +3 -0
  61. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  62. package/dist/cjs/data-structures/trie/trie.d.ts +0 -4
  63. package/dist/cjs/data-structures/trie/trie.js +0 -4
  64. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  65. package/dist/cjs/interfaces/binary-tree.d.ts +8 -8
  66. package/dist/cjs/types/data-structures/binary-tree/avl-tree-counter.d.ts +2 -0
  67. package/dist/cjs/types/data-structures/binary-tree/avl-tree-counter.js +3 -0
  68. package/dist/cjs/types/data-structures/binary-tree/avl-tree-counter.js.map +1 -0
  69. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -4
  70. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +0 -3
  71. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -3
  72. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +3 -3
  73. package/dist/cjs/types/data-structures/binary-tree/index.d.ts +3 -1
  74. package/dist/cjs/types/data-structures/binary-tree/index.js +3 -1
  75. package/dist/cjs/types/data-structures/binary-tree/index.js.map +1 -1
  76. package/dist/cjs/types/data-structures/binary-tree/red-black-tree.d.ts +3 -0
  77. package/dist/cjs/types/data-structures/binary-tree/red-black-tree.js +3 -0
  78. package/dist/cjs/types/data-structures/binary-tree/red-black-tree.js.map +1 -0
  79. package/dist/cjs/types/data-structures/binary-tree/tree-counter.d.ts +2 -0
  80. package/dist/cjs/types/data-structures/binary-tree/{rb-tree.js → tree-counter.js} +1 -1
  81. package/dist/cjs/types/data-structures/binary-tree/tree-counter.js.map +1 -0
  82. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -5
  83. package/dist/esm/data-structures/binary-tree/avl-tree-counter.d.ts +213 -0
  84. package/dist/{mjs/data-structures/binary-tree/avl-tree-multi-map.js → esm/data-structures/binary-tree/avl-tree-counter.js} +73 -60
  85. package/dist/esm/data-structures/binary-tree/avl-tree-counter.js.map +1 -0
  86. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +100 -0
  87. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +191 -0
  88. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -0
  89. package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +234 -0
  90. package/dist/{mjs → esm}/data-structures/binary-tree/avl-tree.js +110 -47
  91. package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -0
  92. package/dist/{mjs → esm}/data-structures/binary-tree/binary-indexed-tree.d.ts +3 -0
  93. package/dist/{mjs → esm}/data-structures/binary-tree/binary-indexed-tree.js +3 -0
  94. package/dist/esm/data-structures/binary-tree/binary-indexed-tree.js.map +1 -0
  95. package/dist/{mjs → esm}/data-structures/binary-tree/binary-tree.d.ts +240 -190
  96. package/dist/{mjs → esm}/data-structures/binary-tree/binary-tree.js +272 -245
  97. package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -0
  98. package/dist/{mjs → esm}/data-structures/binary-tree/bst.d.ts +145 -112
  99. package/dist/{mjs → esm}/data-structures/binary-tree/bst.js +201 -155
  100. package/dist/esm/data-structures/binary-tree/bst.js.map +1 -0
  101. package/dist/{mjs → esm}/data-structures/binary-tree/index.d.ts +2 -0
  102. package/dist/{mjs/types/data-structures/binary-tree/index.d.ts → esm/data-structures/binary-tree/index.js} +6 -2
  103. package/dist/{mjs → esm}/data-structures/binary-tree/index.js.map +1 -1
  104. package/dist/{mjs → esm}/data-structures/binary-tree/red-black-tree.d.ts +100 -82
  105. package/dist/{mjs → esm}/data-structures/binary-tree/red-black-tree.js +115 -79
  106. package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -0
  107. package/dist/esm/data-structures/binary-tree/tree-counter.d.ts +212 -0
  108. package/dist/{mjs/data-structures/binary-tree/tree-multi-map.js → esm/data-structures/binary-tree/tree-counter.js} +111 -96
  109. package/dist/esm/data-structures/binary-tree/tree-counter.js.map +1 -0
  110. package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +106 -0
  111. package/dist/esm/data-structures/binary-tree/tree-multi-map.js +196 -0
  112. package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -0
  113. package/dist/{mjs → esm}/data-structures/graph/directed-graph.d.ts +3 -0
  114. package/dist/{mjs → esm}/data-structures/graph/directed-graph.js +3 -0
  115. package/dist/esm/data-structures/graph/directed-graph.js.map +1 -0
  116. package/dist/{mjs → esm}/data-structures/graph/map-graph.d.ts +3 -0
  117. package/dist/{mjs → esm}/data-structures/graph/map-graph.js +3 -0
  118. package/dist/esm/data-structures/graph/map-graph.js.map +1 -0
  119. package/dist/{mjs → esm}/data-structures/graph/undirected-graph.d.ts +3 -0
  120. package/dist/{mjs → esm}/data-structures/graph/undirected-graph.js +3 -0
  121. package/dist/esm/data-structures/graph/undirected-graph.js.map +1 -0
  122. package/dist/{mjs → esm}/data-structures/linked-list/singly-linked-list.d.ts +3 -0
  123. package/dist/{mjs → esm}/data-structures/linked-list/singly-linked-list.js +3 -0
  124. package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -0
  125. package/dist/{mjs → esm}/data-structures/linked-list/skip-linked-list.d.ts +3 -0
  126. package/dist/{mjs → esm}/data-structures/linked-list/skip-linked-list.js +3 -0
  127. package/dist/esm/data-structures/linked-list/skip-linked-list.js.map +1 -0
  128. package/dist/{mjs → esm}/data-structures/matrix/matrix.d.ts +3 -0
  129. package/dist/{mjs → esm}/data-structures/matrix/matrix.js +3 -0
  130. package/dist/esm/data-structures/matrix/matrix.js.map +1 -0
  131. package/dist/{mjs → esm}/data-structures/matrix/navigator.d.ts +3 -0
  132. package/dist/{mjs → esm}/data-structures/matrix/navigator.js +3 -0
  133. package/dist/esm/data-structures/matrix/navigator.js.map +1 -0
  134. package/dist/{mjs → esm}/data-structures/priority-queue/max-priority-queue.d.ts +3 -0
  135. package/dist/{mjs → esm}/data-structures/priority-queue/max-priority-queue.js +3 -0
  136. package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -0
  137. package/dist/{mjs → esm}/data-structures/priority-queue/min-priority-queue.d.ts +3 -0
  138. package/dist/{mjs → esm}/data-structures/priority-queue/min-priority-queue.js +3 -0
  139. package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -0
  140. package/dist/{mjs → esm}/data-structures/trie/trie.d.ts +0 -4
  141. package/dist/{mjs → esm}/data-structures/trie/trie.js +0 -4
  142. package/dist/esm/data-structures/trie/trie.js.map +1 -0
  143. package/dist/esm/interfaces/binary-tree.d.ts +9 -0
  144. package/dist/esm/types/data-structures/binary-tree/avl-tree-counter.d.ts +2 -0
  145. package/dist/esm/types/data-structures/binary-tree/avl-tree-counter.js +2 -0
  146. package/dist/esm/types/data-structures/binary-tree/avl-tree-counter.js.map +1 -0
  147. package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -0
  148. package/dist/esm/types/data-structures/binary-tree/avl-tree.d.ts +2 -0
  149. package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-tree.d.ts +0 -3
  150. package/dist/{mjs → esm}/types/data-structures/binary-tree/bst.d.ts +3 -3
  151. package/dist/{mjs/data-structures/binary-tree/index.js → esm/types/data-structures/binary-tree/index.d.ts} +4 -4
  152. package/dist/{mjs → esm}/types/data-structures/binary-tree/index.js +3 -1
  153. package/dist/{mjs → esm}/types/data-structures/binary-tree/index.js.map +1 -1
  154. package/dist/esm/types/data-structures/binary-tree/red-black-tree.d.ts +3 -0
  155. package/dist/esm/types/data-structures/binary-tree/red-black-tree.js +2 -0
  156. package/dist/esm/types/data-structures/binary-tree/red-black-tree.js.map +1 -0
  157. package/dist/esm/types/data-structures/binary-tree/tree-counter.d.ts +2 -0
  158. package/dist/esm/types/data-structures/binary-tree/tree-counter.js +2 -0
  159. package/dist/esm/types/data-structures/binary-tree/tree-counter.js.map +1 -0
  160. package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -0
  161. package/dist/umd/data-structure-typed.js +1464 -895
  162. package/dist/umd/data-structure-typed.min.js +5 -5
  163. package/dist/umd/data-structure-typed.min.js.map +1 -1
  164. package/package.json +14 -19
  165. package/src/data-structures/binary-tree/avl-tree-counter.ts +463 -0
  166. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +155 -393
  167. package/src/data-structures/binary-tree/avl-tree.ts +144 -93
  168. package/src/data-structures/binary-tree/binary-indexed-tree.ts +3 -0
  169. package/src/data-structures/binary-tree/binary-tree.ts +433 -405
  170. package/src/data-structures/binary-tree/bst.ts +261 -239
  171. package/src/data-structures/binary-tree/index.ts +2 -0
  172. package/src/data-structures/binary-tree/red-black-tree.ts +163 -134
  173. package/src/data-structures/binary-tree/tree-counter.ts +504 -0
  174. package/src/data-structures/binary-tree/tree-multi-map.ts +161 -429
  175. package/src/data-structures/graph/directed-graph.ts +3 -0
  176. package/src/data-structures/graph/map-graph.ts +3 -0
  177. package/src/data-structures/graph/undirected-graph.ts +3 -0
  178. package/src/data-structures/linked-list/singly-linked-list.ts +3 -0
  179. package/src/data-structures/linked-list/skip-linked-list.ts +3 -0
  180. package/src/data-structures/matrix/matrix.ts +3 -0
  181. package/src/data-structures/matrix/navigator.ts +3 -0
  182. package/src/data-structures/priority-queue/max-priority-queue.ts +3 -0
  183. package/src/data-structures/priority-queue/min-priority-queue.ts +3 -0
  184. package/src/data-structures/trie/trie.ts +0 -4
  185. package/src/interfaces/binary-tree.ts +10 -24
  186. package/src/types/data-structures/binary-tree/avl-tree-counter.ts +3 -0
  187. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -6
  188. package/src/types/data-structures/binary-tree/avl-tree.ts +0 -5
  189. package/src/types/data-structures/binary-tree/binary-tree.ts +0 -5
  190. package/src/types/data-structures/binary-tree/bst.ts +5 -5
  191. package/src/types/data-structures/binary-tree/index.ts +3 -1
  192. package/src/types/data-structures/binary-tree/red-black-tree.ts +5 -0
  193. package/src/types/data-structures/binary-tree/tree-counter.ts +3 -0
  194. package/src/types/data-structures/binary-tree/tree-multi-map.ts +2 -7
  195. package/test/integration/all-in-one.test.ts +1 -1
  196. package/test/integration/avl-tree.test.ts +1 -1
  197. package/test/integration/bst.test.ts +2 -2
  198. package/test/integration/compile.js +144 -0
  199. package/test/integration/compile.mjs +135 -0
  200. package/test/integration/compile.ts +171 -0
  201. package/test/integration/index.html +48 -48
  202. package/test/performance/data-structures/binary-tree/avl-tree.test.js +45 -0
  203. package/test/performance/data-structures/binary-tree/avl-tree.test.ts +4 -4
  204. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +5 -4
  205. package/test/performance/data-structures/comparison/comparison.test.ts +2 -2
  206. package/test/performance/reportor.js +249 -0
  207. package/test/performance/reportor.ts +5 -3
  208. package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +877 -0
  209. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +459 -761
  210. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +223 -223
  211. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +474 -492
  212. package/test/unit/data-structures/binary-tree/bst.test.ts +1 -1
  213. package/test/unit/data-structures/binary-tree/overall.test.ts +0 -3
  214. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +87 -90
  215. package/test/unit/data-structures/binary-tree/tree-counter.test.ts +975 -0
  216. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +729 -857
  217. package/test/unit/data-structures/hash/hash-map.test.ts +1 -1
  218. package/{tsconfig-mjs.json → tsconfig-esm.json} +1 -1
  219. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +0 -6
  220. package/dist/cjs/types/data-structures/binary-tree/rb-tree.js.map +0 -1
  221. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js.map +0 -1
  222. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +0 -189
  223. package/dist/mjs/data-structures/binary-tree/avl-tree.js.map +0 -1
  224. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js.map +0 -1
  225. package/dist/mjs/data-structures/binary-tree/binary-tree.js.map +0 -1
  226. package/dist/mjs/data-structures/binary-tree/bst.js.map +0 -1
  227. package/dist/mjs/data-structures/binary-tree/red-black-tree.js.map +0 -1
  228. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js.map +0 -1
  229. package/dist/mjs/data-structures/graph/directed-graph.js.map +0 -1
  230. package/dist/mjs/data-structures/graph/map-graph.js.map +0 -1
  231. package/dist/mjs/data-structures/graph/undirected-graph.js.map +0 -1
  232. package/dist/mjs/data-structures/linked-list/singly-linked-list.js.map +0 -1
  233. package/dist/mjs/data-structures/linked-list/skip-linked-list.js.map +0 -1
  234. package/dist/mjs/data-structures/matrix/matrix.js.map +0 -1
  235. package/dist/mjs/data-structures/matrix/navigator.js.map +0 -1
  236. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js.map +0 -1
  237. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js.map +0 -1
  238. package/dist/mjs/data-structures/trie/trie.js.map +0 -1
  239. package/dist/mjs/interfaces/binary-tree.d.ts +0 -9
  240. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -5
  241. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +0 -5
  242. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +0 -6
  243. package/dist/mjs/types/data-structures/binary-tree/rb-tree.js +0 -2
  244. package/dist/mjs/types/data-structures/binary-tree/rb-tree.js.map +0 -1
  245. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +0 -5
  246. package/src/types/data-structures/binary-tree/rb-tree.ts +0 -10
  247. /package/dist/{mjs → esm}/common/index.d.ts +0 -0
  248. /package/dist/{mjs → esm}/common/index.js +0 -0
  249. /package/dist/{mjs → esm}/common/index.js.map +0 -0
  250. /package/dist/{mjs → esm}/data-structures/base/index.d.ts +0 -0
  251. /package/dist/{mjs → esm}/data-structures/base/index.js +0 -0
  252. /package/dist/{mjs → esm}/data-structures/base/index.js.map +0 -0
  253. /package/dist/{mjs → esm}/data-structures/base/iterable-element-base.d.ts +0 -0
  254. /package/dist/{mjs → esm}/data-structures/base/iterable-element-base.js +0 -0
  255. /package/dist/{mjs → esm}/data-structures/base/iterable-element-base.js.map +0 -0
  256. /package/dist/{mjs → esm}/data-structures/base/iterable-entry-base.d.ts +0 -0
  257. /package/dist/{mjs → esm}/data-structures/base/iterable-entry-base.js +0 -0
  258. /package/dist/{mjs → esm}/data-structures/base/iterable-entry-base.js.map +0 -0
  259. /package/dist/{mjs → esm}/data-structures/binary-tree/segment-tree.d.ts +0 -0
  260. /package/dist/{mjs → esm}/data-structures/binary-tree/segment-tree.js +0 -0
  261. /package/dist/{mjs → esm}/data-structures/binary-tree/segment-tree.js.map +0 -0
  262. /package/dist/{mjs → esm}/data-structures/graph/abstract-graph.d.ts +0 -0
  263. /package/dist/{mjs → esm}/data-structures/graph/abstract-graph.js +0 -0
  264. /package/dist/{mjs → esm}/data-structures/graph/abstract-graph.js.map +0 -0
  265. /package/dist/{mjs → esm}/data-structures/graph/index.d.ts +0 -0
  266. /package/dist/{mjs → esm}/data-structures/graph/index.js +0 -0
  267. /package/dist/{mjs → esm}/data-structures/graph/index.js.map +0 -0
  268. /package/dist/{mjs → esm}/data-structures/hash/hash-map.d.ts +0 -0
  269. /package/dist/{mjs → esm}/data-structures/hash/hash-map.js +0 -0
  270. /package/dist/{mjs → esm}/data-structures/hash/hash-map.js.map +0 -0
  271. /package/dist/{mjs → esm}/data-structures/hash/index.d.ts +0 -0
  272. /package/dist/{mjs → esm}/data-structures/hash/index.js +0 -0
  273. /package/dist/{mjs → esm}/data-structures/hash/index.js.map +0 -0
  274. /package/dist/{mjs → esm}/data-structures/heap/heap.d.ts +0 -0
  275. /package/dist/{mjs → esm}/data-structures/heap/heap.js +0 -0
  276. /package/dist/{mjs → esm}/data-structures/heap/heap.js.map +0 -0
  277. /package/dist/{mjs → esm}/data-structures/heap/index.d.ts +0 -0
  278. /package/dist/{mjs → esm}/data-structures/heap/index.js +0 -0
  279. /package/dist/{mjs → esm}/data-structures/heap/index.js.map +0 -0
  280. /package/dist/{mjs → esm}/data-structures/heap/max-heap.d.ts +0 -0
  281. /package/dist/{mjs → esm}/data-structures/heap/max-heap.js +0 -0
  282. /package/dist/{mjs → esm}/data-structures/heap/max-heap.js.map +0 -0
  283. /package/dist/{mjs → esm}/data-structures/heap/min-heap.d.ts +0 -0
  284. /package/dist/{mjs → esm}/data-structures/heap/min-heap.js +0 -0
  285. /package/dist/{mjs → esm}/data-structures/heap/min-heap.js.map +0 -0
  286. /package/dist/{mjs → esm}/data-structures/index.d.ts +0 -0
  287. /package/dist/{mjs → esm}/data-structures/index.js +0 -0
  288. /package/dist/{mjs → esm}/data-structures/index.js.map +0 -0
  289. /package/dist/{mjs → esm}/data-structures/linked-list/doubly-linked-list.d.ts +0 -0
  290. /package/dist/{mjs → esm}/data-structures/linked-list/doubly-linked-list.js +0 -0
  291. /package/dist/{mjs → esm}/data-structures/linked-list/doubly-linked-list.js.map +0 -0
  292. /package/dist/{mjs → esm}/data-structures/linked-list/index.d.ts +0 -0
  293. /package/dist/{mjs → esm}/data-structures/linked-list/index.js +0 -0
  294. /package/dist/{mjs → esm}/data-structures/linked-list/index.js.map +0 -0
  295. /package/dist/{mjs → esm}/data-structures/matrix/index.d.ts +0 -0
  296. /package/dist/{mjs → esm}/data-structures/matrix/index.js +0 -0
  297. /package/dist/{mjs → esm}/data-structures/matrix/index.js.map +0 -0
  298. /package/dist/{mjs → esm}/data-structures/priority-queue/index.d.ts +0 -0
  299. /package/dist/{mjs → esm}/data-structures/priority-queue/index.js +0 -0
  300. /package/dist/{mjs → esm}/data-structures/priority-queue/index.js.map +0 -0
  301. /package/dist/{mjs → esm}/data-structures/priority-queue/priority-queue.d.ts +0 -0
  302. /package/dist/{mjs → esm}/data-structures/priority-queue/priority-queue.js +0 -0
  303. /package/dist/{mjs → esm}/data-structures/priority-queue/priority-queue.js.map +0 -0
  304. /package/dist/{mjs → esm}/data-structures/queue/deque.d.ts +0 -0
  305. /package/dist/{mjs → esm}/data-structures/queue/deque.js +0 -0
  306. /package/dist/{mjs → esm}/data-structures/queue/deque.js.map +0 -0
  307. /package/dist/{mjs → esm}/data-structures/queue/index.d.ts +0 -0
  308. /package/dist/{mjs → esm}/data-structures/queue/index.js +0 -0
  309. /package/dist/{mjs → esm}/data-structures/queue/index.js.map +0 -0
  310. /package/dist/{mjs → esm}/data-structures/queue/queue.d.ts +0 -0
  311. /package/dist/{mjs → esm}/data-structures/queue/queue.js +0 -0
  312. /package/dist/{mjs → esm}/data-structures/queue/queue.js.map +0 -0
  313. /package/dist/{mjs → esm}/data-structures/stack/index.d.ts +0 -0
  314. /package/dist/{mjs → esm}/data-structures/stack/index.js +0 -0
  315. /package/dist/{mjs → esm}/data-structures/stack/index.js.map +0 -0
  316. /package/dist/{mjs → esm}/data-structures/stack/stack.d.ts +0 -0
  317. /package/dist/{mjs → esm}/data-structures/stack/stack.js +0 -0
  318. /package/dist/{mjs → esm}/data-structures/stack/stack.js.map +0 -0
  319. /package/dist/{mjs → esm}/data-structures/tree/index.d.ts +0 -0
  320. /package/dist/{mjs → esm}/data-structures/tree/index.js +0 -0
  321. /package/dist/{mjs → esm}/data-structures/tree/index.js.map +0 -0
  322. /package/dist/{mjs → esm}/data-structures/tree/tree.d.ts +0 -0
  323. /package/dist/{mjs → esm}/data-structures/tree/tree.js +0 -0
  324. /package/dist/{mjs → esm}/data-structures/tree/tree.js.map +0 -0
  325. /package/dist/{mjs → esm}/data-structures/trie/index.d.ts +0 -0
  326. /package/dist/{mjs → esm}/data-structures/trie/index.js +0 -0
  327. /package/dist/{mjs → esm}/data-structures/trie/index.js.map +0 -0
  328. /package/dist/{mjs → esm}/index.d.ts +0 -0
  329. /package/dist/{mjs → esm}/index.js +0 -0
  330. /package/dist/{mjs → esm}/index.js.map +0 -0
  331. /package/dist/{mjs → esm}/interfaces/binary-tree.js +0 -0
  332. /package/dist/{mjs → esm}/interfaces/binary-tree.js.map +0 -0
  333. /package/dist/{mjs → esm}/interfaces/doubly-linked-list.d.ts +0 -0
  334. /package/dist/{mjs → esm}/interfaces/doubly-linked-list.js +0 -0
  335. /package/dist/{mjs → esm}/interfaces/doubly-linked-list.js.map +0 -0
  336. /package/dist/{mjs → esm}/interfaces/graph.d.ts +0 -0
  337. /package/dist/{mjs → esm}/interfaces/graph.js +0 -0
  338. /package/dist/{mjs → esm}/interfaces/graph.js.map +0 -0
  339. /package/dist/{mjs → esm}/interfaces/heap.d.ts +0 -0
  340. /package/dist/{mjs → esm}/interfaces/heap.js +0 -0
  341. /package/dist/{mjs → esm}/interfaces/heap.js.map +0 -0
  342. /package/dist/{mjs → esm}/interfaces/index.d.ts +0 -0
  343. /package/dist/{mjs → esm}/interfaces/index.js +0 -0
  344. /package/dist/{mjs → esm}/interfaces/index.js.map +0 -0
  345. /package/dist/{mjs → esm}/interfaces/navigator.d.ts +0 -0
  346. /package/dist/{mjs → esm}/interfaces/navigator.js +0 -0
  347. /package/dist/{mjs → esm}/interfaces/navigator.js.map +0 -0
  348. /package/dist/{mjs → esm}/interfaces/priority-queue.d.ts +0 -0
  349. /package/dist/{mjs → esm}/interfaces/priority-queue.js +0 -0
  350. /package/dist/{mjs → esm}/interfaces/priority-queue.js.map +0 -0
  351. /package/dist/{mjs → esm}/interfaces/segment-tree.d.ts +0 -0
  352. /package/dist/{mjs → esm}/interfaces/segment-tree.js +0 -0
  353. /package/dist/{mjs → esm}/interfaces/segment-tree.js.map +0 -0
  354. /package/dist/{mjs → esm}/interfaces/singly-linked-list.d.ts +0 -0
  355. /package/dist/{mjs → esm}/interfaces/singly-linked-list.js +0 -0
  356. /package/dist/{mjs → esm}/interfaces/singly-linked-list.js.map +0 -0
  357. /package/dist/{mjs → esm}/types/common.d.ts +0 -0
  358. /package/dist/{mjs → esm}/types/common.js +0 -0
  359. /package/dist/{mjs → esm}/types/common.js.map +0 -0
  360. /package/dist/{mjs → esm}/types/data-structures/base/base.d.ts +0 -0
  361. /package/dist/{mjs → esm}/types/data-structures/base/base.js +0 -0
  362. /package/dist/{mjs → esm}/types/data-structures/base/base.js.map +0 -0
  363. /package/dist/{mjs → esm}/types/data-structures/base/index.d.ts +0 -0
  364. /package/dist/{mjs → esm}/types/data-structures/base/index.js +0 -0
  365. /package/dist/{mjs → esm}/types/data-structures/base/index.js.map +0 -0
  366. /package/dist/{mjs → esm}/types/data-structures/binary-tree/avl-tree-multi-map.js +0 -0
  367. /package/dist/{mjs → esm}/types/data-structures/binary-tree/avl-tree-multi-map.js.map +0 -0
  368. /package/dist/{mjs → esm}/types/data-structures/binary-tree/avl-tree.js +0 -0
  369. /package/dist/{mjs → esm}/types/data-structures/binary-tree/avl-tree.js.map +0 -0
  370. /package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-indexed-tree.d.ts +0 -0
  371. /package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-indexed-tree.js +0 -0
  372. /package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-indexed-tree.js.map +0 -0
  373. /package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-tree.js +0 -0
  374. /package/dist/{mjs → esm}/types/data-structures/binary-tree/binary-tree.js.map +0 -0
  375. /package/dist/{mjs → esm}/types/data-structures/binary-tree/bst.js +0 -0
  376. /package/dist/{mjs → esm}/types/data-structures/binary-tree/bst.js.map +0 -0
  377. /package/dist/{mjs → esm}/types/data-structures/binary-tree/segment-tree.d.ts +0 -0
  378. /package/dist/{mjs → esm}/types/data-structures/binary-tree/segment-tree.js +0 -0
  379. /package/dist/{mjs → esm}/types/data-structures/binary-tree/segment-tree.js.map +0 -0
  380. /package/dist/{mjs → esm}/types/data-structures/binary-tree/tree-multi-map.js +0 -0
  381. /package/dist/{mjs → esm}/types/data-structures/binary-tree/tree-multi-map.js.map +0 -0
  382. /package/dist/{mjs → esm}/types/data-structures/graph/abstract-graph.d.ts +0 -0
  383. /package/dist/{mjs → esm}/types/data-structures/graph/abstract-graph.js +0 -0
  384. /package/dist/{mjs → esm}/types/data-structures/graph/abstract-graph.js.map +0 -0
  385. /package/dist/{mjs → esm}/types/data-structures/graph/directed-graph.d.ts +0 -0
  386. /package/dist/{mjs → esm}/types/data-structures/graph/directed-graph.js +0 -0
  387. /package/dist/{mjs → esm}/types/data-structures/graph/directed-graph.js.map +0 -0
  388. /package/dist/{mjs → esm}/types/data-structures/graph/index.d.ts +0 -0
  389. /package/dist/{mjs → esm}/types/data-structures/graph/index.js +0 -0
  390. /package/dist/{mjs → esm}/types/data-structures/graph/index.js.map +0 -0
  391. /package/dist/{mjs → esm}/types/data-structures/graph/map-graph.d.ts +0 -0
  392. /package/dist/{mjs → esm}/types/data-structures/graph/map-graph.js +0 -0
  393. /package/dist/{mjs → esm}/types/data-structures/graph/map-graph.js.map +0 -0
  394. /package/dist/{mjs → esm}/types/data-structures/graph/undirected-graph.d.ts +0 -0
  395. /package/dist/{mjs → esm}/types/data-structures/graph/undirected-graph.js +0 -0
  396. /package/dist/{mjs → esm}/types/data-structures/graph/undirected-graph.js.map +0 -0
  397. /package/dist/{mjs → esm}/types/data-structures/hash/hash-map.d.ts +0 -0
  398. /package/dist/{mjs → esm}/types/data-structures/hash/hash-map.js +0 -0
  399. /package/dist/{mjs → esm}/types/data-structures/hash/hash-map.js.map +0 -0
  400. /package/dist/{mjs → esm}/types/data-structures/hash/index.d.ts +0 -0
  401. /package/dist/{mjs → esm}/types/data-structures/hash/index.js +0 -0
  402. /package/dist/{mjs → esm}/types/data-structures/hash/index.js.map +0 -0
  403. /package/dist/{mjs → esm}/types/data-structures/heap/heap.d.ts +0 -0
  404. /package/dist/{mjs → esm}/types/data-structures/heap/heap.js +0 -0
  405. /package/dist/{mjs → esm}/types/data-structures/heap/heap.js.map +0 -0
  406. /package/dist/{mjs → esm}/types/data-structures/heap/index.d.ts +0 -0
  407. /package/dist/{mjs → esm}/types/data-structures/heap/index.js +0 -0
  408. /package/dist/{mjs → esm}/types/data-structures/heap/index.js.map +0 -0
  409. /package/dist/{mjs → esm}/types/data-structures/heap/max-heap.d.ts +0 -0
  410. /package/dist/{mjs → esm}/types/data-structures/heap/max-heap.js +0 -0
  411. /package/dist/{mjs → esm}/types/data-structures/heap/max-heap.js.map +0 -0
  412. /package/dist/{mjs → esm}/types/data-structures/heap/min-heap.d.ts +0 -0
  413. /package/dist/{mjs → esm}/types/data-structures/heap/min-heap.js +0 -0
  414. /package/dist/{mjs → esm}/types/data-structures/heap/min-heap.js.map +0 -0
  415. /package/dist/{mjs → esm}/types/data-structures/index.d.ts +0 -0
  416. /package/dist/{mjs → esm}/types/data-structures/index.js +0 -0
  417. /package/dist/{mjs → esm}/types/data-structures/index.js.map +0 -0
  418. /package/dist/{mjs → esm}/types/data-structures/linked-list/doubly-linked-list.d.ts +0 -0
  419. /package/dist/{mjs → esm}/types/data-structures/linked-list/doubly-linked-list.js +0 -0
  420. /package/dist/{mjs → esm}/types/data-structures/linked-list/doubly-linked-list.js.map +0 -0
  421. /package/dist/{mjs → esm}/types/data-structures/linked-list/index.d.ts +0 -0
  422. /package/dist/{mjs → esm}/types/data-structures/linked-list/index.js +0 -0
  423. /package/dist/{mjs → esm}/types/data-structures/linked-list/index.js.map +0 -0
  424. /package/dist/{mjs → esm}/types/data-structures/linked-list/singly-linked-list.d.ts +0 -0
  425. /package/dist/{mjs → esm}/types/data-structures/linked-list/singly-linked-list.js +0 -0
  426. /package/dist/{mjs → esm}/types/data-structures/linked-list/singly-linked-list.js.map +0 -0
  427. /package/dist/{mjs → esm}/types/data-structures/linked-list/skip-linked-list.d.ts +0 -0
  428. /package/dist/{mjs → esm}/types/data-structures/linked-list/skip-linked-list.js +0 -0
  429. /package/dist/{mjs → esm}/types/data-structures/linked-list/skip-linked-list.js.map +0 -0
  430. /package/dist/{mjs → esm}/types/data-structures/matrix/index.d.ts +0 -0
  431. /package/dist/{mjs → esm}/types/data-structures/matrix/index.js +0 -0
  432. /package/dist/{mjs → esm}/types/data-structures/matrix/index.js.map +0 -0
  433. /package/dist/{mjs → esm}/types/data-structures/matrix/matrix.d.ts +0 -0
  434. /package/dist/{mjs → esm}/types/data-structures/matrix/matrix.js +0 -0
  435. /package/dist/{mjs → esm}/types/data-structures/matrix/matrix.js.map +0 -0
  436. /package/dist/{mjs → esm}/types/data-structures/matrix/navigator.d.ts +0 -0
  437. /package/dist/{mjs → esm}/types/data-structures/matrix/navigator.js +0 -0
  438. /package/dist/{mjs → esm}/types/data-structures/matrix/navigator.js.map +0 -0
  439. /package/dist/{mjs → esm}/types/data-structures/priority-queue/index.d.ts +0 -0
  440. /package/dist/{mjs → esm}/types/data-structures/priority-queue/index.js +0 -0
  441. /package/dist/{mjs → esm}/types/data-structures/priority-queue/index.js.map +0 -0
  442. /package/dist/{mjs → esm}/types/data-structures/priority-queue/max-priority-queue.d.ts +0 -0
  443. /package/dist/{mjs → esm}/types/data-structures/priority-queue/max-priority-queue.js +0 -0
  444. /package/dist/{mjs → esm}/types/data-structures/priority-queue/max-priority-queue.js.map +0 -0
  445. /package/dist/{mjs → esm}/types/data-structures/priority-queue/min-priority-queue.d.ts +0 -0
  446. /package/dist/{mjs → esm}/types/data-structures/priority-queue/min-priority-queue.js +0 -0
  447. /package/dist/{mjs → esm}/types/data-structures/priority-queue/min-priority-queue.js.map +0 -0
  448. /package/dist/{mjs → esm}/types/data-structures/priority-queue/priority-queue.d.ts +0 -0
  449. /package/dist/{mjs → esm}/types/data-structures/priority-queue/priority-queue.js +0 -0
  450. /package/dist/{mjs → esm}/types/data-structures/priority-queue/priority-queue.js.map +0 -0
  451. /package/dist/{mjs → esm}/types/data-structures/queue/deque.d.ts +0 -0
  452. /package/dist/{mjs → esm}/types/data-structures/queue/deque.js +0 -0
  453. /package/dist/{mjs → esm}/types/data-structures/queue/deque.js.map +0 -0
  454. /package/dist/{mjs → esm}/types/data-structures/queue/index.d.ts +0 -0
  455. /package/dist/{mjs → esm}/types/data-structures/queue/index.js +0 -0
  456. /package/dist/{mjs → esm}/types/data-structures/queue/index.js.map +0 -0
  457. /package/dist/{mjs → esm}/types/data-structures/queue/queue.d.ts +0 -0
  458. /package/dist/{mjs → esm}/types/data-structures/queue/queue.js +0 -0
  459. /package/dist/{mjs → esm}/types/data-structures/queue/queue.js.map +0 -0
  460. /package/dist/{mjs → esm}/types/data-structures/stack/index.d.ts +0 -0
  461. /package/dist/{mjs → esm}/types/data-structures/stack/index.js +0 -0
  462. /package/dist/{mjs → esm}/types/data-structures/stack/index.js.map +0 -0
  463. /package/dist/{mjs → esm}/types/data-structures/stack/stack.d.ts +0 -0
  464. /package/dist/{mjs → esm}/types/data-structures/stack/stack.js +0 -0
  465. /package/dist/{mjs → esm}/types/data-structures/stack/stack.js.map +0 -0
  466. /package/dist/{mjs → esm}/types/data-structures/tree/index.d.ts +0 -0
  467. /package/dist/{mjs → esm}/types/data-structures/tree/index.js +0 -0
  468. /package/dist/{mjs → esm}/types/data-structures/tree/index.js.map +0 -0
  469. /package/dist/{mjs → esm}/types/data-structures/tree/tree.d.ts +0 -0
  470. /package/dist/{mjs → esm}/types/data-structures/tree/tree.js +0 -0
  471. /package/dist/{mjs → esm}/types/data-structures/tree/tree.js.map +0 -0
  472. /package/dist/{mjs → esm}/types/data-structures/trie/index.d.ts +0 -0
  473. /package/dist/{mjs → esm}/types/data-structures/trie/index.js +0 -0
  474. /package/dist/{mjs → esm}/types/data-structures/trie/index.js.map +0 -0
  475. /package/dist/{mjs → esm}/types/data-structures/trie/trie.d.ts +0 -0
  476. /package/dist/{mjs → esm}/types/data-structures/trie/trie.js +0 -0
  477. /package/dist/{mjs → esm}/types/data-structures/trie/trie.js.map +0 -0
  478. /package/dist/{mjs → esm}/types/index.d.ts +0 -0
  479. /package/dist/{mjs → esm}/types/index.js +0 -0
  480. /package/dist/{mjs → esm}/types/index.js.map +0 -0
  481. /package/dist/{mjs → esm}/types/utils/index.d.ts +0 -0
  482. /package/dist/{mjs → esm}/types/utils/index.js +0 -0
  483. /package/dist/{mjs → esm}/types/utils/index.js.map +0 -0
  484. /package/dist/{mjs → esm}/types/utils/utils.d.ts +0 -0
  485. /package/dist/{mjs → esm}/types/utils/utils.js +0 -0
  486. /package/dist/{mjs → esm}/types/utils/utils.js.map +0 -0
  487. /package/dist/{mjs → esm}/types/utils/validate-type.d.ts +0 -0
  488. /package/dist/{mjs → esm}/types/utils/validate-type.js +0 -0
  489. /package/dist/{mjs → esm}/types/utils/validate-type.js.map +0 -0
  490. /package/dist/{mjs → esm}/utils/index.d.ts +0 -0
  491. /package/dist/{mjs → esm}/utils/index.js +0 -0
  492. /package/dist/{mjs → esm}/utils/index.js.map +0 -0
  493. /package/dist/{mjs → esm}/utils/number.d.ts +0 -0
  494. /package/dist/{mjs → esm}/utils/number.js +0 -0
  495. /package/dist/{mjs → esm}/utils/number.js.map +0 -0
  496. /package/dist/{mjs → esm}/utils/utils.d.ts +0 -0
  497. /package/dist/{mjs → esm}/utils/utils.js +0 -0
  498. /package/dist/{mjs → esm}/utils/utils.js.map +0 -0
@@ -0,0 +1,877 @@
1
+ import { AVLTreeCounter, AVLTreeCounterNode, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
2
+ import { isDebugTest } from '../../../config';
3
+
4
+ const isDebug = isDebugTest;
5
+
6
+ describe('AVLTreeCounter count', () => {
7
+ let avlCounter: AVLTreeCounter<number>;
8
+ beforeEach(() => {
9
+ avlCounter = new AVLTreeCounter<number>();
10
+ });
11
+ it('Should added isolated node count ', () => {
12
+ avlCounter.addMany([
13
+ [1, 1],
14
+ [2, 2],
15
+ [3, 3],
16
+ [4, 4],
17
+ [5, 5]
18
+ ]);
19
+ const newNode = new AVLTreeCounterNode(3, 33, 10);
20
+ avlCounter.add(newNode);
21
+ expect(avlCounter.count).toBe(15);
22
+ });
23
+
24
+ it('Should count', () => {
25
+ avlCounter.addMany([
26
+ [1, 1],
27
+ [2, 2],
28
+ [3, 3]
29
+ ]);
30
+ avlCounter.add([2, 2], undefined, 10);
31
+ avlCounter.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
32
+ avlCounter.delete(2);
33
+ expect(avlCounter.count).toBe(12);
34
+ expect(avlCounter.getComputedCount()).toBe(16);
35
+ });
36
+ });
37
+
38
+ describe('AVLTreeCounter operations test1', () => {
39
+ it('should perform various operations on a AVLTreeCounter with numeric values1', () => {
40
+ const avlCounter = new AVLTreeCounter<number>();
41
+
42
+ expect(avlCounter instanceof AVLTreeCounter);
43
+ avlCounter.add([11, 11]);
44
+ avlCounter.add([3, 3]);
45
+ const idAndValues: [number, number][] = [
46
+ [11, 11],
47
+ [3, 3],
48
+ [15, 15],
49
+ [1, 1],
50
+ [8, 8],
51
+ [13, 13],
52
+ [16, 16],
53
+ [2, 2],
54
+ [6, 6],
55
+ [9, 9],
56
+ [12, 12],
57
+ [14, 14],
58
+ [4, 4],
59
+ [7, 7],
60
+ [10, 10],
61
+ [5, 5]
62
+ ];
63
+ avlCounter.addMany(idAndValues);
64
+ expect(avlCounter.root instanceof AVLTreeCounterNode);
65
+
66
+ if (avlCounter.root) expect(avlCounter.root.key == 11);
67
+
68
+ expect(avlCounter.size).toBe(16);
69
+ expect(avlCounter.count).toBe(18);
70
+
71
+ expect(avlCounter.has(6));
72
+
73
+ expect(avlCounter.getHeight(6)).toBe(4);
74
+ expect(avlCounter.getDepth(6)).toBe(0);
75
+ const nodeId10 = avlCounter.getNode(10);
76
+ expect(nodeId10?.key).toBe(10);
77
+
78
+ const nodeVal9 = avlCounter.getNode(node => node.key === 9);
79
+ expect(nodeVal9?.key).toBe(9);
80
+
81
+ const nodesByCount1 = avlCounter.getNodes(node => node.count === 1);
82
+ expect(nodesByCount1.length).toBe(14);
83
+
84
+ const nodesByCount2 = avlCounter.getNodes(node => node.count === 2);
85
+ expect(nodesByCount2.length).toBe(2);
86
+ const leftMost = avlCounter.getLeftMost();
87
+ expect(leftMost).toBe(1);
88
+
89
+ const node15 = avlCounter.getNode(15);
90
+ const minNodeBySpecificNode = node15 && avlCounter.getLeftMost(node => node, node15);
91
+ expect(minNodeBySpecificNode?.key).toBe(15);
92
+
93
+ let subTreeSum = 0;
94
+ if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
95
+ expect(subTreeSum).toBe(31);
96
+ let lesserSum = 0;
97
+ avlCounter.lesserOrGreaterTraverse((node: AVLTreeCounterNode<number>) => (lesserSum += node.key), -1, 10);
98
+ expect(lesserSum).toBe(45);
99
+
100
+ expect(node15 instanceof AVLTreeCounterNode);
101
+ if (node15 instanceof AVLTreeCounterNode) {
102
+ const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', 15);
103
+ expect(subTreeAdd);
104
+ }
105
+ const node11 = avlCounter.getNode(11);
106
+ expect(node11 instanceof AVLTreeCounterNode);
107
+ if (node11 instanceof AVLTreeCounterNode) {
108
+ const allGreaterNodesAdded = avlCounter.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
109
+ expect(allGreaterNodesAdded);
110
+ }
111
+
112
+ const dfsInorderNodes = avlCounter.dfs(node => node, 'IN');
113
+ expect(dfsInorderNodes[0].key).toBe(1);
114
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
115
+ expect(avlCounter.isPerfectlyBalanced()).toBe(false);
116
+
117
+ avlCounter.perfectlyBalance();
118
+
119
+ expect(avlCounter.isPerfectlyBalanced()).toBe(true);
120
+ expect(avlCounter.isAVLBalanced()).toBe(true);
121
+
122
+ const bfsNodesAfterBalanced = avlCounter.bfs(node => node);
123
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
124
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
125
+
126
+ const removed11 = avlCounter.delete(11, true);
127
+ expect(removed11 instanceof Array);
128
+ expect(removed11[0]);
129
+ expect(removed11[0].deleted);
130
+
131
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
132
+
133
+ expect(avlCounter.isAVLBalanced()).toBe(true);
134
+
135
+ expect(avlCounter.getHeight(15)).toBe(1);
136
+
137
+ const removed1 = avlCounter.delete(1, true);
138
+ expect(removed1 instanceof Array);
139
+ expect(removed1[0]);
140
+ expect(removed1[0].deleted);
141
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
142
+
143
+ expect(avlCounter.isAVLBalanced()).toBe(true);
144
+
145
+ expect(avlCounter.getHeight()).toBe(4);
146
+
147
+ const removed4 = avlCounter.delete(4, true);
148
+ expect(removed4 instanceof Array);
149
+ expect(removed4[0]);
150
+ expect(removed4[0].deleted);
151
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
152
+
153
+ expect(avlCounter.isAVLBalanced()).toBe(true);
154
+ expect(avlCounter.getHeight()).toBe(4);
155
+
156
+ const removed10 = avlCounter.delete(10, true);
157
+ expect(removed10 instanceof Array);
158
+ expect(removed10[0]);
159
+ expect(removed10[0].deleted);
160
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
161
+ expect(avlCounter.isAVLBalanced()).toBe(true);
162
+
163
+ expect(avlCounter.getHeight()).toBe(3);
164
+
165
+ const removed15 = avlCounter.delete(15, true);
166
+ expect(removed15 instanceof Array);
167
+ expect(removed15[0]);
168
+ expect(removed15[0].deleted);
169
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
170
+
171
+ expect(avlCounter.isAVLBalanced()).toBe(true);
172
+ expect(avlCounter.getHeight()).toBe(3);
173
+
174
+ const removed5 = avlCounter.delete(5, true);
175
+ expect(removed5 instanceof Array);
176
+ expect(removed5[0]);
177
+ expect(removed5[0].deleted);
178
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
179
+
180
+ expect(avlCounter.isAVLBalanced()).toBe(true);
181
+ expect(avlCounter.getHeight()).toBe(3);
182
+
183
+ const removed13 = avlCounter.delete(13, true);
184
+ expect(removed13 instanceof Array);
185
+ expect(removed13[0]);
186
+ expect(removed13[0].deleted);
187
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
188
+ expect(avlCounter.isAVLBalanced()).toBe(true);
189
+ expect(avlCounter.getHeight()).toBe(3);
190
+
191
+ const removed3 = avlCounter.delete(3, true);
192
+ expect(removed3 instanceof Array);
193
+ expect(removed3[0]);
194
+ expect(removed3[0].deleted);
195
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
196
+ expect(avlCounter.isAVLBalanced()).toBe(true);
197
+ expect(avlCounter.getHeight()).toBe(3);
198
+
199
+ const removed8 = avlCounter.delete(8, true);
200
+ expect(removed8 instanceof Array);
201
+ expect(removed8[0]);
202
+ expect(removed8[0].deleted);
203
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
204
+ expect(avlCounter.isAVLBalanced()).toBe(true);
205
+ expect(avlCounter.getHeight()).toBe(3);
206
+
207
+ const removed6 = avlCounter.delete(6, true);
208
+ expect(removed6 instanceof Array);
209
+ expect(removed6[0]);
210
+ expect(removed6[0].deleted);
211
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
212
+ expect(avlCounter.delete(6, true).length).toBe(0);
213
+ expect(avlCounter.isAVLBalanced()).toBe(true);
214
+
215
+ expect(avlCounter.getHeight()).toBe(2);
216
+
217
+ const removed7 = avlCounter.delete(7, true);
218
+ expect(removed7 instanceof Array);
219
+ expect(removed7[0]);
220
+ expect(removed7[0].deleted);
221
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
222
+ expect(avlCounter.isAVLBalanced()).toBe(true);
223
+ expect(avlCounter.getHeight()).toBe(2);
224
+
225
+ const removed9 = avlCounter.delete(9, true);
226
+ expect(removed9 instanceof Array);
227
+ expect(removed9[0]);
228
+ expect(removed9[0].deleted);
229
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
230
+ expect(avlCounter.isAVLBalanced()).toBe(true);
231
+ expect(avlCounter.getHeight()).toBe(2);
232
+
233
+ const removed14 = avlCounter.delete(14, true);
234
+ expect(removed14 instanceof Array);
235
+ expect(removed14[0]);
236
+ expect(removed14[0].deleted);
237
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
238
+ expect(avlCounter.isAVLBalanced()).toBe(true);
239
+ expect(avlCounter.getHeight()).toBe(1);
240
+
241
+ expect(avlCounter.isAVLBalanced()).toBe(true);
242
+
243
+ const bfsIDs = avlCounter.bfs(node => node.key);
244
+
245
+ expect(bfsIDs[0]).toBe(12);
246
+ expect(bfsIDs[1]).toBe(2);
247
+ expect(bfsIDs[2]).toBe(16);
248
+
249
+ const bfsNodes = avlCounter.bfs(node => node);
250
+
251
+ expect(bfsNodes[0].key).toBe(12);
252
+ expect(bfsNodes[1].key).toBe(2);
253
+ expect(bfsNodes[2].key).toBe(16);
254
+
255
+ expect(avlCounter.count).toBe(8);
256
+ });
257
+
258
+ it('should perform various operations on a AVLTreeCounter with object values', () => {
259
+ const objAvlCounter = new AVLTreeCounter<number, { key: number; keyA: number }>();
260
+ expect(objAvlCounter).toBeInstanceOf(AVLTreeCounter);
261
+ objAvlCounter.add([11, { key: 11, keyA: 11 }]);
262
+ objAvlCounter.add([3, { key: 3, keyA: 3 }]);
263
+ const values: [number, { key: number; keyA: number }][] = [
264
+ [15, { key: 15, keyA: 15 }],
265
+ [1, { key: 1, keyA: 1 }],
266
+ [8, { key: 8, keyA: 8 }],
267
+ [13, { key: 13, keyA: 13 }],
268
+ [16, { key: 16, keyA: 16 }],
269
+ [2, { key: 2, keyA: 2 }],
270
+ [6, { key: 6, keyA: 6 }],
271
+ [9, { key: 9, keyA: 9 }],
272
+ [12, { key: 12, keyA: 12 }],
273
+ [14, { key: 14, keyA: 14 }],
274
+ [4, { key: 4, keyA: 4 }],
275
+ [7, { key: 7, keyA: 7 }],
276
+ [10, { key: 10, keyA: 10 }],
277
+ [5, { key: 5, keyA: 5 }]
278
+ ];
279
+
280
+ objAvlCounter.addMany(values);
281
+
282
+ expect(objAvlCounter.root).toBeInstanceOf(AVLTreeCounterNode);
283
+
284
+ if (objAvlCounter.root) expect(objAvlCounter.root.key).toBe(6);
285
+
286
+ expect(objAvlCounter.count).toBe(16);
287
+
288
+ expect(objAvlCounter.has(6)).toBe(true);
289
+ });
290
+ });
291
+
292
+ describe('AVLTreeCounter operations test recursively1', () => {
293
+ it('should perform various operations on a AVLTreeCounter with numeric values1', () => {
294
+ const avlCounter = new AVLTreeCounter<number>([], {
295
+ iterationType: 'RECURSIVE'
296
+ });
297
+
298
+ expect(avlCounter instanceof AVLTreeCounter);
299
+ avlCounter.add([11, 11]);
300
+ avlCounter.add([3, 3]);
301
+ const idAndValues: [number, number][] = [
302
+ [11, 11],
303
+ [3, 3],
304
+ [15, 15],
305
+ [1, 1],
306
+ [8, 8],
307
+ [13, 13],
308
+ [16, 16],
309
+ [2, 2],
310
+ [6, 6],
311
+ [9, 9],
312
+ [12, 12],
313
+ [14, 14],
314
+ [4, 4],
315
+ [7, 7],
316
+ [10, 10],
317
+ [5, 5]
318
+ ];
319
+ avlCounter.addMany(idAndValues);
320
+ expect(avlCounter.root).toBeInstanceOf(AVLTreeCounterNode);
321
+
322
+ if (avlCounter.root) expect(avlCounter.root.key).toBe(6);
323
+
324
+ expect(avlCounter.size).toBe(16);
325
+ expect(avlCounter.count).toBe(18);
326
+
327
+ expect(avlCounter.has(6));
328
+
329
+ expect(avlCounter.getHeight(6)).toBe(4);
330
+ expect(avlCounter.getDepth(6)).toBe(0);
331
+ const nodeId10 = avlCounter.getNode(10);
332
+ expect(nodeId10?.key).toBe(10);
333
+
334
+ const nodeVal9 = avlCounter.getNode(node => node.key === 9);
335
+ expect(nodeVal9?.key).toBe(9);
336
+
337
+ const nodesByCount1 = avlCounter.getNodes(node => node.count === 1);
338
+ expect(nodesByCount1.length).toBe(14);
339
+
340
+ const nodesByCount2 = avlCounter.getNodes(node => node.count === 2);
341
+ expect(nodesByCount2.length).toBe(2);
342
+ const leftMost = avlCounter.getLeftMost();
343
+ expect(leftMost).toBe(1);
344
+
345
+ const node15 = avlCounter.getNode(15);
346
+ const minNodeBySpecificNode = node15 && avlCounter.getLeftMost(node => node, node15);
347
+ expect(minNodeBySpecificNode?.key).toBe(15);
348
+
349
+ let subTreeSum = 0;
350
+ if (node15) avlCounter.dfs(node => (subTreeSum += node.key), 'PRE', 15);
351
+ expect(subTreeSum).toBe(31);
352
+ let lesserSum = 0;
353
+ avlCounter.lesserOrGreaterTraverse((node: AVLTreeCounterNode<number>) => (lesserSum += node.key), -1, 10);
354
+ expect(lesserSum).toBe(45);
355
+
356
+ expect(node15 instanceof AVLTreeCounterNode);
357
+ if (node15 instanceof AVLTreeCounterNode) {
358
+ const subTreeAdd = avlCounter.dfs(node => (node.count += 1), 'PRE', 15);
359
+ expect(subTreeAdd);
360
+ }
361
+ const node11 = avlCounter.getNode(11);
362
+ expect(node11 instanceof AVLTreeCounterNode);
363
+ if (node11 instanceof AVLTreeCounterNode) {
364
+ const allGreaterNodesAdded = avlCounter.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
365
+ expect(allGreaterNodesAdded);
366
+ }
367
+
368
+ const dfsInorderNodes = avlCounter.dfs(node => node, 'IN');
369
+ expect(dfsInorderNodes[0].key).toBe(1);
370
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
371
+ expect(avlCounter.isPerfectlyBalanced()).toBe(true);
372
+
373
+ avlCounter.perfectlyBalance();
374
+
375
+ expect(avlCounter.isPerfectlyBalanced()).toBe(true);
376
+ expect(avlCounter.isAVLBalanced()).toBe(true);
377
+
378
+ const bfsNodesAfterBalanced = avlCounter.bfs(node => node);
379
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
380
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
381
+
382
+ const removed11 = avlCounter.delete(11, true);
383
+ expect(removed11 instanceof Array);
384
+ expect(removed11[0]);
385
+ expect(removed11[0].deleted);
386
+
387
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
388
+
389
+ expect(avlCounter.isAVLBalanced()).toBe(true);
390
+
391
+ expect(avlCounter.getHeight(15)).toBe(1);
392
+
393
+ const removed1 = avlCounter.delete(1, true);
394
+ expect(removed1 instanceof Array);
395
+ expect(removed1[0]);
396
+ expect(removed1[0].deleted);
397
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
398
+
399
+ expect(avlCounter.isAVLBalanced()).toBe(true);
400
+
401
+ expect(avlCounter.getHeight()).toBe(4);
402
+
403
+ const removed4 = avlCounter.delete(4, true);
404
+ expect(removed4 instanceof Array);
405
+ expect(removed4[0]);
406
+ expect(removed4[0].deleted);
407
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
408
+
409
+ expect(avlCounter.isAVLBalanced()).toBe(true);
410
+ expect(avlCounter.getHeight()).toBe(4);
411
+
412
+ const removed10 = avlCounter.delete(10, true);
413
+ expect(removed10 instanceof Array);
414
+ expect(removed10[0]);
415
+ expect(removed10[0].deleted);
416
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
417
+ expect(avlCounter.isAVLBalanced()).toBe(true);
418
+
419
+ expect(avlCounter.getHeight()).toBe(3);
420
+
421
+ const removed15 = avlCounter.delete(15, true);
422
+ expect(removed15 instanceof Array);
423
+ expect(removed15[0]);
424
+ expect(removed15[0].deleted);
425
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
426
+
427
+ expect(avlCounter.isAVLBalanced()).toBe(true);
428
+ expect(avlCounter.getHeight()).toBe(3);
429
+
430
+ const removed5 = avlCounter.delete(5, true);
431
+ expect(removed5 instanceof Array);
432
+ expect(removed5[0]);
433
+ expect(removed5[0].deleted);
434
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
435
+
436
+ expect(avlCounter.isAVLBalanced()).toBe(true);
437
+ expect(avlCounter.getHeight()).toBe(3);
438
+
439
+ const removed13 = avlCounter.delete(13, true);
440
+ expect(removed13 instanceof Array);
441
+ expect(removed13[0]);
442
+ expect(removed13[0].deleted);
443
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
444
+ expect(avlCounter.isAVLBalanced()).toBe(true);
445
+ expect(avlCounter.getHeight()).toBe(3);
446
+
447
+ const removed3 = avlCounter.delete(3, true);
448
+ expect(removed3 instanceof Array);
449
+ expect(removed3[0]);
450
+ expect(removed3[0].deleted);
451
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
452
+ expect(avlCounter.isAVLBalanced()).toBe(true);
453
+ expect(avlCounter.getHeight()).toBe(3);
454
+
455
+ const removed8 = avlCounter.delete(8, true);
456
+ expect(removed8 instanceof Array);
457
+ expect(removed8[0]);
458
+ expect(removed8[0].deleted);
459
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
460
+ expect(avlCounter.isAVLBalanced()).toBe(true);
461
+ expect(avlCounter.getHeight()).toBe(3);
462
+
463
+ const removed6 = avlCounter.delete(6, true);
464
+ expect(removed6 instanceof Array);
465
+ expect(removed6[0]);
466
+ expect(removed6[0].deleted);
467
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
468
+ expect(avlCounter.delete(6, true).length).toBe(0);
469
+ expect(avlCounter.isAVLBalanced()).toBe(true);
470
+
471
+ expect(avlCounter.getHeight()).toBe(2);
472
+
473
+ const removed7 = avlCounter.delete(7, true);
474
+ expect(removed7 instanceof Array);
475
+ expect(removed7[0]);
476
+ expect(removed7[0].deleted);
477
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
478
+ expect(avlCounter.isAVLBalanced()).toBe(true);
479
+ expect(avlCounter.getHeight()).toBe(2);
480
+
481
+ const removed9 = avlCounter.delete(9, true);
482
+ expect(removed9 instanceof Array);
483
+ expect(removed9[0]);
484
+ expect(removed9[0].deleted);
485
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
486
+ expect(avlCounter.isAVLBalanced()).toBe(true);
487
+ expect(avlCounter.getHeight()).toBe(2);
488
+
489
+ const removed14 = avlCounter.delete(14, true);
490
+ expect(removed14 instanceof Array);
491
+ expect(removed14[0]);
492
+ expect(removed14[0].deleted);
493
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
494
+ expect(avlCounter.isAVLBalanced()).toBe(true);
495
+ expect(avlCounter.getHeight()).toBe(1);
496
+
497
+ expect(avlCounter.isAVLBalanced()).toBe(true);
498
+
499
+ const bfsIDs = avlCounter.bfs(node => node.key);
500
+
501
+ expect(bfsIDs[0]).toBe(12);
502
+ expect(bfsIDs[1]).toBe(2);
503
+ expect(bfsIDs[2]).toBe(16);
504
+
505
+ const bfsNodes = avlCounter.bfs(node => node);
506
+
507
+ expect(bfsNodes[0].key).toBe(12);
508
+ expect(bfsNodes[1].key).toBe(2);
509
+ expect(bfsNodes[2].key).toBe(16);
510
+
511
+ expect(avlCounter.count).toBe(8);
512
+ });
513
+
514
+ it('should perform various operations on a AVLTreeCounter with object values', () => {
515
+ const objAvlCounter = new AVLTreeCounter<number, { key: number; keyA: number }>();
516
+ expect(objAvlCounter).toBeInstanceOf(AVLTreeCounter);
517
+ objAvlCounter.add([11, { key: 11, keyA: 11 }]);
518
+ objAvlCounter.add([3, { key: 3, keyA: 3 }]);
519
+ const values: [number, { key: number; keyA: number }][] = [
520
+ [15, { key: 15, keyA: 15 }],
521
+ [1, { key: 1, keyA: 1 }],
522
+ [8, { key: 8, keyA: 8 }],
523
+ [13, { key: 13, keyA: 13 }],
524
+ [16, { key: 16, keyA: 16 }],
525
+ [2, { key: 2, keyA: 2 }],
526
+ [6, { key: 6, keyA: 6 }],
527
+ [9, { key: 9, keyA: 9 }],
528
+ [12, { key: 12, keyA: 12 }],
529
+ [14, { key: 14, keyA: 14 }],
530
+ [4, { key: 4, keyA: 4 }],
531
+ [7, { key: 7, keyA: 7 }],
532
+ [10, { key: 10, keyA: 10 }],
533
+ [5, { key: 5, keyA: 5 }]
534
+ ];
535
+
536
+ objAvlCounter.addMany(values);
537
+
538
+ expect(objAvlCounter.root).toBeInstanceOf(AVLTreeCounterNode);
539
+
540
+ if (objAvlCounter.root) expect(objAvlCounter.root.key).toBe(6);
541
+
542
+ expect(objAvlCounter.count).toBe(16);
543
+
544
+ expect(objAvlCounter.has(6)).toBe(true);
545
+ });
546
+ });
547
+
548
+ describe('AVLTreeCounter Performance test', function () {
549
+ const avlCounter = new AVLTreeCounter<number, number>();
550
+ const inputSize = 100000; // Adjust input sizes as needed
551
+
552
+ beforeEach(() => {
553
+ avlCounter.clear();
554
+ });
555
+
556
+ it(`Observe the time consumption of AVLTreeCounter.dfs be good`, function () {
557
+ const startDFS = performance.now();
558
+ const dfs = avlCounter.dfs(node => node);
559
+ if (isDebug) console.log('---bfs', performance.now() - startDFS, dfs.length);
560
+ });
561
+
562
+ it('Should the time consumption of lesserOrGreaterTraverse fitting O(n log n)', function () {
563
+ const start = performance.now();
564
+ for (let i = 0; i < inputSize; i++) {
565
+ avlCounter.add(i);
566
+ }
567
+ if (isDebug) console.log('---add', performance.now() - start);
568
+ const startL = performance.now();
569
+ avlCounter.lesserOrGreaterTraverse(node => (node.count += 1), -1, inputSize / 2);
570
+ if (isDebug) console.log('---lesserOrGreaterTraverse', performance.now() - startL);
571
+ });
572
+
573
+ it('should the clone method', () => {
574
+ function checkTreeStructure(avlCounter: AVLTreeCounter<string, number>) {
575
+ expect(avlCounter.size).toBe(4);
576
+ expect(avlCounter.root?.key).toBe('2');
577
+ expect(avlCounter.root?.left?.key).toBe('1');
578
+ expect(avlCounter.root?.left?.left?.key).toBe(undefined);
579
+ expect(avlCounter.root?.left?.right?.key).toBe(undefined);
580
+ expect(avlCounter.root?.right?.key).toBe('4');
581
+ expect(avlCounter.root?.right?.left?.key).toBe(undefined);
582
+ expect(avlCounter.root?.right?.right?.key).toBe('5');
583
+ }
584
+
585
+ const avlCounter = new AVLTreeCounter<string, number>();
586
+ avlCounter.addMany([
587
+ ['2', 2],
588
+ ['4', 4],
589
+ ['5', 5],
590
+ ['3', 3],
591
+ ['1', 1]
592
+ ]);
593
+ expect(avlCounter.size).toBe(5);
594
+ expect(avlCounter.root?.key).toBe('2');
595
+ expect(avlCounter.root?.left?.key).toBe('1');
596
+ expect(avlCounter.root?.left?.left?.key).toBe(undefined);
597
+ expect(avlCounter.root?.left?.right?.key).toBe(undefined);
598
+ expect(avlCounter.root?.right?.key).toBe('4');
599
+ expect(avlCounter.root?.right?.left?.key).toBe('3');
600
+ expect(avlCounter.root?.right?.right?.key).toBe('5');
601
+ avlCounter.delete('3');
602
+ checkTreeStructure(avlCounter);
603
+ const cloned = avlCounter.clone();
604
+ checkTreeStructure(cloned);
605
+ cloned.delete('1');
606
+ expect(avlCounter.size).toBe(4);
607
+ expect(cloned.size).toBe(3);
608
+ });
609
+ });
610
+
611
+ describe('AVLTreeCounter iterative methods test', () => {
612
+ let avlCounter: AVLTreeCounter<number, string>;
613
+ beforeEach(() => {
614
+ avlCounter = new AVLTreeCounter<number, string>();
615
+ avlCounter.add(1, 'a', 10);
616
+ avlCounter.add([2, 'b'], undefined, 10);
617
+ avlCounter.add([3, 'c'], undefined, 1);
618
+ });
619
+
620
+ it('The node obtained by get Node should match the node type', () => {
621
+ const node3 = avlCounter.getNode(3);
622
+ expect(node3).toBeInstanceOf(BinaryTreeNode);
623
+ expect(node3).toBeInstanceOf(BSTNode);
624
+ expect(node3).toBeInstanceOf(AVLTreeNode);
625
+ });
626
+
627
+ it('forEach should iterate over all elements', () => {
628
+ const mockCallback = jest.fn();
629
+ avlCounter.forEach((key, value) => {
630
+ mockCallback(key, value);
631
+ });
632
+
633
+ expect(mockCallback.mock.calls.length).toBe(3);
634
+ expect(mockCallback.mock.calls[0]).toEqual([1, 'a']);
635
+ expect(mockCallback.mock.calls[1]).toEqual([2, 'b']);
636
+ expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
637
+ });
638
+
639
+ it('filter should return a new avlCounter with filtered elements', () => {
640
+ const filteredTree = avlCounter.filter(key => key > 1);
641
+ expect(filteredTree.size).toBe(2);
642
+ expect([...filteredTree]).toEqual([
643
+ [2, 'b'],
644
+ [3, 'c']
645
+ ]);
646
+ });
647
+
648
+ it('map should return a new avlCounter with modified elements', () => {
649
+ const avlCounterMapped = avlCounter.map((key, value) => [(key * 2).toString(), value]);
650
+ expect(avlCounterMapped.size).toBe(3);
651
+ expect([...avlCounterMapped]).toEqual([
652
+ ['2', 'a'],
653
+ ['4', 'b'],
654
+ ['6', 'c']
655
+ ]);
656
+ });
657
+
658
+ it('reduce should accumulate values', () => {
659
+ const sum = avlCounter.reduce((acc, value, key) => acc + key, 0);
660
+ expect(sum).toBe(6);
661
+ });
662
+
663
+ it('[Symbol.iterator] should provide an iterator', () => {
664
+ const entries = [];
665
+ for (const entry of avlCounter) {
666
+ entries.push(entry);
667
+ }
668
+
669
+ expect(entries.length).toBe(3);
670
+ expect(entries).toEqual([
671
+ [1, 'a'],
672
+ [2, 'b'],
673
+ [3, 'c']
674
+ ]);
675
+ });
676
+
677
+ it('should clone work well', () => {
678
+ expect(avlCounter.count).toBe(21);
679
+ const cloned = avlCounter.clone();
680
+ expect(cloned.root?.left?.key).toBe(1);
681
+ expect(cloned.get(cloned.root?.right)).toBe('c');
682
+ });
683
+
684
+ it('should keys', () => {
685
+ const keys = avlCounter.keys();
686
+ expect([...keys]).toEqual([1, 2, 3]);
687
+ });
688
+
689
+ it('should values', () => {
690
+ const values = avlCounter.values();
691
+ expect([...values]).toEqual(['a', 'b', 'c']);
692
+ });
693
+ });
694
+
695
+ describe('AVLTreeCounter toEntryFn', () => {
696
+ it('should toEntryFn 1', () => {
697
+ const avlCounter = new AVLTreeCounter<number, number, { obj: { id: number } }>([], {
698
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
699
+ });
700
+ avlCounter.addMany([
701
+ { obj: { id: 1 } },
702
+ { obj: { id: 2 } },
703
+ { obj: { id: 3 } },
704
+ { obj: { id: 4 } },
705
+ { obj: { id: 5 } }
706
+ ]);
707
+
708
+ const expected = [1, 2, 3, 4, 5];
709
+
710
+ expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
711
+ expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
712
+ expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
713
+ });
714
+
715
+ it('should toEntryFn 2', () => {
716
+ const avlCounter = new AVLTreeCounter<number, number, { obj: { id: number } }>(
717
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
718
+ {
719
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
720
+ }
721
+ );
722
+
723
+ const expected = [1, 2, 3, 4, 5];
724
+
725
+ expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
726
+ expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
727
+ expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
728
+ });
729
+
730
+ it('should toEntryFn throw error', () => {
731
+ expect(
732
+ () =>
733
+ new AVLTreeCounter<{ obj: { id: number } }, number>([
734
+ { obj: { id: 1 } },
735
+ { obj: { id: 2 } },
736
+ { obj: { id: 3 } },
737
+ { obj: { id: 4 } },
738
+ { obj: { id: 5 } }
739
+ ])
740
+ ).toThrowError(
741
+ `When comparing object types, a custom specifyComparable must be defined in the constructor's options parameter.`
742
+ );
743
+ });
744
+
745
+ it('should toEntryFn 3', () => {
746
+ const avlCounter = new AVLTreeCounter<{ obj: { id: number } }, number>(
747
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
748
+ {
749
+ specifyComparable: key => key.obj.id
750
+ }
751
+ );
752
+
753
+ const expected = [
754
+ { obj: { id: 1 } },
755
+ { obj: { id: 2 } },
756
+ { obj: { id: 3 } },
757
+ { obj: { id: 4 } },
758
+ { obj: { id: 5 } }
759
+ ];
760
+
761
+ expect(avlCounter.morris(node => node.key, 'IN')).toEqual(expected);
762
+ expect(avlCounter.dfs(node => node.key, 'IN')).toEqual(expected);
763
+ expect(avlCounter.dfs(node => node.key, 'IN', avlCounter.root, 'RECURSIVE')).toEqual(expected);
764
+ });
765
+ });
766
+
767
+ describe('AVLTreeCounter not map mode count', () => {
768
+ let avlCounter: AVLTreeCounter<number>;
769
+ beforeEach(() => {
770
+ avlCounter = new AVLTreeCounter<number>([], { isMapMode: false });
771
+ });
772
+ it('Should added isolated node count ', () => {
773
+ avlCounter.addMany([
774
+ [1, 1],
775
+ [2, 2],
776
+ [3, 3],
777
+ [4, 4],
778
+ [5, 5]
779
+ ]);
780
+ const newNode = new AVLTreeCounterNode(3, undefined, 10);
781
+ avlCounter.add(newNode, 33);
782
+ expect(avlCounter.count).toBe(15);
783
+ });
784
+ });
785
+
786
+ describe('AVLTreeCounter not map mode operations test1', () => {
787
+ it('should perform various operations on a AVLTreeCounter with numeric values1', () => {
788
+ const avlCounter = new AVLTreeCounter<number>([], { isMapMode: false });
789
+
790
+ expect(avlCounter instanceof AVLTreeCounter);
791
+ avlCounter.add([11, 11]);
792
+ avlCounter.add([3, 3]);
793
+ const idAndValues: [number, number][] = [
794
+ [11, 11],
795
+ [3, 3],
796
+ [15, 15],
797
+ [1, 1],
798
+ [8, 8],
799
+ [13, 13],
800
+ [16, 16],
801
+ [2, 2],
802
+ [6, 6],
803
+ [9, 9],
804
+ [12, 12],
805
+ [14, 14],
806
+ [4, 4],
807
+ [7, 7],
808
+ [10, 10],
809
+ [5, 5]
810
+ ];
811
+ avlCounter.addMany(idAndValues);
812
+ expect(avlCounter.root instanceof AVLTreeCounterNode);
813
+
814
+ if (avlCounter.root) expect(avlCounter.root.key == 11);
815
+
816
+ expect(avlCounter.size).toBe(16);
817
+ expect(avlCounter.count).toBe(18);
818
+
819
+ expect(avlCounter.has(6));
820
+
821
+ expect(avlCounter.getHeight(6)).toBe(4);
822
+ expect(avlCounter.getDepth(6)).toBe(0);
823
+ const nodeId10 = avlCounter.getNode(10);
824
+ expect(nodeId10?.key).toBe(10);
825
+
826
+ const nodeVal9 = avlCounter.getNode(node => node.key === 9);
827
+ expect(nodeVal9?.key).toBe(9);
828
+ });
829
+ });
830
+
831
+ describe('AVLTreeCounter not map mode operations test recursively1', () => {
832
+ it('should perform various operations on a AVLTreeCounter with numeric values1', () => {
833
+ const avlCounter = new AVLTreeCounter<number>([], {
834
+ iterationType: 'RECURSIVE',
835
+ isMapMode: false
836
+ });
837
+
838
+ expect(avlCounter instanceof AVLTreeCounter);
839
+ avlCounter.add([11, 11]);
840
+ avlCounter.add([3, 3]);
841
+ const idAndValues: [number, number][] = [
842
+ [11, 11],
843
+ [3, 3],
844
+ [15, 15],
845
+ [1, 1],
846
+ [8, 8],
847
+ [13, 13],
848
+ [16, 16],
849
+ [2, 2],
850
+ [6, 6],
851
+ [9, 9],
852
+ [12, 12],
853
+ [14, 14],
854
+ [4, 4],
855
+ [7, 7],
856
+ [10, 10],
857
+ [5, 5]
858
+ ];
859
+ avlCounter.addMany(idAndValues);
860
+ expect(avlCounter.root).toBeInstanceOf(AVLTreeCounterNode);
861
+
862
+ if (avlCounter.root) expect(avlCounter.root.key).toBe(6);
863
+
864
+ expect(avlCounter.size).toBe(16);
865
+ expect(avlCounter.count).toBe(18);
866
+
867
+ expect(avlCounter.has(6));
868
+
869
+ expect(avlCounter.getHeight(6)).toBe(4);
870
+ expect(avlCounter.getDepth(6)).toBe(0);
871
+ const nodeId10 = avlCounter.getNode(10);
872
+ expect(nodeId10?.key).toBe(10);
873
+
874
+ const nodeVal9 = avlCounter.getNode(node => node.key === 9);
875
+ expect(nodeVal9?.key).toBe(9);
876
+ });
877
+ });