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