data-structure-typed 1.54.0 → 1.54.1

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