data-structure-typed 2.4.0 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (750) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +2 -3
  3. package/README_CN.md +0 -1
  4. package/dist/cjs/index.cjs +85 -30
  5. package/dist/cjs-legacy/index.cjs +85 -30
  6. package/dist/esm/index.mjs +85 -30
  7. package/dist/esm-legacy/index.mjs +85 -30
  8. package/dist/types/data-structures/binary-tree/tree-map.d.ts +17 -6
  9. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +13 -5
  10. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +12 -5
  11. package/dist/types/data-structures/binary-tree/tree-set.d.ts +15 -4
  12. package/dist/types/types/data-structures/binary-tree/tree-map.d.ts +6 -1
  13. package/dist/types/types/data-structures/binary-tree/tree-multi-set.d.ts +6 -1
  14. package/dist/types/types/data-structures/binary-tree/tree-set.d.ts +6 -1
  15. package/dist/umd/data-structure-typed.js +85 -29
  16. package/dist/umd/data-structure-typed.min.js +4 -4
  17. package/package.json +11 -5
  18. package/src/data-structures/binary-tree/tree-map.ts +35 -13
  19. package/src/data-structures/binary-tree/tree-multi-map.ts +41 -20
  20. package/src/data-structures/binary-tree/tree-multi-set.ts +17 -6
  21. package/src/data-structures/binary-tree/tree-set.ts +19 -6
  22. package/src/data-structures/trie/trie.ts +6 -8
  23. package/src/types/data-structures/binary-tree/tree-map.ts +7 -1
  24. package/src/types/data-structures/binary-tree/tree-multi-set.ts +7 -1
  25. package/src/types/data-structures/binary-tree/tree-set.ts +7 -1
  26. package/CMakeLists.txt +0 -52
  27. package/benchmark/report.html +0 -143
  28. package/benchmark/report.json +0 -1972
  29. package/build/CMakeCache.txt +0 -603
  30. package/build/CMakeFiles/4.0.3/CMakeCXXCompiler.cmake +0 -104
  31. package/build/CMakeFiles/4.0.3/CMakeDetermineCompilerABI_CXX.bin +0 -0
  32. package/build/CMakeFiles/4.0.3/CMakeSystem.cmake +0 -15
  33. package/build/CMakeFiles/4.0.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -920
  34. package/build/CMakeFiles/4.0.3/CompilerIdCXX/a.out +0 -0
  35. package/build/CMakeFiles/4.0.3/CompilerIdCXX/apple-sdk.cpp +0 -1
  36. package/build/CMakeFiles/CMakeConfigureLog.yaml +0 -2146
  37. package/build/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  38. package/build/CMakeFiles/InstallScripts.json +0 -9
  39. package/build/CMakeFiles/Makefile.cmake +0 -100
  40. package/build/CMakeFiles/Makefile2 +0 -720
  41. package/build/CMakeFiles/TargetDirectories.txt +0 -23
  42. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/DependInfo.cmake +0 -23
  43. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/build.make +0 -114
  44. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/cmake_clean.cmake +0 -11
  45. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.internal +0 -839
  46. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.make +0 -2506
  47. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.ts +0 -2
  48. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/depend.make +0 -2
  49. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/flags.make +0 -10
  50. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/link.txt +0 -1
  51. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/progress.make +0 -3
  52. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/test/performance/data-structures/binary-tree/avl-rb-range-search.test.cpp.o +0 -0
  53. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/test/performance/data-structures/binary-tree/avl-rb-range-search.test.cpp.o.d +0 -835
  54. package/build/CMakeFiles/avl-tree-benchmark.dir/DependInfo.cmake +0 -23
  55. package/build/CMakeFiles/avl-tree-benchmark.dir/build.make +0 -114
  56. package/build/CMakeFiles/avl-tree-benchmark.dir/cmake_clean.cmake +0 -11
  57. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.internal +0 -839
  58. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.make +0 -2506
  59. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.ts +0 -2
  60. package/build/CMakeFiles/avl-tree-benchmark.dir/depend.make +0 -2
  61. package/build/CMakeFiles/avl-tree-benchmark.dir/flags.make +0 -10
  62. package/build/CMakeFiles/avl-tree-benchmark.dir/link.txt +0 -1
  63. package/build/CMakeFiles/avl-tree-benchmark.dir/progress.make +0 -3
  64. package/build/CMakeFiles/avl-tree-benchmark.dir/test/performance/data-structures/binary-tree/avl-tree.test.cpp.o +0 -0
  65. package/build/CMakeFiles/avl-tree-benchmark.dir/test/performance/data-structures/binary-tree/avl-tree.test.cpp.o.d +0 -835
  66. package/build/CMakeFiles/cmake.check_cache +0 -1
  67. package/build/CMakeFiles/deque-benchmark.dir/DependInfo.cmake +0 -23
  68. package/build/CMakeFiles/deque-benchmark.dir/build.make +0 -114
  69. package/build/CMakeFiles/deque-benchmark.dir/cmake_clean.cmake +0 -11
  70. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.internal +0 -791
  71. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.make +0 -2362
  72. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.ts +0 -2
  73. package/build/CMakeFiles/deque-benchmark.dir/depend.make +0 -2
  74. package/build/CMakeFiles/deque-benchmark.dir/flags.make +0 -10
  75. package/build/CMakeFiles/deque-benchmark.dir/link.txt +0 -1
  76. package/build/CMakeFiles/deque-benchmark.dir/progress.make +0 -3
  77. package/build/CMakeFiles/deque-benchmark.dir/test/performance/data-structures/queue/deque.test.cpp.o +0 -0
  78. package/build/CMakeFiles/deque-benchmark.dir/test/performance/data-structures/queue/deque.test.cpp.o.d +0 -787
  79. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/DependInfo.cmake +0 -23
  80. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/build.make +0 -114
  81. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/cmake_clean.cmake +0 -11
  82. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.internal +0 -790
  83. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.make +0 -2359
  84. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.ts +0 -2
  85. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/depend.make +0 -2
  86. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/flags.make +0 -10
  87. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/link.txt +0 -1
  88. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/progress.make +0 -3
  89. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp.o +0 -0
  90. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp.o.d +0 -786
  91. package/build/CMakeFiles/hash-map-benchmark.dir/DependInfo.cmake +0 -23
  92. package/build/CMakeFiles/hash-map-benchmark.dir/build.make +0 -114
  93. package/build/CMakeFiles/hash-map-benchmark.dir/cmake_clean.cmake +0 -11
  94. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.internal +0 -790
  95. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.make +0 -2359
  96. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.ts +0 -2
  97. package/build/CMakeFiles/hash-map-benchmark.dir/depend.make +0 -2
  98. package/build/CMakeFiles/hash-map-benchmark.dir/flags.make +0 -10
  99. package/build/CMakeFiles/hash-map-benchmark.dir/link.txt +0 -1
  100. package/build/CMakeFiles/hash-map-benchmark.dir/progress.make +0 -3
  101. package/build/CMakeFiles/hash-map-benchmark.dir/test/performance/data-structures/hash/hash-map.test.cpp.o +0 -0
  102. package/build/CMakeFiles/hash-map-benchmark.dir/test/performance/data-structures/hash/hash-map.test.cpp.o.d +0 -786
  103. package/build/CMakeFiles/heap-benchmark.dir/DependInfo.cmake +0 -23
  104. package/build/CMakeFiles/heap-benchmark.dir/build.make +0 -114
  105. package/build/CMakeFiles/heap-benchmark.dir/cmake_clean.cmake +0 -11
  106. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.internal +0 -843
  107. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.make +0 -2518
  108. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.ts +0 -2
  109. package/build/CMakeFiles/heap-benchmark.dir/depend.make +0 -2
  110. package/build/CMakeFiles/heap-benchmark.dir/flags.make +0 -10
  111. package/build/CMakeFiles/heap-benchmark.dir/link.txt +0 -1
  112. package/build/CMakeFiles/heap-benchmark.dir/progress.make +0 -3
  113. package/build/CMakeFiles/heap-benchmark.dir/test/performance/data-structures/heap/heap.test.cpp.o +0 -0
  114. package/build/CMakeFiles/heap-benchmark.dir/test/performance/data-structures/heap/heap.test.cpp.o.d +0 -839
  115. package/build/CMakeFiles/priority-queue-benchmark.dir/DependInfo.cmake +0 -23
  116. package/build/CMakeFiles/priority-queue-benchmark.dir/build.make +0 -114
  117. package/build/CMakeFiles/priority-queue-benchmark.dir/cmake_clean.cmake +0 -11
  118. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.internal +0 -793
  119. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.make +0 -2368
  120. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.ts +0 -2
  121. package/build/CMakeFiles/priority-queue-benchmark.dir/depend.make +0 -2
  122. package/build/CMakeFiles/priority-queue-benchmark.dir/flags.make +0 -10
  123. package/build/CMakeFiles/priority-queue-benchmark.dir/link.txt +0 -1
  124. package/build/CMakeFiles/priority-queue-benchmark.dir/progress.make +0 -3
  125. package/build/CMakeFiles/priority-queue-benchmark.dir/test/performance/data-structures/priority-queue/priority-queue.test.cpp.o +0 -0
  126. package/build/CMakeFiles/priority-queue-benchmark.dir/test/performance/data-structures/priority-queue/priority-queue.test.cpp.o.d +0 -789
  127. package/build/CMakeFiles/progress.marks +0 -1
  128. package/build/CMakeFiles/queue-benchmark.dir/DependInfo.cmake +0 -23
  129. package/build/CMakeFiles/queue-benchmark.dir/build.make +0 -114
  130. package/build/CMakeFiles/queue-benchmark.dir/cmake_clean.cmake +0 -11
  131. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.internal +0 -793
  132. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.make +0 -2368
  133. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.ts +0 -2
  134. package/build/CMakeFiles/queue-benchmark.dir/depend.make +0 -2
  135. package/build/CMakeFiles/queue-benchmark.dir/flags.make +0 -10
  136. package/build/CMakeFiles/queue-benchmark.dir/link.txt +0 -1
  137. package/build/CMakeFiles/queue-benchmark.dir/progress.make +0 -3
  138. package/build/CMakeFiles/queue-benchmark.dir/test/performance/data-structures/queue/queue.test.cpp.o +0 -0
  139. package/build/CMakeFiles/queue-benchmark.dir/test/performance/data-structures/queue/queue.test.cpp.o.d +0 -789
  140. package/build/CMakeFiles/red-black-tree-benchmark.dir/DependInfo.cmake +0 -23
  141. package/build/CMakeFiles/red-black-tree-benchmark.dir/build.make +0 -114
  142. package/build/CMakeFiles/red-black-tree-benchmark.dir/cmake_clean.cmake +0 -11
  143. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.internal +0 -839
  144. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.make +0 -2506
  145. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.ts +0 -2
  146. package/build/CMakeFiles/red-black-tree-benchmark.dir/depend.make +0 -2
  147. package/build/CMakeFiles/red-black-tree-benchmark.dir/flags.make +0 -10
  148. package/build/CMakeFiles/red-black-tree-benchmark.dir/link.txt +0 -1
  149. package/build/CMakeFiles/red-black-tree-benchmark.dir/progress.make +0 -3
  150. package/build/CMakeFiles/red-black-tree-benchmark.dir/test/performance/data-structures/binary-tree/red-black-tree.test.cpp.o +0 -0
  151. package/build/CMakeFiles/red-black-tree-benchmark.dir/test/performance/data-structures/binary-tree/red-black-tree.test.cpp.o.d +0 -835
  152. package/build/CMakeFiles/singly-linked-list-benchmark.dir/DependInfo.cmake +0 -23
  153. package/build/CMakeFiles/singly-linked-list-benchmark.dir/build.make +0 -114
  154. package/build/CMakeFiles/singly-linked-list-benchmark.dir/cmake_clean.cmake +0 -11
  155. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.internal +0 -790
  156. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.make +0 -2359
  157. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.ts +0 -2
  158. package/build/CMakeFiles/singly-linked-list-benchmark.dir/depend.make +0 -2
  159. package/build/CMakeFiles/singly-linked-list-benchmark.dir/flags.make +0 -10
  160. package/build/CMakeFiles/singly-linked-list-benchmark.dir/link.txt +0 -1
  161. package/build/CMakeFiles/singly-linked-list-benchmark.dir/progress.make +0 -3
  162. package/build/CMakeFiles/singly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/singly-linked-list.test.cpp.o +0 -0
  163. package/build/CMakeFiles/singly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/singly-linked-list.test.cpp.o.d +0 -786
  164. package/build/CMakeFiles/stack-benchmark.dir/DependInfo.cmake +0 -23
  165. package/build/CMakeFiles/stack-benchmark.dir/build.make +0 -114
  166. package/build/CMakeFiles/stack-benchmark.dir/cmake_clean.cmake +0 -11
  167. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.internal +0 -793
  168. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.make +0 -2368
  169. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.ts +0 -2
  170. package/build/CMakeFiles/stack-benchmark.dir/depend.make +0 -2
  171. package/build/CMakeFiles/stack-benchmark.dir/flags.make +0 -10
  172. package/build/CMakeFiles/stack-benchmark.dir/link.txt +0 -1
  173. package/build/CMakeFiles/stack-benchmark.dir/progress.make +0 -3
  174. package/build/CMakeFiles/stack-benchmark.dir/test/performance/data-structures/stack/stack.test.cpp.o +0 -0
  175. package/build/CMakeFiles/stack-benchmark.dir/test/performance/data-structures/stack/stack.test.cpp.o.d +0 -789
  176. package/build/CMakeFiles/tree-map-benchmark.dir/DependInfo.cmake +0 -23
  177. package/build/CMakeFiles/tree-map-benchmark.dir/build.make +0 -114
  178. package/build/CMakeFiles/tree-map-benchmark.dir/cmake_clean.cmake +0 -11
  179. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.internal +0 -839
  180. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.make +0 -2506
  181. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.ts +0 -2
  182. package/build/CMakeFiles/tree-map-benchmark.dir/depend.make +0 -2
  183. package/build/CMakeFiles/tree-map-benchmark.dir/flags.make +0 -10
  184. package/build/CMakeFiles/tree-map-benchmark.dir/link.txt +0 -1
  185. package/build/CMakeFiles/tree-map-benchmark.dir/progress.make +0 -3
  186. package/build/CMakeFiles/tree-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-map.test.cpp.o +0 -0
  187. package/build/CMakeFiles/tree-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-map.test.cpp.o.d +0 -835
  188. package/build/CMakeFiles/tree-multi-map-benchmark.dir/DependInfo.cmake +0 -23
  189. package/build/CMakeFiles/tree-multi-map-benchmark.dir/build.make +0 -114
  190. package/build/CMakeFiles/tree-multi-map-benchmark.dir/cmake_clean.cmake +0 -11
  191. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.internal +0 -839
  192. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.make +0 -2506
  193. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.ts +0 -2
  194. package/build/CMakeFiles/tree-multi-map-benchmark.dir/depend.make +0 -2
  195. package/build/CMakeFiles/tree-multi-map-benchmark.dir/flags.make +0 -10
  196. package/build/CMakeFiles/tree-multi-map-benchmark.dir/link.txt +0 -1
  197. package/build/CMakeFiles/tree-multi-map-benchmark.dir/progress.make +0 -3
  198. package/build/CMakeFiles/tree-multi-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp.o +0 -0
  199. package/build/CMakeFiles/tree-multi-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp.o.d +0 -835
  200. package/build/CMakeFiles/tree-multi-set-benchmark.dir/DependInfo.cmake +0 -23
  201. package/build/CMakeFiles/tree-multi-set-benchmark.dir/build.make +0 -114
  202. package/build/CMakeFiles/tree-multi-set-benchmark.dir/cmake_clean.cmake +0 -11
  203. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.internal +0 -839
  204. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.make +0 -2506
  205. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.ts +0 -2
  206. package/build/CMakeFiles/tree-multi-set-benchmark.dir/depend.make +0 -2
  207. package/build/CMakeFiles/tree-multi-set-benchmark.dir/flags.make +0 -10
  208. package/build/CMakeFiles/tree-multi-set-benchmark.dir/link.txt +0 -1
  209. package/build/CMakeFiles/tree-multi-set-benchmark.dir/progress.make +0 -3
  210. package/build/CMakeFiles/tree-multi-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp.o +0 -0
  211. package/build/CMakeFiles/tree-multi-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp.o.d +0 -835
  212. package/build/CMakeFiles/tree-set-benchmark.dir/DependInfo.cmake +0 -23
  213. package/build/CMakeFiles/tree-set-benchmark.dir/build.make +0 -114
  214. package/build/CMakeFiles/tree-set-benchmark.dir/cmake_clean.cmake +0 -11
  215. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.internal +0 -839
  216. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.make +0 -2506
  217. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.ts +0 -2
  218. package/build/CMakeFiles/tree-set-benchmark.dir/depend.make +0 -2
  219. package/build/CMakeFiles/tree-set-benchmark.dir/flags.make +0 -10
  220. package/build/CMakeFiles/tree-set-benchmark.dir/link.txt +0 -1
  221. package/build/CMakeFiles/tree-set-benchmark.dir/progress.make +0 -3
  222. package/build/CMakeFiles/tree-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-set.test.cpp.o +0 -0
  223. package/build/CMakeFiles/tree-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-set.test.cpp.o.d +0 -835
  224. package/build/Makefile +0 -783
  225. package/build/_deps/benchmark-build/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  226. package/build/_deps/benchmark-build/CMakeFiles/progress.marks +0 -1
  227. package/build/_deps/benchmark-build/Makefile +0 -140
  228. package/build/_deps/benchmark-build/benchmark.pc +0 -12
  229. package/build/_deps/benchmark-build/benchmarkConfig.cmake +0 -14
  230. package/build/_deps/benchmark-build/benchmarkConfigVersion.cmake +0 -65
  231. package/build/_deps/benchmark-build/benchmarkTargets.cmake +0 -84
  232. package/build/_deps/benchmark-build/cmake_install.cmake +0 -50
  233. package/build/_deps/benchmark-build/src/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  234. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/DependInfo.cmake +0 -41
  235. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark.cc.o +0 -0
  236. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark.cc.o.d +0 -875
  237. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_api_internal.cc.o +0 -0
  238. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_api_internal.cc.o.d +0 -802
  239. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_name.cc.o +0 -0
  240. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_name.cc.o.d +0 -772
  241. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o +0 -0
  242. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o.d +0 -841
  243. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_runner.cc.o +0 -0
  244. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_runner.cc.o.d +0 -833
  245. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/build.make +0 -402
  246. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/check.cc.o +0 -0
  247. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/check.cc.o.d +0 -784
  248. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/cmake_clean.cmake +0 -47
  249. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/cmake_clean_target.cmake +0 -3
  250. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/colorprint.cc.o +0 -0
  251. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/colorprint.cc.o.d +0 -791
  252. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/commandlineflags.cc.o +0 -0
  253. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/commandlineflags.cc.o.d +0 -795
  254. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.internal +0 -15519
  255. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.make +0 -17500
  256. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.ts +0 -2
  257. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/complexity.cc.o +0 -0
  258. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/complexity.cc.o.d +0 -793
  259. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/console_reporter.cc.o +0 -0
  260. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/console_reporter.cc.o.d +0 -802
  261. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/counter.cc.o +0 -0
  262. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/counter.cc.o.d +0 -773
  263. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/csv_reporter.cc.o +0 -0
  264. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/csv_reporter.cc.o.d +0 -799
  265. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/depend.make +0 -2
  266. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/flags.make +0 -10
  267. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/json_reporter.cc.o +0 -0
  268. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/json_reporter.cc.o.d +0 -800
  269. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/link.txt +0 -2
  270. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/perf_counters.cc.o +0 -0
  271. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/perf_counters.cc.o.d +0 -807
  272. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/progress.make +0 -21
  273. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/reporter.cc.o +0 -0
  274. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/reporter.cc.o.d +0 -798
  275. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/statistics.cc.o +0 -0
  276. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/statistics.cc.o.d +0 -800
  277. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/string_util.cc.o +0 -0
  278. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/string_util.cc.o.d +0 -795
  279. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/sysinfo.cc.o +0 -0
  280. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/sysinfo.cc.o.d +0 -933
  281. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/timers.cc.o +0 -0
  282. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/timers.cc.o.d +0 -904
  283. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/DependInfo.cmake +0 -23
  284. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/benchmark_main.cc.o +0 -0
  285. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/benchmark_main.cc.o.d +0 -772
  286. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/build.make +0 -114
  287. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/cmake_clean.cmake +0 -11
  288. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/cmake_clean_target.cmake +0 -3
  289. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.internal +0 -776
  290. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.make +0 -2317
  291. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.ts +0 -2
  292. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/depend.make +0 -2
  293. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/flags.make +0 -10
  294. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/link.txt +0 -2
  295. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/progress.make +0 -3
  296. package/build/_deps/benchmark-build/src/CMakeFiles/progress.marks +0 -1
  297. package/build/_deps/benchmark-build/src/Makefile +0 -710
  298. package/build/_deps/benchmark-build/src/cmake_install.cmake +0 -45
  299. package/build/_deps/benchmark-build/src/libbenchmark.a +0 -0
  300. package/build/_deps/benchmark-build/src/libbenchmark_main.a +0 -0
  301. package/build/_deps/benchmark-src/.clang-format +0 -5
  302. package/build/_deps/benchmark-src/.clang-tidy +0 -7
  303. package/build/_deps/benchmark-src/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  304. package/build/_deps/benchmark-src/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  305. package/build/_deps/benchmark-src/.github/install_bazel.sh +0 -13
  306. package/build/_deps/benchmark-src/.github/libcxx-setup.sh +0 -26
  307. package/build/_deps/benchmark-src/.github/workflows/bazel.yml +0 -35
  308. package/build/_deps/benchmark-src/.github/workflows/build-and-test-min-cmake.yml +0 -46
  309. package/build/_deps/benchmark-src/.github/workflows/build-and-test-perfcounters.yml +0 -51
  310. package/build/_deps/benchmark-src/.github/workflows/build-and-test.yml +0 -114
  311. package/build/_deps/benchmark-src/.github/workflows/clang-format-lint.yml +0 -17
  312. package/build/_deps/benchmark-src/.github/workflows/clang-tidy.yml +0 -38
  313. package/build/_deps/benchmark-src/.github/workflows/doxygen.yml +0 -28
  314. package/build/_deps/benchmark-src/.github/workflows/pylint.yml +0 -28
  315. package/build/_deps/benchmark-src/.github/workflows/sanitizer.yml +0 -96
  316. package/build/_deps/benchmark-src/.github/workflows/test_bindings.yml +0 -29
  317. package/build/_deps/benchmark-src/.github/workflows/wheels.yml +0 -79
  318. package/build/_deps/benchmark-src/.travis.yml +0 -208
  319. package/build/_deps/benchmark-src/.ycm_extra_conf.py +0 -115
  320. package/build/_deps/benchmark-src/AUTHORS +0 -71
  321. package/build/_deps/benchmark-src/BUILD.bazel +0 -87
  322. package/build/_deps/benchmark-src/CMakeLists.txt +0 -340
  323. package/build/_deps/benchmark-src/CONTRIBUTING.md +0 -58
  324. package/build/_deps/benchmark-src/CONTRIBUTORS +0 -95
  325. package/build/_deps/benchmark-src/LICENSE +0 -202
  326. package/build/_deps/benchmark-src/MODULE.bazel +0 -24
  327. package/build/_deps/benchmark-src/README.md +0 -223
  328. package/build/_deps/benchmark-src/WORKSPACE +0 -22
  329. package/build/_deps/benchmark-src/WORKSPACE.bzlmod +0 -2
  330. package/build/_deps/benchmark-src/_config.yml +0 -2
  331. package/build/_deps/benchmark-src/appveyor.yml +0 -50
  332. package/build/_deps/benchmark-src/bazel/benchmark_deps.bzl +0 -65
  333. package/build/_deps/benchmark-src/bindings/python/BUILD +0 -3
  334. package/build/_deps/benchmark-src/bindings/python/build_defs.bzl +0 -25
  335. package/build/_deps/benchmark-src/bindings/python/google_benchmark/BUILD +0 -40
  336. package/build/_deps/benchmark-src/bindings/python/google_benchmark/__init__.py +0 -162
  337. package/build/_deps/benchmark-src/bindings/python/google_benchmark/benchmark.cc +0 -184
  338. package/build/_deps/benchmark-src/bindings/python/google_benchmark/example.py +0 -136
  339. package/build/_deps/benchmark-src/bindings/python/nanobind.BUILD +0 -17
  340. package/build/_deps/benchmark-src/bindings/python/python_headers.BUILD +0 -6
  341. package/build/_deps/benchmark-src/cmake/AddCXXCompilerFlag.cmake +0 -78
  342. package/build/_deps/benchmark-src/cmake/CXXFeatureCheck.cmake +0 -82
  343. package/build/_deps/benchmark-src/cmake/Config.cmake.in +0 -7
  344. package/build/_deps/benchmark-src/cmake/GetGitVersion.cmake +0 -58
  345. package/build/_deps/benchmark-src/cmake/GoogleTest.cmake +0 -58
  346. package/build/_deps/benchmark-src/cmake/GoogleTest.cmake.in +0 -59
  347. package/build/_deps/benchmark-src/cmake/benchmark.pc.in +0 -12
  348. package/build/_deps/benchmark-src/cmake/gnu_posix_regex.cpp +0 -12
  349. package/build/_deps/benchmark-src/cmake/llvm-toolchain.cmake +0 -8
  350. package/build/_deps/benchmark-src/cmake/posix_regex.cpp +0 -14
  351. package/build/_deps/benchmark-src/cmake/pthread_affinity.cpp +0 -16
  352. package/build/_deps/benchmark-src/cmake/split_list.cmake +0 -3
  353. package/build/_deps/benchmark-src/cmake/std_regex.cpp +0 -10
  354. package/build/_deps/benchmark-src/cmake/steady_clock.cpp +0 -7
  355. package/build/_deps/benchmark-src/cmake/thread_safety_attributes.cpp +0 -4
  356. package/build/_deps/benchmark-src/docs/AssemblyTests.md +0 -149
  357. package/build/_deps/benchmark-src/docs/_config.yml +0 -3
  358. package/build/_deps/benchmark-src/docs/assets/images/icon.png +0 -0
  359. package/build/_deps/benchmark-src/docs/assets/images/icon.xcf +0 -0
  360. package/build/_deps/benchmark-src/docs/assets/images/icon_black.png +0 -0
  361. package/build/_deps/benchmark-src/docs/assets/images/icon_black.xcf +0 -0
  362. package/build/_deps/benchmark-src/docs/dependencies.md +0 -13
  363. package/build/_deps/benchmark-src/docs/index.md +0 -12
  364. package/build/_deps/benchmark-src/docs/perf_counters.md +0 -35
  365. package/build/_deps/benchmark-src/docs/platform_specific_build_instructions.md +0 -48
  366. package/build/_deps/benchmark-src/docs/python_bindings.md +0 -34
  367. package/build/_deps/benchmark-src/docs/random_interleaving.md +0 -13
  368. package/build/_deps/benchmark-src/docs/reducing_variance.md +0 -100
  369. package/build/_deps/benchmark-src/docs/releasing.md +0 -41
  370. package/build/_deps/benchmark-src/docs/tools.md +0 -343
  371. package/build/_deps/benchmark-src/docs/user_guide.md +0 -1266
  372. package/build/_deps/benchmark-src/include/benchmark/benchmark.h +0 -1991
  373. package/build/_deps/benchmark-src/include/benchmark/export.h +0 -47
  374. package/build/_deps/benchmark-src/pyproject.toml +0 -50
  375. package/build/_deps/benchmark-src/setup.py +0 -113
  376. package/build/_deps/benchmark-src/src/CMakeLists.txt +0 -170
  377. package/build/_deps/benchmark-src/src/arraysize.h +0 -33
  378. package/build/_deps/benchmark-src/src/benchmark.cc +0 -779
  379. package/build/_deps/benchmark-src/src/benchmark_api_internal.cc +0 -118
  380. package/build/_deps/benchmark-src/src/benchmark_api_internal.h +0 -87
  381. package/build/_deps/benchmark-src/src/benchmark_main.cc +0 -18
  382. package/build/_deps/benchmark-src/src/benchmark_name.cc +0 -59
  383. package/build/_deps/benchmark-src/src/benchmark_register.cc +0 -520
  384. package/build/_deps/benchmark-src/src/benchmark_register.h +0 -109
  385. package/build/_deps/benchmark-src/src/benchmark_runner.cc +0 -497
  386. package/build/_deps/benchmark-src/src/benchmark_runner.h +0 -131
  387. package/build/_deps/benchmark-src/src/check.cc +0 -11
  388. package/build/_deps/benchmark-src/src/check.h +0 -106
  389. package/build/_deps/benchmark-src/src/colorprint.cc +0 -200
  390. package/build/_deps/benchmark-src/src/colorprint.h +0 -33
  391. package/build/_deps/benchmark-src/src/commandlineflags.cc +0 -298
  392. package/build/_deps/benchmark-src/src/commandlineflags.h +0 -133
  393. package/build/_deps/benchmark-src/src/complexity.cc +0 -244
  394. package/build/_deps/benchmark-src/src/complexity.h +0 -55
  395. package/build/_deps/benchmark-src/src/console_reporter.cc +0 -206
  396. package/build/_deps/benchmark-src/src/counter.cc +0 -80
  397. package/build/_deps/benchmark-src/src/counter.h +0 -32
  398. package/build/_deps/benchmark-src/src/csv_reporter.cc +0 -161
  399. package/build/_deps/benchmark-src/src/cycleclock.h +0 -230
  400. package/build/_deps/benchmark-src/src/internal_macros.h +0 -115
  401. package/build/_deps/benchmark-src/src/json_reporter.cc +0 -320
  402. package/build/_deps/benchmark-src/src/log.h +0 -88
  403. package/build/_deps/benchmark-src/src/mutex.h +0 -155
  404. package/build/_deps/benchmark-src/src/perf_counters.cc +0 -282
  405. package/build/_deps/benchmark-src/src/perf_counters.h +0 -200
  406. package/build/_deps/benchmark-src/src/re.h +0 -158
  407. package/build/_deps/benchmark-src/src/reporter.cc +0 -118
  408. package/build/_deps/benchmark-src/src/statistics.cc +0 -209
  409. package/build/_deps/benchmark-src/src/statistics.h +0 -44
  410. package/build/_deps/benchmark-src/src/string_util.cc +0 -254
  411. package/build/_deps/benchmark-src/src/string_util.h +0 -70
  412. package/build/_deps/benchmark-src/src/sysinfo.cc +0 -855
  413. package/build/_deps/benchmark-src/src/thread_manager.h +0 -63
  414. package/build/_deps/benchmark-src/src/thread_timer.h +0 -86
  415. package/build/_deps/benchmark-src/src/timers.cc +0 -272
  416. package/build/_deps/benchmark-src/src/timers.h +0 -48
  417. package/build/_deps/benchmark-src/test/AssemblyTests.cmake +0 -67
  418. package/build/_deps/benchmark-src/test/BUILD +0 -127
  419. package/build/_deps/benchmark-src/test/CMakeLists.txt +0 -309
  420. package/build/_deps/benchmark-src/test/args_product_test.cc +0 -77
  421. package/build/_deps/benchmark-src/test/basic_test.cc +0 -180
  422. package/build/_deps/benchmark-src/test/benchmark_gtest.cc +0 -169
  423. package/build/_deps/benchmark-src/test/benchmark_min_time_flag_iters_test.cc +0 -66
  424. package/build/_deps/benchmark-src/test/benchmark_min_time_flag_time_test.cc +0 -90
  425. package/build/_deps/benchmark-src/test/benchmark_name_gtest.cc +0 -82
  426. package/build/_deps/benchmark-src/test/benchmark_random_interleaving_gtest.cc +0 -126
  427. package/build/_deps/benchmark-src/test/benchmark_setup_teardown_test.cc +0 -157
  428. package/build/_deps/benchmark-src/test/benchmark_test.cc +0 -274
  429. package/build/_deps/benchmark-src/test/clobber_memory_assembly_test.cc +0 -64
  430. package/build/_deps/benchmark-src/test/commandlineflags_gtest.cc +0 -228
  431. package/build/_deps/benchmark-src/test/complexity_test.cc +0 -228
  432. package/build/_deps/benchmark-src/test/cxx03_test.cc +0 -62
  433. package/build/_deps/benchmark-src/test/diagnostics_test.cc +0 -91
  434. package/build/_deps/benchmark-src/test/display_aggregates_only_test.cc +0 -45
  435. package/build/_deps/benchmark-src/test/donotoptimize_assembly_test.cc +0 -201
  436. package/build/_deps/benchmark-src/test/donotoptimize_test.cc +0 -69
  437. package/build/_deps/benchmark-src/test/filter_test.cc +0 -117
  438. package/build/_deps/benchmark-src/test/fixture_test.cc +0 -51
  439. package/build/_deps/benchmark-src/test/internal_threading_test.cc +0 -185
  440. package/build/_deps/benchmark-src/test/link_main_test.cc +0 -9
  441. package/build/_deps/benchmark-src/test/map_test.cc +0 -59
  442. package/build/_deps/benchmark-src/test/memory_manager_test.cc +0 -47
  443. package/build/_deps/benchmark-src/test/min_time_parse_gtest.cc +0 -30
  444. package/build/_deps/benchmark-src/test/multiple_ranges_test.cc +0 -96
  445. package/build/_deps/benchmark-src/test/options_test.cc +0 -77
  446. package/build/_deps/benchmark-src/test/output_test.h +0 -211
  447. package/build/_deps/benchmark-src/test/output_test_helper.cc +0 -519
  448. package/build/_deps/benchmark-src/test/perf_counters_gtest.cc +0 -307
  449. package/build/_deps/benchmark-src/test/perf_counters_test.cc +0 -92
  450. package/build/_deps/benchmark-src/test/register_benchmark_test.cc +0 -196
  451. package/build/_deps/benchmark-src/test/repetitions_test.cc +0 -214
  452. package/build/_deps/benchmark-src/test/report_aggregates_only_test.cc +0 -41
  453. package/build/_deps/benchmark-src/test/reporter_output_test.cc +0 -1130
  454. package/build/_deps/benchmark-src/test/skip_with_error_test.cc +0 -199
  455. package/build/_deps/benchmark-src/test/spec_arg_test.cc +0 -105
  456. package/build/_deps/benchmark-src/test/spec_arg_verbosity_test.cc +0 -43
  457. package/build/_deps/benchmark-src/test/state_assembly_test.cc +0 -68
  458. package/build/_deps/benchmark-src/test/statistics_gtest.cc +0 -35
  459. package/build/_deps/benchmark-src/test/string_util_gtest.cc +0 -199
  460. package/build/_deps/benchmark-src/test/templated_fixture_test.cc +0 -28
  461. package/build/_deps/benchmark-src/test/time_unit_gtest.cc +0 -37
  462. package/build/_deps/benchmark-src/test/user_counters_tabular_test.cc +0 -558
  463. package/build/_deps/benchmark-src/test/user_counters_test.cc +0 -561
  464. package/build/_deps/benchmark-src/test/user_counters_thousands_test.cc +0 -186
  465. package/build/_deps/benchmark-src/tools/BUILD.bazel +0 -19
  466. package/build/_deps/benchmark-src/tools/compare.py +0 -432
  467. package/build/_deps/benchmark-src/tools/gbench/Inputs/test1_run1.json +0 -127
  468. package/build/_deps/benchmark-src/tools/gbench/Inputs/test1_run2.json +0 -127
  469. package/build/_deps/benchmark-src/tools/gbench/Inputs/test2_run.json +0 -81
  470. package/build/_deps/benchmark-src/tools/gbench/Inputs/test3_run0.json +0 -65
  471. package/build/_deps/benchmark-src/tools/gbench/Inputs/test3_run1.json +0 -65
  472. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run.json +0 -96
  473. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run0.json +0 -21
  474. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run1.json +0 -21
  475. package/build/_deps/benchmark-src/tools/gbench/__init__.py +0 -8
  476. package/build/_deps/benchmark-src/tools/gbench/report.py +0 -1201
  477. package/build/_deps/benchmark-src/tools/gbench/util.py +0 -203
  478. package/build/_deps/benchmark-src/tools/libpfm.BUILD.bazel +0 -22
  479. package/build/_deps/benchmark-src/tools/requirements.txt +0 -2
  480. package/build/_deps/benchmark-src/tools/strip_asm.py +0 -151
  481. package/build/_deps/benchmark-subbuild/CMakeCache.txt +0 -133
  482. package/build/_deps/benchmark-subbuild/CMakeFiles/4.0.3/CMakeSystem.cmake +0 -15
  483. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeConfigureLog.yaml +0 -11
  484. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  485. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeRuleHashes.txt +0 -11
  486. package/build/_deps/benchmark-subbuild/CMakeFiles/InstallScripts.json +0 -7
  487. package/build/_deps/benchmark-subbuild/CMakeFiles/Makefile.cmake +0 -52
  488. package/build/_deps/benchmark-subbuild/CMakeFiles/Makefile2 +0 -122
  489. package/build/_deps/benchmark-subbuild/CMakeFiles/TargetDirectories.txt +0 -3
  490. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate-complete +0 -0
  491. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/DependInfo.cmake +0 -22
  492. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/Labels.json +0 -46
  493. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/Labels.txt +0 -14
  494. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/build.make +0 -162
  495. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/cmake_clean.cmake +0 -17
  496. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/compiler_depend.make +0 -2
  497. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/compiler_depend.ts +0 -2
  498. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/progress.make +0 -10
  499. package/build/_deps/benchmark-subbuild/CMakeFiles/cmake.check_cache +0 -1
  500. package/build/_deps/benchmark-subbuild/CMakeFiles/progress.marks +0 -1
  501. package/build/_deps/benchmark-subbuild/CMakeLists.txt +0 -42
  502. package/build/_deps/benchmark-subbuild/Makefile +0 -162
  503. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-build +0 -0
  504. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-configure +0 -0
  505. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-done +0 -0
  506. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-download +0 -0
  507. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-gitclone-lastrun.txt +0 -15
  508. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-gitinfo.txt +0 -15
  509. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-install +0 -0
  510. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-mkdir +0 -0
  511. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-patch +0 -0
  512. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-patch-info.txt +0 -6
  513. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-test +0 -0
  514. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-update-info.txt +0 -7
  515. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-cfgcmd.txt +0 -1
  516. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-gitclone.cmake +0 -87
  517. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-gitupdate.cmake +0 -317
  518. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-mkdirs.cmake +0 -27
  519. package/build/_deps/benchmark-subbuild/cmake_install.cmake +0 -56
  520. package/build/bin/avl-rb-range-search-benchmark +0 -0
  521. package/build/bin/avl-tree-benchmark +0 -0
  522. package/build/bin/deque-benchmark +0 -0
  523. package/build/bin/doubly-linked-list-benchmark +0 -0
  524. package/build/bin/hash-map-benchmark +0 -0
  525. package/build/bin/heap-benchmark +0 -0
  526. package/build/bin/priority-queue-benchmark +0 -0
  527. package/build/bin/queue-benchmark +0 -0
  528. package/build/bin/red-black-tree-benchmark +0 -0
  529. package/build/bin/singly-linked-list-benchmark +0 -0
  530. package/build/bin/stack-benchmark +0 -0
  531. package/build/bin/tree-map-benchmark +0 -0
  532. package/build/bin/tree-multi-map-benchmark +0 -0
  533. package/build/bin/tree-multi-set-benchmark +0 -0
  534. package/build/bin/tree-set-benchmark +0 -0
  535. package/build/cmake_install.cmake +0 -66
  536. package/dist/cjs/index.cjs.map +0 -1
  537. package/dist/cjs-legacy/index.cjs.map +0 -1
  538. package/dist/esm/index.mjs.map +0 -1
  539. package/dist/esm-legacy/index.mjs.map +0 -1
  540. package/dist/umd/data-structure-typed.js.map +0 -1
  541. package/dist/umd/data-structure-typed.min.js.map +0 -1
  542. package/eslint.config.mjs +0 -73
  543. package/test/config.ts +0 -4
  544. package/test/integration/all-in-one.test.ts +0 -110
  545. package/test/integration/avl-tree.test.ts +0 -127
  546. package/test/integration/bst.test.ts +0 -385
  547. package/test/integration/compile.test.mjs +0 -159
  548. package/test/integration/compile.test.ts +0 -176
  549. package/test/integration/heap.test.js +0 -21
  550. package/test/integration/index.html +0 -462
  551. package/test/performance/benchmark-runner-enhanced.mjs +0 -818
  552. package/test/performance/cmake-benchmark-runner.mjs +0 -234
  553. package/test/performance/data-structures/binary-tree/avl-rb-range-search.test.cpp +0 -112
  554. package/test/performance/data-structures/binary-tree/avl-rb-range-search.test.mjs +0 -51
  555. package/test/performance/data-structures/binary-tree/avl-tree.test.cpp +0 -181
  556. package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +0 -138
  557. package/test/performance/data-structures/binary-tree/binary-tree-overall.test.mjs +0 -85
  558. package/test/performance/data-structures/binary-tree/binary-tree.test.mjs +0 -100
  559. package/test/performance/data-structures/binary-tree/bst.test.mjs +0 -61
  560. package/test/performance/data-structures/binary-tree/red-black-tree-cjs.test.mjs +0 -259
  561. package/test/performance/data-structures/binary-tree/red-black-tree.test.cpp +0 -213
  562. package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +0 -275
  563. package/test/performance/data-structures/binary-tree/tree-map.test.cpp +0 -129
  564. package/test/performance/data-structures/binary-tree/tree-map.test.mjs +0 -171
  565. package/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp +0 -205
  566. package/test/performance/data-structures/binary-tree/tree-multi-map.test.mjs +0 -106
  567. package/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp +0 -217
  568. package/test/performance/data-structures/binary-tree/tree-multi-set.test.mjs +0 -91
  569. package/test/performance/data-structures/binary-tree/tree-set.test.cpp +0 -127
  570. package/test/performance/data-structures/binary-tree/tree-set.test.mjs +0 -174
  571. package/test/performance/data-structures/comparison/comparison.test.mjs +0 -99
  572. package/test/performance/data-structures/graph/directed-graph.test.mjs +0 -38
  573. package/test/performance/data-structures/hash/hash-map.test.cpp +0 -183
  574. package/test/performance/data-structures/hash/hash-map.test.mjs +0 -187
  575. package/test/performance/data-structures/heap/heap.test.cpp +0 -61
  576. package/test/performance/data-structures/heap/heap.test.mjs +0 -31
  577. package/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp +0 -84
  578. package/test/performance/data-structures/linked-list/doubly-linked-list.test.mjs +0 -125
  579. package/test/performance/data-structures/linked-list/singly-linked-list.test.cpp +0 -77
  580. package/test/performance/data-structures/linked-list/singly-linked-list.test.mjs +0 -84
  581. package/test/performance/data-structures/priority-queue/max-priority-queue.test.mjs +0 -40
  582. package/test/performance/data-structures/priority-queue/priority-queue.test.cpp +0 -59
  583. package/test/performance/data-structures/priority-queue/priority-queue.test.mjs +0 -64
  584. package/test/performance/data-structures/queue/deque.test.cpp +0 -119
  585. package/test/performance/data-structures/queue/deque.test.mjs +0 -144
  586. package/test/performance/data-structures/queue/queue.test.cpp +0 -59
  587. package/test/performance/data-structures/queue/queue.test.mjs +0 -77
  588. package/test/performance/data-structures/stack/stack.test.cpp +0 -40
  589. package/test/performance/data-structures/stack/stack.test.mjs +0 -69
  590. package/test/performance/data-structures/trie/trie.test.mjs +0 -43
  591. package/test/performance/reportor-enhanced.mjs +0 -871
  592. package/test/performance/runner-config.json +0 -51
  593. package/test/types/index.ts +0 -1
  594. package/test/types/utils/big-o.ts +0 -1
  595. package/test/types/utils/index.ts +0 -2
  596. package/test/types/utils/json2html.ts +0 -5
  597. package/test/unit/data-structures/base/iterable-element-base.coverage.test.ts +0 -106
  598. package/test/unit/data-structures/base/iterable-element-base.more-branches.coverage.test.ts +0 -61
  599. package/test/unit/data-structures/base/linear-base.array.coverage.test.ts +0 -168
  600. package/test/unit/data-structures/base/linear-base.concat-else.coverage.test.ts +0 -82
  601. package/test/unit/data-structures/base/linear-base.coverage.test.ts +0 -72
  602. package/test/unit/data-structures/base/linear-base.more-branches.coverage.test.ts +0 -414
  603. package/test/unit/data-structures/binary-tree/avl-tree-node.familyPosition-root-left.coverage.test.ts +0 -17
  604. package/test/unit/data-structures/binary-tree/avl-tree.more-branches-2.coverage.test.ts +0 -99
  605. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +0 -729
  606. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +0 -345
  607. package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts +0 -18
  608. package/test/unit/data-structures/binary-tree/binary-tree.more-branches.coverage.test.ts +0 -56
  609. package/test/unit/data-structures/binary-tree/binary-tree.remaining-branches.coverage.test.ts +0 -232
  610. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +0 -1912
  611. package/test/unit/data-structures/binary-tree/bst.bound-by-predicate.coverage.test.ts +0 -33
  612. package/test/unit/data-structures/binary-tree/bst.coverage.test.ts +0 -94
  613. package/test/unit/data-structures/binary-tree/bst.deletebykey.coverage.test.ts +0 -70
  614. package/test/unit/data-structures/binary-tree/bst.deletewhere.coverage.test.ts +0 -37
  615. package/test/unit/data-structures/binary-tree/bst.floor-lower-predicate.coverage.test.ts +0 -29
  616. package/test/unit/data-structures/binary-tree/bst.floor-setmany.coverage.test.ts +0 -72
  617. package/test/unit/data-structures/binary-tree/bst.getnode.range-ensure.coverage.test.ts +0 -22
  618. package/test/unit/data-structures/binary-tree/bst.misc-branches.coverage.test.ts +0 -100
  619. package/test/unit/data-structures/binary-tree/bst.more-branches-2.coverage.test.ts +0 -133
  620. package/test/unit/data-structures/binary-tree/bst.more-branches-3.coverage.test.ts +0 -45
  621. package/test/unit/data-structures/binary-tree/bst.more-branches-4.coverage.test.ts +0 -36
  622. package/test/unit/data-structures/binary-tree/bst.more-branches-5.coverage.test.ts +0 -40
  623. package/test/unit/data-structures/binary-tree/bst.more.coverage.test.ts +0 -39
  624. package/test/unit/data-structures/binary-tree/bst.node-family.coverage.test.ts +0 -29
  625. package/test/unit/data-structures/binary-tree/bst.range-pruning.coverage.test.ts +0 -43
  626. package/test/unit/data-structures/binary-tree/bst.search-fastpath.coverage.test.ts +0 -30
  627. package/test/unit/data-structures/binary-tree/bst.test.ts +0 -3472
  628. package/test/unit/data-structures/binary-tree/data/cost-of-living-by-country.ts +0 -259
  629. package/test/unit/data-structures/binary-tree/overall.test.ts +0 -219
  630. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-corruption-repair.coverage.test.ts +0 -66
  631. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-max-update.coverage.test.ts +0 -18
  632. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-null.coverage.test.ts +0 -53
  633. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-stale-cache.coverage.test.ts +0 -25
  634. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-update.coverage.test.ts +0 -23
  635. package/test/unit/data-structures/binary-tree/red-black-tree.cache-delete.coverage.test.ts +0 -49
  636. package/test/unit/data-structures/binary-tree/red-black-tree.cache-edge.coverage.test.ts +0 -37
  637. package/test/unit/data-structures/binary-tree/red-black-tree.cache-stale-insert.coverage.test.ts +0 -39
  638. package/test/unit/data-structures/binary-tree/red-black-tree.coverage.test.ts +0 -334
  639. package/test/unit/data-structures/binary-tree/red-black-tree.delete-fixup.coverage.test.ts +0 -68
  640. package/test/unit/data-structures/binary-tree/red-black-tree.delete-successor.coverage.test.ts +0 -75
  641. package/test/unit/data-structures/binary-tree/red-black-tree.factories.coverage.test.ts +0 -26
  642. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-compare-update.coverage.test.ts +0 -74
  643. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-no-update.coverage.test.ts +0 -44
  644. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-nullish.coverage.test.ts +0 -61
  645. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-defined.coverage.test.ts +0 -35
  646. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-undefined.coverage.test.ts +0 -43
  647. package/test/unit/data-structures/binary-tree/red-black-tree.hint-more.coverage.test.ts +0 -99
  648. package/test/unit/data-structures/binary-tree/red-black-tree.hint.coverage.test.ts +0 -60
  649. package/test/unit/data-structures/binary-tree/red-black-tree.insert-cache-nullish.coverage.test.ts +0 -29
  650. package/test/unit/data-structures/binary-tree/red-black-tree.insert-header-parent-nullish.coverage.test.ts +0 -17
  651. package/test/unit/data-structures/binary-tree/red-black-tree.internal-walk.coverage.test.ts +0 -57
  652. package/test/unit/data-structures/binary-tree/red-black-tree.minmax-cache.test.ts +0 -65
  653. package/test/unit/data-structures/binary-tree/red-black-tree.misc-inputs.coverage.test.ts +0 -17
  654. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-2.coverage.test.ts +0 -121
  655. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-3.coverage.test.ts +0 -55
  656. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-4.coverage.test.ts +0 -44
  657. package/test/unit/data-structures/binary-tree/red-black-tree.predsucc.coverage.test.ts +0 -40
  658. package/test/unit/data-structures/binary-tree/red-black-tree.remaining-branches.coverage.test.ts +0 -123
  659. package/test/unit/data-structures/binary-tree/red-black-tree.set-inputs.coverage.test.ts +0 -64
  660. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-parent-cache.coverage.test.ts +0 -79
  661. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-remaining.coverage.test.ts +0 -44
  662. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-uncovered.coverage.test.ts +0 -74
  663. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +0 -936
  664. package/test/unit/data-structures/binary-tree/red-black-tree.update-branches.coverage.test.ts +0 -30
  665. package/test/unit/data-structures/binary-tree/segment-tree.more-branches.coverage.test.ts +0 -31
  666. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +0 -104
  667. package/test/unit/data-structures/binary-tree/tree-map.test.ts +0 -270
  668. package/test/unit/data-structures/binary-tree/tree-multi-map.coverage.test.ts +0 -245
  669. package/test/unit/data-structures/binary-tree/tree-multi-map.legacy.test.ts.skip +0 -1115
  670. package/test/unit/data-structures/binary-tree/tree-multi-map.more-branches-2.coverage.test.ts.skip +0 -59
  671. package/test/unit/data-structures/binary-tree/tree-multi-map.rfc.test.ts +0 -99
  672. package/test/unit/data-structures/binary-tree/tree-multi-map.simplified.test.ts +0 -482
  673. package/test/unit/data-structures/binary-tree/tree-multi-set.test.ts +0 -545
  674. package/test/unit/data-structures/binary-tree/tree-set.test.ts +0 -187
  675. package/test/unit/data-structures/graph/abstract-graph.more-branches-2.coverage.test.ts +0 -40
  676. package/test/unit/data-structures/graph/abstract-graph.more-branches-3.coverage.test.ts +0 -65
  677. package/test/unit/data-structures/graph/abstract-graph.more-branches-4.coverage.test.ts +0 -98
  678. package/test/unit/data-structures/graph/abstract-graph.more-branches-5.coverage.test.ts +0 -51
  679. package/test/unit/data-structures/graph/abstract-graph.more-branches.coverage.test.ts +0 -62
  680. package/test/unit/data-structures/graph/abstract-graph.test.ts +0 -117
  681. package/test/unit/data-structures/graph/directed-graph.more-branches-2.coverage.test.ts +0 -38
  682. package/test/unit/data-structures/graph/directed-graph.more-branches-3.coverage.test.ts +0 -25
  683. package/test/unit/data-structures/graph/directed-graph.more-branches.coverage.test.ts +0 -82
  684. package/test/unit/data-structures/graph/directed-graph.test.ts +0 -1185
  685. package/test/unit/data-structures/graph/map-graph.more-branches.coverage.test.ts +0 -22
  686. package/test/unit/data-structures/graph/map-graph.test.ts +0 -148
  687. package/test/unit/data-structures/graph/overall.test.ts +0 -49
  688. package/test/unit/data-structures/graph/salty-edges.json +0 -875
  689. package/test/unit/data-structures/graph/salty-vertexes.json +0 -200
  690. package/test/unit/data-structures/graph/undirected-graph.more-branches-2.coverage.test.ts +0 -35
  691. package/test/unit/data-structures/graph/undirected-graph.more-branches.coverage.test.ts +0 -87
  692. package/test/unit/data-structures/graph/undirected-graph.test.ts +0 -782
  693. package/test/unit/data-structures/hash/hash-map.more-branches.coverage.test.ts +0 -64
  694. package/test/unit/data-structures/hash/hash-map.test.ts +0 -1125
  695. package/test/unit/data-structures/hash/hash-map.toEntryFn-branch.coverage.test.ts +0 -9
  696. package/test/unit/data-structures/heap/heap.misc-branches.coverage.test.ts +0 -110
  697. package/test/unit/data-structures/heap/heap.remaining-branches.coverage.test.ts +0 -22
  698. package/test/unit/data-structures/heap/heap.test.ts +0 -760
  699. package/test/unit/data-structures/heap/max-heap.coverage.test.ts +0 -29
  700. package/test/unit/data-structures/heap/max-heap.test.ts +0 -98
  701. package/test/unit/data-structures/heap/min-heap.test.ts +0 -117
  702. package/test/unit/data-structures/linked-list/doubly-linked-list.more-branches.coverage.test.ts +0 -72
  703. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +0 -1150
  704. package/test/unit/data-structures/linked-list/linked-list.test.ts +0 -8
  705. package/test/unit/data-structures/linked-list/linked-list.unshiftMany-else.coverage.test.ts +0 -15
  706. package/test/unit/data-structures/linked-list/singly-linked-list.coverage.test.ts +0 -221
  707. package/test/unit/data-structures/linked-list/singly-linked-list.more-branches.coverage.test.ts +0 -86
  708. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +0 -836
  709. package/test/unit/data-structures/linked-list/skip-linked-list.more-branches.coverage.test.ts +0 -31
  710. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +0 -13
  711. package/test/unit/data-structures/linked-list/skip-list.test.ts +0 -86
  712. package/test/unit/data-structures/matrix/matrix.more-branches.coverage.test.ts +0 -81
  713. package/test/unit/data-structures/matrix/matrix.pivotElement-nullish.coverage.test.ts +0 -28
  714. package/test/unit/data-structures/matrix/matrix.test.ts +0 -377
  715. package/test/unit/data-structures/matrix/navigator.test.ts +0 -244
  716. package/test/unit/data-structures/priority-queue/max-priority-queue.more-branches.coverage.test.ts +0 -10
  717. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +0 -160
  718. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +0 -78
  719. package/test/unit/data-structures/priority-queue/priority-queue.coverage.test.ts +0 -21
  720. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +0 -101
  721. package/test/unit/data-structures/queue/deque.coverage.test.ts +0 -173
  722. package/test/unit/data-structures/queue/deque.more-branches-2.coverage.test.ts +0 -39
  723. package/test/unit/data-structures/queue/deque.more-branches-3.coverage.test.ts +0 -9
  724. package/test/unit/data-structures/queue/deque.more-branches.coverage.test.ts +0 -95
  725. package/test/unit/data-structures/queue/deque.test.ts +0 -936
  726. package/test/unit/data-structures/queue/queue.coverage.test.ts +0 -138
  727. package/test/unit/data-structures/queue/queue.more-branches-2.coverage.test.ts +0 -27
  728. package/test/unit/data-structures/queue/queue.test.ts +0 -703
  729. package/test/unit/data-structures/stack/stack.coverage.test.ts +0 -112
  730. package/test/unit/data-structures/stack/stack.test.ts +0 -438
  731. package/test/unit/data-structures/tree/tree.more-branches.coverage.test.ts +0 -9
  732. package/test/unit/data-structures/tree/tree.test.ts +0 -58
  733. package/test/unit/data-structures/trie/trie.more-branches-2.coverage.test.ts +0 -51
  734. package/test/unit/data-structures/trie/trie.test.ts +0 -1181
  735. package/test/unit/unrestricted-interconversion.test.ts +0 -299
  736. package/test/unit/utils/utils.test.ts +0 -174
  737. package/test/utils/array.ts +0 -5517
  738. package/test/utils/big-o.ts +0 -228
  739. package/test/utils/console.ts +0 -31
  740. package/test/utils/index.ts +0 -8
  741. package/test/utils/is.ts +0 -56
  742. package/test/utils/json2html.ts +0 -164
  743. package/test/utils/number.ts +0 -13
  744. package/test/utils/patch.ts +0 -33
  745. package/test/utils/perf.mjs +0 -34
  746. package/test/utils/performanc.ts +0 -7
  747. package/test/utils/string.ts +0 -49
  748. package/tsconfig.types.json +0 -15
  749. package/tsup.config.js +0 -63
  750. package/tsup.umd.config.js +0 -29
@@ -1,1912 +0,0 @@
1
- import { BinaryTree, BinaryTreeNode, BTNEntry } from '../../../../src';
2
- import { getRandomIntArray } from '../../../utils';
3
- // import { isDebugTest } from '../../../config';
4
-
5
- // const isDebug = isDebugTest;
6
-
7
- describe('BinaryTreeNode', () => {
8
- it('should create an instance of BinaryTreeNode', () => {
9
- const node = new BinaryTreeNode<number>(1);
10
- expect(node).toBeInstanceOf(BinaryTreeNode);
11
- });
12
-
13
- it('should set and get the ID correctly', () => {
14
- const node = new BinaryTreeNode<number>(1);
15
- expect(node.key).toBe(1);
16
-
17
- node.key = 2;
18
- expect(node.key).toBe(2);
19
- });
20
-
21
- it('should set and get the value correctly', () => {
22
- const node: BinaryTreeNode<number> = new BinaryTreeNode<number>(1, 42);
23
- expect(node.key).toBe(1);
24
-
25
- expect(node.value).toBe(42);
26
-
27
- node.value = 55;
28
- expect(node.value).toBe(55);
29
- });
30
-
31
- it('should set and get the left child correctly', () => {
32
- const node1 = new BinaryTreeNode<number>(1);
33
- const node2 = new BinaryTreeNode<number>(2);
34
-
35
- node1.left = node2;
36
-
37
- expect(node1.left).toBe(node2);
38
- expect(node2.parent).toBe(node1);
39
- });
40
-
41
- it('should set and get the right child correctly', () => {
42
- const node1 = new BinaryTreeNode<number>(1);
43
- const node2 = new BinaryTreeNode<number>(2);
44
-
45
- node1.right = node2;
46
-
47
- expect(node1.right).toBe(node2);
48
- expect(node2.parent).toBe(node1);
49
- });
50
-
51
- it('should set and get the parent correctly', () => {
52
- const node1 = new BinaryTreeNode<number>(1);
53
- const node2 = new BinaryTreeNode<number>(2);
54
-
55
- node1.left = node2;
56
-
57
- expect(node2.parent).toBe(node1);
58
- expect(node1.left).toBe(node2);
59
- });
60
-
61
- it('should determine family position correctly', () => {
62
- const root = new BinaryTreeNode<number>(1);
63
- const leftChild = new BinaryTreeNode<number>(2);
64
- const rightChild = new BinaryTreeNode<number>(3);
65
-
66
- root.left = leftChild;
67
- root.right = rightChild;
68
-
69
- expect(leftChild.familyPosition).toBe('LEFT');
70
- leftChild.right = new BinaryTreeNode<number>(4);
71
- expect(rightChild.familyPosition).toBe('RIGHT');
72
- expect(root.familyPosition).toBe('ROOT');
73
- expect(leftChild.familyPosition).toBe('ROOT_LEFT');
74
- rightChild.left = new BinaryTreeNode<number>(5);
75
- expect(rightChild.familyPosition).toBe('ROOT_RIGHT');
76
- });
77
-
78
- it('should determine only right child family position correctly', () => {
79
- const root = new BinaryTreeNode<number>(1);
80
- const rightChild = new BinaryTreeNode<number>(3);
81
- const isolated = new BinaryTreeNode<number>(2);
82
-
83
- root.right = rightChild;
84
-
85
- expect(rightChild.familyPosition).toBe('RIGHT');
86
- expect(isolated.familyPosition).toBe('ISOLATED');
87
- expect(root.familyPosition).toBe('ROOT');
88
- });
89
- });
90
-
91
- describe('BinaryTree.addMany', () => {
92
- it('setMany(): adds entries via toEntryFn and values override', () => {
93
- const binTree = new BinaryTree<number, number, { id: number; name: number }>([], {
94
- toEntryFn: ({ id, name }) => [id, name]
95
- });
96
- binTree.setMany(
97
- [
98
- { id: 1, name: 1 },
99
- { id: 2, name: 2 },
100
- { id: 4, name: 4 },
101
- { id: 3, name: 3 }
102
- ],
103
- [undefined, 22, 44, 33]
104
- );
105
- expect(binTree.get(2)).toBe(22);
106
- expect(binTree.get(binTree.getNode(3))).toBe(33);
107
- expect(binTree.get(binTree.getNode(4))).toBe(44);
108
- expect(binTree.get(binTree.getNode(1))).toBe(1);
109
- });
110
-
111
- it('setMany(): handles undefined and null keys', () => {
112
- const binaryTree = new BinaryTree<number, string>();
113
- const addManyWithUndefined = binaryTree.setMany([1, undefined, 3]);
114
- expect(addManyWithUndefined).toEqual([true, false, true]);
115
- expect(binaryTree.get(undefined)).toBe(undefined);
116
- const addManyWithNull = binaryTree.setMany([1, null, 3, 4]);
117
- expect(addManyWithNull).toEqual([true, true, true, true]);
118
- const addManyEntriesWithNull = binaryTree.setMany([
119
- [1, '1'],
120
- [null, 'null'],
121
- [3, '3'],
122
- [4, '4']
123
- ]);
124
- expect(addManyEntriesWithNull).toEqual([true, true, true, true]);
125
- expect(binaryTree.get(null)).toBe(undefined);
126
- expect(binaryTree.getNode(null)).toBe(undefined);
127
- // // TODO should be null instead of undefined
128
- // expect(binaryTree.getNode(null)).toBe(null);
129
- const node0 = binaryTree.set(0, '0');
130
- expect(node0).toBe(true);
131
- expect(binaryTree.get(0)).toBe('0');
132
- });
133
- });
134
-
135
- describe('BinaryTree', () => {
136
- let binTree: BinaryTree<number>;
137
-
138
- beforeEach(() => {
139
- binTree = new BinaryTree<number>();
140
- });
141
-
142
- afterEach(() => {
143
- binTree.clear();
144
- });
145
-
146
- it('set(): inserts a node and updates size', () => {
147
- const node = binTree.set(1);
148
- expect(node).not.toBeNull();
149
- expect(binTree.size).toBe(1);
150
- });
151
-
152
- it('delete(): leaf/one-child/two-children/missing; updates size and minHeight', () => {
153
- expect(binTree.getHeight(binTree.root, 'ITERATIVE')).toBe(-1);
154
- expect(binTree.getMinHeight()).toBe(-1);
155
- const node1 = binTree.createNode(1);
156
- binTree.set(node1);
157
- expect(binTree.size).toBe(1);
158
-
159
- const leftChild = new BinaryTreeNode<number>(2);
160
- const rightChild = new BinaryTreeNode<number>(3);
161
- binTree.set(leftChild);
162
- binTree.set(rightChild);
163
- const root = binTree.root;
164
-
165
- expect(leftChild.familyPosition).toBe('LEFT');
166
- binTree.set(null);
167
- binTree.set(new BinaryTreeNode<number>(4));
168
- expect(rightChild.familyPosition).toBe('RIGHT');
169
- expect(root?.familyPosition).toBe('ROOT');
170
- expect(leftChild.familyPosition).toBe('ROOT_LEFT');
171
- binTree.set(new BinaryTreeNode<number>(5));
172
- expect(rightChild.familyPosition).toBe('ROOT_RIGHT');
173
-
174
- binTree.delete(new BinaryTreeNode<number>(200));
175
- binTree.delete(rightChild);
176
-
177
- if (node1) {
178
- const result = binTree.delete(node1);
179
- expect(result).toHaveLength(1);
180
- expect(binTree.size).toBe(4);
181
- expect(binTree.getMinHeight(binTree.root, 'RECURSIVE')).toBe(1);
182
- }
183
- });
184
-
185
- it('set()/has()/getNode(): find nodes by key and predicate', () => {
186
- binTree.set([1, 1]);
187
- binTree.set(undefined);
188
- binTree.set([2, 2]);
189
- binTree.set([3, 3]);
190
-
191
- expect(binTree.has(1)).toBe(true);
192
- expect(binTree.has(2)).toBe(true);
193
- expect(binTree.has(3)).toBe(true);
194
- expect(binTree.has(4)).toBe(false);
195
- const node4 = binTree.getNode(4);
196
- expect(binTree.has(node4)).toBe(false);
197
- expect(binTree.has(node => node === node4)).toBe(false);
198
- expect(binTree.has(node => node.key?.toString() === '3')).toBe(true);
199
- });
200
-
201
- it('clone(): structural copy; subtree dfs with includeNull permutations', () => {
202
- expect(binTree.isEmpty()).toBe(true);
203
- binTree.setMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
204
- expect(binTree.root?.key).toBe(4);
205
- expect(binTree.root?.left?.key).toBe(2);
206
- expect(binTree.root?.left?.left).toBe(null);
207
- expect(binTree.root?.left?.right?.key).toBe(1);
208
- expect(binTree.root?.right?.key).toBe(6);
209
- expect(binTree.root?.right?.left?.key).toBe(3);
210
- expect(binTree.root?.right?.right).toBe(null);
211
-
212
- const cloned = binTree.clone();
213
- expect(cloned.root?.key).toBe(4);
214
- expect(cloned.root?.left?.key).toBe(2);
215
- expect(cloned.root?.left?.left).toBe(null);
216
- expect(cloned.root?.left?.right?.key).toBe(1);
217
- expect(cloned.root?.right?.key).toBe(6);
218
- expect(cloned.root?.right?.left?.key).toBe(3);
219
- expect(cloned.root?.right?.right).toBe(null);
220
- expect(cloned.dfs(node => node.key, 'PRE', false, cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
221
- expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
222
- 6,
223
- 3,
224
- 7,
225
- null
226
- ]);
227
- expect(cloned.dfs(node => (node ? node.key : node), 'PRE', false, cloned.getNode(6), 'ITERATIVE', true)).toEqual([
228
- 6,
229
- 3,
230
- 7,
231
- null
232
- ]);
233
- expect(cloned.dfs(node => (node ? node.key : null), 'PRE', false, cloned.getNode(6), 'RECURSIVE', true)).toEqual([
234
- 6,
235
- 3,
236
- 7,
237
- null
238
- ]);
239
- cloned.delete(6);
240
- cloned.delete(3);
241
- cloned.delete(7);
242
- cloned.delete(1);
243
- cloned.delete(5);
244
- cloned.delete(4);
245
- cloned.delete(2);
246
- // cloned.delete(null);
247
- // cloned.delete(null);
248
- // cloned.delete(null);
249
- expect(binTree.size).toBe(10);
250
- expect(cloned.size).toBe(3);
251
- // expect(cloned.size).toBe(0);
252
- // expect(cloned.isEmpty()).toBe(true);
253
- });
254
-
255
- it('isPerfectlyBalanced(): toggles with pointer tampering and skewed levels', () => {
256
- binTree.set(3);
257
- binTree.set(12);
258
- binTree.setMany(getRandomIntArray(100, 1, 100));
259
- binTree.set(10);
260
-
261
- expect(binTree.isPerfectlyBalanced()).toBe(true);
262
- const node3 = binTree.getNode(3);
263
-
264
- if (node3) node3.right = binTree.createNode(1);
265
- expect(binTree.isPerfectlyBalanced()).toBe(false);
266
-
267
- binTree.clear();
268
- binTree.setMany([1, null, 2, null, 3, null, 4, null, 5, null, 6, null]);
269
- expect(binTree.isPerfectlyBalanced()).toBe(false);
270
- });
271
-
272
- it('getDepth(): returns correct depth with/without root parameter', () => {
273
- binTree.set(1);
274
- expect(binTree.getDepth(1)).toBe(0);
275
- binTree.set(2);
276
- expect(binTree.getDepth(2)).toBe(1);
277
- binTree.set(3);
278
- expect(binTree.getDepth(3, 1)).toBe(1);
279
- binTree.set(4);
280
- expect(binTree.getDepth(4, 1)).toBe(2);
281
- expect(binTree.getDepth(4)).toBe(2);
282
- expect(binTree.getDepth(4, 2)).toBe(1);
283
- });
284
-
285
- it('dfs(IN): returns in-order; height respects iterationType', () => {
286
- binTree.set(null);
287
- binTree.delete(1);
288
- expect(binTree.getHeight()).toBe(-1);
289
- binTree.set(4);
290
- binTree.set(2);
291
- expect(binTree.getHeight()).toBe(1);
292
- binTree.iterationType = 'RECURSIVE';
293
- expect(binTree.getHeight()).toBe(1);
294
- binTree.iterationType = 'ITERATIVE';
295
-
296
- binTree.set(6);
297
- binTree.set(1);
298
- binTree.set(new BinaryTreeNode(3));
299
- binTree.set(5);
300
- binTree.set(7);
301
-
302
- const inOrder = binTree.dfs(node => node.key);
303
-
304
- expect(inOrder).toEqual([1, 2, 3, 4, 5, 6, 7]);
305
- });
306
-
307
- it('isBST(): returns true for subtree (iterative & recursive)', () => {
308
- binTree.setMany([
309
- new BinaryTreeNode(4, 4),
310
- new BinaryTreeNode(2, 2),
311
- new BinaryTreeNode(6, 6),
312
- new BinaryTreeNode(1, 1),
313
- new BinaryTreeNode(3, 3),
314
- new BinaryTreeNode(5, 5),
315
- new BinaryTreeNode(7, 7),
316
- new BinaryTreeNode(4, 4)
317
- ]);
318
-
319
- expect(binTree.isBST(binTree.getNode(4), 'RECURSIVE')).toBe(true);
320
- expect(binTree.isBST(binTree.getNode(4), 'ITERATIVE')).toBe(true);
321
- });
322
-
323
- it('isBST(): returns true for subtree (iterative & recursive)', () => {
324
- expect(binTree.toVisual()).toBe('');
325
- binTree.setMany([4, 2, 6, 1, 3, 5, 7, 4]);
326
- expect(binTree.toVisual()).toBe(
327
- 'N for null\n' +
328
- ' ___4___ \n' +
329
- ' / \\ \n' +
330
- ' _2_ _6_ \n' +
331
- ' / \\ / \\ \n' +
332
- ' 1 3 5 7 \n' +
333
- ' \n'
334
- );
335
- const visualized = binTree.toVisual(undefined, {
336
- isShowUndefined: true,
337
- isShowNull: true,
338
- isShowRedBlackNIL: true
339
- });
340
- expect(visualized).toBe(
341
- 'U for undefined\n' +
342
- 'N for null\n' +
343
- 'S for Sentinel Node(NIL)\n' +
344
- ' _______4_______ \n' +
345
- ' / \\ \n' +
346
- ' ___2___ ___6___ \n' +
347
- ' / \\ / \\ \n' +
348
- ' _1_ _3_ _5_ _7_ \n' +
349
- ' / \\ / \\ / \\ / \\ \n' +
350
- ' U U U U U U U U \n' +
351
- ' \n'
352
- );
353
-
354
- expect(binTree.isBST(binTree.getNode(4), 'RECURSIVE')).toBe(true);
355
- expect(binTree.isBST(binTree.getNode(4), 'ITERATIVE')).toBe(true);
356
- expect(binTree.getNodes(2, false, null)).toEqual([]);
357
- expect(binTree.getNodes(undefined)).toEqual([]);
358
- expect(binTree.getNodes(binTree.getNode(2), false, binTree.root)).toEqual([binTree.getNode(2)]);
359
- });
360
-
361
- describe('isValidKey', () => {
362
- describe('primitive types', () => {
363
- it('isValidKey(): numbers are valid keys', () => {
364
- expect(binTree.isValidKey(42)).toBe(true);
365
- expect(binTree.isValidKey(0)).toBe(true);
366
- expect(binTree.isValidKey(-1)).toBe(true);
367
- expect(binTree.isValidKey(Infinity)).toBe(true);
368
- expect(binTree.isValidKey(-Infinity)).toBe(true);
369
- });
370
-
371
- // it('isValidKey(): NaN is not a valid key', () => {
372
- // expect(binTree.isValidKey(NaN)).toBe(false);
373
- // });
374
-
375
- it('isValidKey(): strings are valid keys', () => {
376
- expect(binTree.isValidKey('hello')).toBe(true);
377
- expect(binTree.isValidKey('')).toBe(true);
378
- expect(binTree.isValidKey('123')).toBe(true);
379
- });
380
-
381
- it('isValidKey(): BigInt is a valid key', () => {
382
- expect(binTree.isValidKey(BigInt(42))).toBe(true);
383
- expect(binTree.isValidKey(BigInt(0))).toBe(true);
384
- expect(binTree.isValidKey(BigInt(-1))).toBe(true);
385
- });
386
-
387
- it('isValidKey(): booleans are valid keys', () => {
388
- expect(binTree.isValidKey(true)).toBe(true);
389
- expect(binTree.isValidKey(false)).toBe(true);
390
- });
391
-
392
- it('isValidKey(): null is valid, undefined is not', () => {
393
- expect(binTree.isValidKey(null)).toBe(true);
394
- expect(binTree.isValidKey(undefined)).toBe(false);
395
- });
396
-
397
- it('isValidKey(): symbols are not valid keys', () => {
398
- expect(binTree.isValidKey(Symbol('test'))).toBe(false);
399
- expect(binTree.isValidKey(Symbol.for('test'))).toBe(false);
400
- });
401
- });
402
-
403
- describe('Date objects', () => {
404
- it('isValidKey(): valid Date objects are valid keys', () => {
405
- expect(binTree.isValidKey(new Date())).toBe(true);
406
- expect(binTree.isValidKey(new Date('2024-01-01'))).toBe(true);
407
- });
408
-
409
- // it('invalid Date objects should not be a key', () => {
410
- // expect(binTree.isValidKey(new Date('invalid'))).toBe(false);
411
- // });
412
- });
413
-
414
- describe('arrays', () => {
415
- it('isValidKey(): arrays are valid (stringified) keys', () => {
416
- expect(binTree.isValidKey([])).toBe(true);
417
- expect(binTree.isValidKey([1, 2, 3])).toBe(true);
418
- expect(binTree.isValidKey(['a', 'b', 'c'])).toBe(true);
419
- });
420
- });
421
-
422
- describe('plain objects', () => {
423
- it('isValidKey(): plain objects are not valid keys', () => {
424
- expect(binTree.isValidKey({})).toBe(false);
425
- expect(binTree.isValidKey({ a: 1 })).toBe(false);
426
- });
427
- });
428
-
429
- describe('custom objects', () => {
430
- it('isValidKey(): objects with numeric valueOf are valid keys', () => {
431
- expect(binTree.isValidKey({ valueOf: () => 42 })).toBe(true);
432
- });
433
-
434
- it('isValidKey(): objects with string valueOf are valid keys', () => {
435
- expect(binTree.isValidKey({ valueOf: () => 'test' })).toBe(true);
436
- });
437
-
438
- it('isValidKey(): objects with boolean valueOf are treated as valid', () => {
439
- expect(binTree.isValidKey({ valueOf: () => true })).toBe(true);
440
- });
441
-
442
- it('isValidKey(): nested valueOf/toString results in valid key', () => {
443
- expect(
444
- binTree.isValidKey({
445
- valueOf: () => ({ toString: () => '42' })
446
- })
447
- ).toBe(true);
448
- });
449
- });
450
-
451
- describe('deeply nested objects', () => {
452
- it('isValidKey(): deeply nested valueOf is valid', () => {
453
- const deeplyNested = {
454
- valueOf: () => ({
455
- valueOf: () => 42
456
- })
457
- };
458
- expect(binTree.isValidKey(deeplyNested)).toBe(true);
459
- });
460
-
461
- it('isValidKey(): very deep conversion to string is valid', () => {
462
- const veryDeeplyNested = {
463
- valueOf: () => ({
464
- valueOf: () => ({
465
- toString: () => '42'
466
- })
467
- })
468
- };
469
- expect(binTree.isValidKey(veryDeeplyNested)).toBe(true);
470
- });
471
-
472
- it('isValidKey(): circular reference is invalid', () => {
473
- const circular: any = {
474
- valueOf: () => circular
475
- };
476
- expect(binTree.isValidKey(circular)).toBe(false);
477
- });
478
- });
479
-
480
- describe('edge cases', () => {
481
- it('isValidKey(): non-primitive ultimate value is invalid', () => {
482
- const complexObject = {
483
- valueOf: () => ({
484
- toString: () => ({
485
- valueOf: () => 'valid'
486
- })
487
- })
488
- };
489
- expect(binTree.isValidKey(complexObject)).toBe(false);
490
- });
491
-
492
- it('isValidKey(): ultimately primitive conversion is valid', () => {
493
- const complexObject = {
494
- valueOf: () => ({
495
- valueOf: () => ({
496
- valueOf: () => ({
497
- valueOf: () => ({
498
- toString: () => `{
499
- valueOf: () => 'valid'
500
- }`
501
- })
502
- })
503
- })
504
- })
505
- };
506
- expect(binTree.isValidKey(complexObject)).toBe(true);
507
- });
508
- });
509
-
510
- describe('type checking', () => {
511
- it('isValidKey(): works as a type guard in array methods', () => {
512
- const values: unknown[] = [42, 'test', true, null, undefined, new Date()];
513
- const comparableValues = values.filter(item => binTree.isValidKey(item));
514
- expect(comparableValues.length).toBe(5);
515
- });
516
- });
517
- });
518
-
519
- it('isLeaf(): detects leaves; null is treated as leaf', () => {
520
- expect(binTree.getLeftMost()).toBe(undefined);
521
- expect(binTree.getRightMost()).toBe(undefined);
522
- binTree.setMany([4, 2, 6, 1, 3, 5, 7, 4]);
523
- const leftMost = binTree.getLeftMost();
524
- expect(binTree.isLeaf(leftMost)).toBe(true);
525
- expect(binTree.isLeaf(null)).toBe(true);
526
- const rightMost = binTree.getRightMost();
527
- expect(binTree.isLeaf(rightMost)).toBe(true);
528
- expect(binTree.isLeaf(null)).toBe(true);
529
- });
530
-
531
- it('dfs/bfs on mixed-null level-order tree: expected orders (includeNull on/off)', () => {
532
- expect(binTree.dfs()).toEqual([]);
533
- expect([...binTree.values()]).toEqual([]);
534
- binTree.setMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
535
- expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'ITERATIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
536
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', false)).toEqual(
537
- [4, 2, 1, 5, 6, 3, 7]
538
- );
539
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'ITERATIVE', true)).toEqual([
540
- 4,
541
- 2,
542
- null,
543
- 1,
544
- 5,
545
- null,
546
- 6,
547
- 3,
548
- 7,
549
- null
550
- ]);
551
-
552
- expect(binTree.dfs(node => node.key, 'PRE', false, undefined, 'RECURSIVE')).toEqual([4, 2, 1, 5, 6, 3, 7]);
553
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', false)).toEqual(
554
- [4, 2, 1, 5, 6, 3, 7]
555
- );
556
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, undefined, 'RECURSIVE', true)).toEqual([
557
- 4,
558
- 2,
559
- null,
560
- 1,
561
- 5,
562
- null,
563
- 6,
564
- 3,
565
- 7,
566
- null
567
- ]);
568
-
569
- expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'ITERATIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
570
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', false)).toEqual([
571
- 2, 5, 1, 4, 7, 3, 6
572
- ]);
573
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'ITERATIVE', true)).toEqual([
574
- null,
575
- 2,
576
- 5,
577
- 1,
578
- null,
579
- 4,
580
- 7,
581
- 3,
582
- 6,
583
- null
584
- ]);
585
-
586
- expect(binTree.dfs(node => node.key, 'IN', false, undefined, 'RECURSIVE')).toEqual([2, 5, 1, 4, 7, 3, 6]);
587
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', false)).toEqual([
588
- 2, 5, 1, 4, 7, 3, 6
589
- ]);
590
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, undefined, 'RECURSIVE', true)).toEqual([
591
- null,
592
- 2,
593
- 5,
594
- 1,
595
- null,
596
- 4,
597
- 7,
598
- 3,
599
- 6,
600
- null
601
- ]);
602
-
603
- expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'ITERATIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
604
- expect(
605
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', false)
606
- ).toEqual([5, 1, 2, 7, 3, 6, 4]);
607
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'ITERATIVE', true)).toEqual(
608
- [null, 5, null, 1, 2, 7, 3, null, 6, 4]
609
- );
610
-
611
- expect(binTree.dfs(node => node.key, 'POST', false, undefined, 'RECURSIVE')).toEqual([5, 1, 2, 7, 3, 6, 4]);
612
- expect(
613
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', false)
614
- ).toEqual([5, 1, 2, 7, 3, 6, 4]);
615
- expect(binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, undefined, 'RECURSIVE', true)).toEqual(
616
- [null, 5, null, 1, 2, 7, 3, null, 6, 4]
617
- );
618
- });
619
-
620
- it('dfs on subtree (startNode): expected orders (includeNull on/off)', () => {
621
- binTree.setMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
622
- expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
623
- expect(
624
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', false)
625
- ).toEqual([6, 3, 7]);
626
- expect(
627
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'ITERATIVE', true)
628
- ).toEqual([6, 3, 7, null]);
629
-
630
- expect(binTree.dfs(node => node.key, 'PRE', false, binTree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
631
- expect(
632
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', false)
633
- ).toEqual([6, 3, 7]);
634
- expect(
635
- binTree.dfs(node => (node !== null ? node.key : null), 'PRE', false, binTree.getNode(6), 'RECURSIVE', true)
636
- ).toEqual([6, 3, 7, null]);
637
-
638
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
639
- expect(
640
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', false)
641
- ).toEqual([7, 3, 6]);
642
- expect(
643
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'ITERATIVE', true)
644
- ).toEqual([7, 3, 6, null]);
645
-
646
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
647
- expect(
648
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', false)
649
- ).toEqual([7, 3, 6]);
650
- expect(
651
- binTree.dfs(node => (node !== null ? node.key : null), 'IN', false, binTree.getNode(6), 'RECURSIVE', true)
652
- ).toEqual([7, 3, 6, null]);
653
-
654
- expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'ITERATIVE')).toEqual([7, 3, 6]);
655
- expect(
656
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', false)
657
- ).toEqual([7, 3, 6]);
658
- expect(
659
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'ITERATIVE', true)
660
- ).toEqual([7, 3, null, 6]);
661
-
662
- expect(binTree.dfs(node => node.key, 'POST', false, binTree.getNode(6), 'RECURSIVE')).toEqual([7, 3, 6]);
663
- expect(
664
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', false)
665
- ).toEqual([7, 3, 6]);
666
- expect(
667
- binTree.dfs(node => (node !== null ? node.key : null), 'POST', false, binTree.getNode(6), 'RECURSIVE', true)
668
- ).toEqual([7, 3, null, 6]);
669
- });
670
-
671
- it('clear(): empties tree and resets root', () => {
672
- binTree.set(1);
673
- binTree.set(2);
674
-
675
- expect(binTree.size).toBe(2);
676
-
677
- binTree.clear();
678
-
679
- expect(binTree.size).toBe(0);
680
- expect(binTree.root).toBeUndefined();
681
- });
682
-
683
- it('duplicate keys: replace existing value; bfs includeNull snapshot', function () {
684
- binTree.clear();
685
- expect(binTree.bfs()).toEqual([]);
686
- binTree.setMany([-10, -10, -10, 9, 9, 20, null, null, 15, 7, 8, null, 2, null, 6, null, null, 8, 8, 8]);
687
-
688
- expect(binTree.bfs(node => (node ? node.key : null), undefined, undefined, true)).toEqual([
689
- -10,
690
- 9,
691
- 20,
692
- null,
693
- null,
694
- 15,
695
- 7,
696
- 8,
697
- null,
698
- 2,
699
- null,
700
- 6,
701
- null,
702
- null
703
- ]);
704
- });
705
-
706
- // it('should keyValueNodeEntryRawToNodeAndValue', () => {
707
- // const binTree = new BinaryTree<number>();
708
- // const node0 = binTree.keyValueNodeEntryRawToNodeAndValue(0);
709
- // expect(node0).toEqual([
710
- // {
711
- // _left: undefined,
712
- // _right: undefined,
713
- // key: 0,
714
- // parent: undefined,
715
- // value: undefined
716
- // },
717
- // undefined
718
- // ]);
719
- //
720
- // const nodeUndefined = binTree.keyValueNodeEntryRawToNodeAndValue(undefined);
721
- // expect(nodeUndefined).toEqual([undefined, undefined]);
722
- //
723
- // const nodeNull = binTree.keyValueNodeEntryRawToNodeAndValue(null);
724
- // expect(nodeNull).toEqual([null, undefined]);
725
- //
726
- // const [, nodeWithSeparateValue] = binTree.keyValueNodeEntryRawToNodeAndValue(7, 77);
727
- // expect(nodeWithSeparateValue).toBe(77);
728
- //
729
- // expect(binTree.keyValueNodeEntryRawToNodeAndValue([undefined, 2])).toEqual([undefined, undefined]);
730
- //
731
- // expect(binTree.keyValueNodeEntryRawToNodeAndValue(Symbol('test') as unknown as number)).toEqual([
732
- // undefined,
733
- // undefined
734
- // ]);
735
- //
736
- // const bTree = new BinaryTree<number, number, { obj: { id: number } }>([], {
737
- // toEntryFn: (ele: { obj: { id: number } }) => [Symbol('test') as unknown as number, ele.obj.id]
738
- // });
739
- // expect(bTree.keyValueNodeEntryRawToNodeAndValue({ obj: { id: 1 } })).toEqual([undefined, undefined]);
740
- // });
741
-
742
- it('set(): duplicate key updates value (Map vs non-Map behavior)', () => {
743
- const binTree = new BinaryTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
744
- expect(binTree.get(1)).toBe('1');
745
- expect(binTree.getNode(1)?.value).toBe('1');
746
- binTree.set(1, 'a');
747
- expect(binTree.get(1)).toBe('a');
748
- binTree.set([1, 'b']);
749
- expect(binTree.getNode(1)?.value).toBe('b');
750
- expect(binTree.get(1)).toBe('b');
751
- const treeMap = new BinaryTree<number>([4, 5, [1, '1'], 2, 3]);
752
- expect(treeMap.get(1)).toBe('1');
753
- expect(treeMap.getNode(1)?.value).toBe('1');
754
- treeMap.set(1, 'a');
755
- expect(treeMap.get(1)).toBe('a');
756
- treeMap.set([1, 'b']);
757
- expect(treeMap.getNode(1)?.value).toBe('b');
758
- expect(treeMap.get(1)).toBe('b');
759
- });
760
- });
761
-
762
- describe('BinaryTree.ensureNode', () => {
763
- it('ensureNode(): with toEntryFn returns existing node; handles null/undefined/Symbol', () => {
764
- const binTree = new BinaryTree<
765
- number,
766
- string,
767
- {
768
- id: number;
769
- name: string;
770
- }
771
- >([], { toEntryFn: rawElement => [rawElement.id, rawElement.name] });
772
- binTree.set([1, 'Pablo']);
773
- const node = binTree.getNode(1);
774
- // expect(binTree.ensureNode({ id: 1, name: 'Pablo' })).toBe(node);
775
- expect(binTree.ensureNode([1, 'Pablo'])).toBe(node);
776
- expect(binTree.ensureNode([null, 'Pablo'])).toBe(null);
777
- expect(binTree.ensureNode([undefined, 'Pablo'])).toBe(undefined);
778
- expect(binTree.ensureNode(Symbol('test') as unknown as number)).toBe(undefined);
779
- });
780
- });
781
-
782
- describe('BinaryTree - Morris traversal', () => {
783
- // Create a binary binTree
784
- const binTree = new BinaryTree<number>();
785
- binTree.set(1);
786
- binTree.set(2);
787
- binTree.set(3);
788
- binTree.set(4);
789
- binTree.set(5);
790
- it('morris(IN): equals dfs(IN) (iterative/recursive)', () => {
791
- // Perform in-order Morris traversal
792
- const result = binTree.morris(node => node.key, 'IN');
793
-
794
- // Expected in-order traversal result
795
- const expected = [4, 2, 5, 1, 3];
796
-
797
- expect(result).toEqual(expected);
798
- expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
799
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
800
- });
801
-
802
- it('morris(PRE): equals dfs(PRE)', () => {
803
- // Perform pre-order Morris traversal
804
- const result = binTree.morris(node => node.key, 'PRE');
805
-
806
- // Expected pre-order traversal result
807
- const expected = [1, 2, 4, 5, 3];
808
-
809
- expect(result).toEqual(expected);
810
- expect(binTree.dfs(node => node.key, 'PRE')).toEqual(expected);
811
- });
812
-
813
- it('morris(POST): equals dfs(POST)', () => {
814
- // Perform post-order Morris traversal
815
- const result = binTree.morris(node => node.key, 'POST');
816
-
817
- // Expected post-order traversal result
818
- const expected = [4, 5, 2, 3, 1];
819
-
820
- expect(result).toEqual([4, 5, 2, 3, 1]);
821
- expect(binTree.dfs(node => node.key, 'POST')).toEqual(expected);
822
- });
823
-
824
- it('morris(): structure intact afterwards', () => {
825
- const node1 = binTree.getNode(1);
826
- const node2 = binTree.getNode(2);
827
- const node3 = binTree.getNode(3);
828
- expect(node1?.left).toBe(node2);
829
- expect(node1?.right).toBe(node3);
830
- });
831
- });
832
-
833
- describe('BinaryTree.toEntryFn', () => {
834
- it('toEntryFn: non-function throws toEntryFn must be a function type', () => {
835
- expect(() => {
836
- new BinaryTree<number, number, { obj: { id: number } }>([], {
837
- toEntryFn: `ele => [ele.obj.id, ele.obj.id]` as unknown as (rawElement: {
838
- obj: { id: number };
839
- }) => BTNEntry<number, number>
840
- });
841
- }).toThrow('toEntryFn must be a function type');
842
- });
843
-
844
- it('toEntryFn + setMany(): IN order equals dfs/Morris', () => {
845
- const binTree = new BinaryTree<number, number, { obj: { id: number } }>([], {
846
- toEntryFn: ele => [ele.obj.id, ele.obj.id]
847
- });
848
- binTree.setMany([
849
- { obj: { id: 1 } },
850
- { obj: { id: 2 } },
851
- { obj: { id: 3 } },
852
- { obj: { id: 4 } },
853
- { obj: { id: 5 } }
854
- ]);
855
-
856
- const expected = [4, 2, 5, 1, 3];
857
-
858
- expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
859
- expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
860
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
861
- });
862
-
863
- it('constructor toEntryFn (initial data): IN order equals dfs/Morris', () => {
864
- const binTree = new BinaryTree<number, number, { obj: { id: number } }>(
865
- [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
866
- {
867
- toEntryFn: ele => [ele.obj.id, ele.obj.id]
868
- }
869
- );
870
-
871
- const expected = [4, 2, 5, 1, 3];
872
-
873
- expect(binTree.morris(node => node.key, 'IN')).toEqual(expected);
874
- expect(binTree.dfs(node => node.key, 'IN')).toEqual(expected);
875
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(expected);
876
- });
877
-
878
- it('without toEntryFn (valueOf-based): dfs/Morris behaviors', () => {
879
- const data = [
880
- { obj: { id: 4 }, valueOf: () => 4 },
881
- { obj: { id: 2 }, valueOf: () => 2 },
882
- { obj: { id: 5 }, valueOf: () => 5 },
883
- { obj: { id: 1 }, valueOf: () => 1 },
884
- { obj: { id: 3 }, valueOf: () => 3 }
885
- ];
886
- const binTree = new BinaryTree<{ obj: { id: number }; valueOf: () => number }, number>(data);
887
-
888
- expect(binTree.morris(node => node.key, 'IN')).toEqual(data.sort((a, b) => a.obj.id - b.obj.id));
889
- expect(binTree.dfs(node => node.key, 'IN')).toEqual(data);
890
- expect(binTree.dfs(node => node.key, 'IN', false, binTree.root, 'RECURSIVE')).toEqual(data);
891
- });
892
- });
893
-
894
- describe('BinaryTree - traversal suites', () => {
895
- it('bfs/dfs/listLevels: permutations return expected sequences', () => {
896
- const binTree = new BinaryTree<number>();
897
-
898
- const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
899
- binTree.refill(arr);
900
- expect(binTree.bfs(node => node, binTree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
901
- 35,
902
- 20,
903
- 40,
904
- 15,
905
- 29,
906
- null,
907
- 50,
908
- null,
909
- 16,
910
- 28,
911
- 30,
912
- 45,
913
- 55
914
- ]);
915
- expect(binTree.bfs(node => node, binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
916
- 35,
917
- 20,
918
- 40,
919
- 15,
920
- 29,
921
- null,
922
- 50,
923
- null,
924
- 16,
925
- 28,
926
- 30,
927
- 45,
928
- 55
929
- ]);
930
- expect(binTree.bfs(node => node, binTree.root, 'ITERATIVE').map(node => (node === null ? null : node.key))).toEqual(
931
- [35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]
932
- );
933
- expect(binTree.bfs(node => node, binTree.root, 'RECURSIVE').map(node => (node === null ? null : node.key))).toEqual(
934
- [35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]
935
- );
936
-
937
- expect(binTree.dfs(node => node.key, 'PRE')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
938
- expect(binTree.dfs(node => node.key, 'PRE', false, binTree.root, 'RECURSIVE')).toEqual([
939
- 35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
940
- ]);
941
- expect(
942
- binTree
943
- .dfs(node => node, 'PRE', false, binTree.root, 'ITERATIVE', true)
944
- .map(node => (node === null ? null : node.key))
945
- ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
946
- expect(
947
- binTree.dfs(node => node, 'PRE', false, binTree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))
948
- ).toEqual([35, 20, 15, null, 16, 29, 28, 30, 40, null, 50, 45, 55]);
949
-
950
- expect(binTree.dfs(node => node.key, 'IN')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
951
- expect(binTree.dfs(node => node.key, 'POST')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
952
- expect(binTree.dfs(node => node.key, 'POST', false, binTree.root, 'RECURSIVE')).toEqual([
953
- 16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
954
- ]);
955
- expect(binTree.bfs(node => node.key, binTree.root, 'RECURSIVE')).toEqual([
956
- 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
957
- ]);
958
- expect(binTree.bfs(node => node.key, binTree.root, 'ITERATIVE')).toEqual([
959
- 35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
960
- ]);
961
-
962
- expect(binTree.listLevels(node => node.key)).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
963
-
964
- expect(binTree.listLevels(node => node.key, binTree.root, 'RECURSIVE')).toEqual([
965
- [35],
966
- [20, 40],
967
- [15, 29, 50],
968
- [16, 28, 30, 45, 55]
969
- ]);
970
- expect(binTree.listLevels(node => (node ? node.key : null), binTree.root, 'ITERATIVE', true)).toEqual([
971
- [35],
972
- [20, 40],
973
- [15, 29, null, 50],
974
- [null, 16, 28, 30, 45, 55]
975
- ]);
976
- expect(binTree.listLevels(node => (node ? node.key : null), binTree.root, 'RECURSIVE', true)).toEqual([
977
- [35],
978
- [20, 40],
979
- [15, 29, null, 50],
980
- [null, 16, 28, 30, 45, 55]
981
- ]);
982
- binTree.clear();
983
- expect(binTree.listLevels()).toEqual([]);
984
- });
985
- });
986
-
987
- describe('BinaryTree', () => {
988
- let binTree: BinaryTree<number, string>;
989
-
990
- beforeEach(() => {
991
- binTree = new BinaryTree<number, string>([], {
992
- iterationType: 'RECURSIVE'
993
- });
994
- });
995
-
996
- afterEach(() => {
997
- binTree.clear();
998
- });
999
-
1000
- it('constructor: creates an empty BinaryTree', () => {
1001
- expect(binTree.size).toBe(0);
1002
- expect(binTree.isEmpty()).toBe(true);
1003
- expect(binTree.root).toBe(undefined);
1004
- });
1005
-
1006
- it('set(): inserts nodes and sets root', () => {
1007
- binTree.set([5, 'A']);
1008
- binTree.set([3, 'B']);
1009
- binTree.set([7, 'C']);
1010
-
1011
- expect(binTree.size).toBe(3);
1012
- expect(binTree.isEmpty()).toBe(false);
1013
- expect(binTree.root?.key).toBe(5);
1014
- });
1015
-
1016
- it('should clear the BinaryTree', () => {
1017
- binTree.set([5, 'A']);
1018
- binTree.set([3, 'B']);
1019
- binTree.set([7, 'C']);
1020
-
1021
- binTree.clear();
1022
-
1023
- expect(binTree.size).toBe(0);
1024
- expect(binTree.isEmpty()).toBe(true);
1025
- expect(binTree.root).toBe(undefined);
1026
- });
1027
-
1028
- it('getNode()/get(): resolve nodes and values by key', () => {
1029
- binTree.set([5, 'A']);
1030
- binTree.set([3, 'B']);
1031
- binTree.set([7, 'C']);
1032
-
1033
- const nodeA = binTree.getNode(5);
1034
- const nodeB = binTree.getNode(3);
1035
-
1036
- expect(nodeA?.key).toBe(5);
1037
- expect(nodeA?.value).toBe('A');
1038
- expect(nodeB?.key).toBe(3);
1039
- expect(binTree.get(nodeB)).toBe('B');
1040
- });
1041
-
1042
- it('getNode(): returns undefined for missing key', () => {
1043
- binTree.set([5, 'A']);
1044
-
1045
- const node = binTree.getNode(3);
1046
-
1047
- expect(node).toBe(undefined);
1048
- });
1049
-
1050
- it('should get the depth of a node', () => {
1051
- binTree.set([5, 'A']);
1052
- binTree.set([3, 'B']);
1053
- binTree.set([7, 'C']);
1054
-
1055
- expect(binTree.getDepth(7)).toBe(1);
1056
- expect(binTree.getDepth(3)).toBe(1);
1057
- });
1058
-
1059
- it('getHeight()/getMinHeight(): expected heights', () => {
1060
- expect(binTree.getMinHeight()).toBe(-1);
1061
- binTree.set([5, 'A']);
1062
- binTree.set(3, 'B');
1063
- binTree.set([7, 'C']);
1064
-
1065
- expect(binTree.getHeight()).toBe(1);
1066
- expect(binTree.getHeight(undefined, 'RECURSIVE')).toBe(1);
1067
- expect(binTree.getMinHeight(undefined, 'RECURSIVE')).toBe(1);
1068
- });
1069
-
1070
- it('isBST(): returns true for valid tree', () => {
1071
- binTree.set([5, 'A']);
1072
- binTree.set([3, 'B']);
1073
- binTree.set([7, 'C']);
1074
-
1075
- expect(binTree.isBST()).toBe(true);
1076
- });
1077
-
1078
- it('dfs(default IN): returns expected order', () => {
1079
- binTree.set([5, 'A']);
1080
- binTree.set([3, 'B']);
1081
- binTree.set([7, 'C']);
1082
-
1083
- const result = binTree.dfs();
1084
- expect(result).toEqual([3, 5, 7]);
1085
- // Add assertions for the result of depth-first traversal
1086
- });
1087
-
1088
- it('bfs(): returns expected level-order', () => {
1089
- binTree.set([5, 'A']);
1090
- binTree.set([3, 'B']);
1091
- binTree.set([7, 'C']);
1092
-
1093
- const result = binTree.bfs(node => node.key);
1094
- expect(result).toEqual([5, 3, 7]);
1095
- // Add assertions for the result of breadth-first traversal
1096
- });
1097
-
1098
- it('listLevels(): returns keys by level', () => {
1099
- binTree.set([5, 'A']);
1100
- binTree.set([3, 'B']);
1101
- binTree.set([7, 'C']);
1102
-
1103
- const levels = binTree.listLevels();
1104
- expect(levels).toEqual([[5], [3, 7]]);
1105
- // Add assertions for the levels of the binTree
1106
- });
1107
-
1108
- it('delete(): removes nodes and updates size', () => {
1109
- binTree.set([5, 'A']);
1110
- binTree.set([3, 'B']);
1111
- binTree.set([7, 'C']);
1112
-
1113
- binTree.delete(3);
1114
-
1115
- expect(binTree.size).toBe(2);
1116
- expect(binTree.getNode(3)).toBe(undefined);
1117
- });
1118
-
1119
- it('getPathToRoot(): path from key to root; [] for missing', () => {
1120
- binTree.set([5, 'A']);
1121
- binTree.set([3, 'B']);
1122
- binTree.set([7, 'C']);
1123
-
1124
- expect(binTree.getPathToRoot(7)).toEqual([7, 5]);
1125
- expect(binTree.getPathToRoot(1)).toEqual([]);
1126
- });
1127
-
1128
- it('isPerfectlyBalanced(): true for balanced tree', () => {
1129
- binTree.set([5, 'A']);
1130
- binTree.set([3, 'B']);
1131
- binTree.set([7, 'C']);
1132
-
1133
- expect(binTree.isPerfectlyBalanced()).toBe(true);
1134
- });
1135
-
1136
- it('getNodes(predicate): returns matches (iterative & recursive)', () => {
1137
- binTree.set([5, 'E']);
1138
- binTree.set([4, 'D']);
1139
- binTree.set([3, 'C']);
1140
- binTree.set([7, 'G']);
1141
- binTree.set([null, 'null']);
1142
- binTree.set([1, 'A']);
1143
- binTree.set([6, 'F']);
1144
- binTree.set([null, 'null']);
1145
- binTree.set([2, 'B']);
1146
- binTree.set([null, 'null']);
1147
-
1148
- const nodes = binTree.getNodes(node => node.key === 2);
1149
-
1150
- expect(nodes.length).toBe(1);
1151
- expect(nodes[0].key).toBe(2);
1152
-
1153
- const nodesRec = binTree.getNodes(node => node.key === 2, false, binTree.root, 'RECURSIVE');
1154
-
1155
- expect(nodesRec.length).toBe(1);
1156
- expect(nodesRec[0].key).toBe(2);
1157
-
1158
- const nodesItr = binTree.getNodes(node => node.key === 2, false, binTree.root, 'ITERATIVE');
1159
-
1160
- expect(nodesItr.length).toBe(1);
1161
- expect(nodesItr[0].key).toBe(2);
1162
-
1163
- expect(nodesItr).toEqual(nodesRec);
1164
- });
1165
-
1166
- it('morris(IN): equals dfs(IN); clear() => []', () => {
1167
- binTree.set([5, 'A']);
1168
- binTree.set([3, 'B']);
1169
- binTree.set([7, 'C']);
1170
-
1171
- binTree.iterationType = 'ITERATIVE';
1172
- expect([...binTree]).toEqual([
1173
- [3, 'B'],
1174
- [5, 'A'],
1175
- [7, 'C']
1176
- ]);
1177
- binTree.iterationType = 'RECURSIVE';
1178
- expect([...binTree]).toEqual([
1179
- [3, 'B'],
1180
- [5, 'A'],
1181
- [7, 'C']
1182
- ]);
1183
- binTree.iterationType = 'ITERATIVE';
1184
-
1185
- const result = binTree.morris();
1186
- expect(result).toEqual([3, 5, 7]);
1187
- binTree.clear();
1188
- expect(binTree.morris()).toEqual([]);
1189
- });
1190
-
1191
- it('delete(): removes all nodes; height == -1', () => {
1192
- binTree.set([5, 'A']);
1193
- binTree.set([3, 'B']);
1194
- binTree.set([7, 'C']);
1195
-
1196
- binTree.delete(5);
1197
- binTree.delete(7);
1198
- binTree.delete(3);
1199
- expect(binTree.root).toBe(undefined);
1200
- expect(binTree.getHeight()).toBe(-1);
1201
- });
1202
- });
1203
-
1204
- describe('BinaryTree (non-Map mode)', () => {
1205
- let binTree: BinaryTree<number, string>;
1206
-
1207
- beforeEach(() => {
1208
- binTree = new BinaryTree<number, string>([], {
1209
- iterationType: 'RECURSIVE',
1210
- isMapMode: false
1211
- });
1212
- });
1213
-
1214
- afterEach(() => {
1215
- binTree.clear();
1216
- });
1217
-
1218
- it('set()/has()/getNode(): find nodes by key and predicate', () => {
1219
- binTree.set([1, '1']);
1220
- binTree.set(undefined);
1221
- binTree.set([2, '2']);
1222
- binTree.set([3, '3']);
1223
-
1224
- expect(binTree.has(1)).toBe(true);
1225
- expect(binTree.has(2)).toBe(true);
1226
- expect(binTree.has(3)).toBe(true);
1227
- expect(binTree.has(4)).toBe(false);
1228
- const node4 = binTree.getNode(4);
1229
- expect(binTree.has(node4)).toBe(false);
1230
- expect(binTree.has(node => node === node4)).toBe(false);
1231
- expect(binTree.has(node => node.value?.toString() === '3')).toBe(true);
1232
- });
1233
-
1234
- it('isBST(): returns true for subtree (iterative & recursive)', () => {
1235
- binTree.setMany([
1236
- new BinaryTreeNode(4),
1237
- new BinaryTreeNode(2),
1238
- new BinaryTreeNode(6),
1239
- new BinaryTreeNode(1),
1240
- new BinaryTreeNode(3),
1241
- new BinaryTreeNode(5),
1242
- new BinaryTreeNode(7),
1243
- new BinaryTreeNode(4)
1244
- ]);
1245
-
1246
- expect(binTree.isBST(binTree.getNode(4), 'RECURSIVE')).toBe(true);
1247
- expect(binTree.isBST(binTree.getNode(4), 'ITERATIVE')).toBe(true);
1248
- });
1249
-
1250
- it('getNode()/get(): resolve nodes and values by key', () => {
1251
- binTree.set([5, 'A']);
1252
- binTree.set([3, 'B']);
1253
- binTree.set([7, 'C']);
1254
-
1255
- const nodeA = binTree.getNode(5);
1256
- const nodeB = binTree.getNode(3);
1257
-
1258
- expect(nodeA?.key).toBe(5);
1259
- expect(binTree.get(nodeA)).toBe('A');
1260
- expect(nodeB?.key).toBe(3);
1261
- expect(binTree.get(nodeB)).toBe('B');
1262
- });
1263
-
1264
- it('getNodes(predicate): returns matches (iterative & recursive)', () => {
1265
- binTree.set([5, 'E']);
1266
- binTree.set([4, 'D']);
1267
- binTree.set([3, 'C']);
1268
- binTree.set([7, 'G']);
1269
- binTree.set([null, 'null']);
1270
- binTree.set([1, 'A']);
1271
- binTree.set([6, 'F']);
1272
- binTree.set([null, 'null']);
1273
- binTree.set([2, 'B']);
1274
- binTree.set([null, 'null']);
1275
-
1276
- const nodes = binTree.getNodes(node => node.key === 2);
1277
-
1278
- expect(nodes.length).toBe(1);
1279
- expect(nodes[0].key).toBe(2);
1280
-
1281
- const nodesRec = binTree.getNodes(node => node.key === 2, false, binTree.root, 'RECURSIVE');
1282
-
1283
- expect(nodesRec.length).toBe(1);
1284
- expect(nodesRec[0].key).toBe(2);
1285
-
1286
- const nodesItr = binTree.getNodes(node => node.key === 2, false, binTree.root, 'ITERATIVE');
1287
-
1288
- expect(nodesItr.length).toBe(1);
1289
- expect(nodesItr[0].key).toBe(2);
1290
-
1291
- expect(nodesItr).toEqual(nodesRec);
1292
- });
1293
- });
1294
-
1295
- describe('BinaryTree (map mode) - higher-order & iteration', () => {
1296
- let binaryTree: BinaryTree<number, string>;
1297
- beforeEach(() => {
1298
- binaryTree = new BinaryTree();
1299
- binaryTree.set([1, 'a']);
1300
- binaryTree.set(2, 'b');
1301
- binaryTree.set([3, 'c']);
1302
- });
1303
-
1304
- it('getNode(): returns BinaryTreeNode instance', () => {
1305
- const node3 = binaryTree.getNode(3);
1306
- expect(node3).toBeInstanceOf(BinaryTreeNode);
1307
- });
1308
-
1309
- it('forEach(): iterates all entries', () => {
1310
- const mockCallback = jest.fn();
1311
- binaryTree.forEach((value, key) => {
1312
- mockCallback(key, value);
1313
- });
1314
-
1315
- expect(mockCallback.mock.calls.length).toBe(3);
1316
- expect(mockCallback.mock.calls[0]).toEqual([2, 'b']);
1317
- expect(mockCallback.mock.calls[1]).toEqual([1, 'a']);
1318
- expect(mockCallback.mock.calls[2]).toEqual([3, 'c']);
1319
- });
1320
-
1321
- it('filter(): returns new tree with filtered entries', () => {
1322
- const filteredTree = binaryTree.filter((_value, key) => key > 1);
1323
- expect(filteredTree.size).toBe(2);
1324
- expect([...filteredTree]).toEqual([
1325
- [3, 'c'],
1326
- [2, 'b']
1327
- ]);
1328
- });
1329
-
1330
- it('map(): returns new tree with transformed keys/values', () => {
1331
- const mappedTree = binaryTree.map((value, key) => [(key * 2).toString(), value]);
1332
- expect(mappedTree.size).toBe(3);
1333
- expect([...mappedTree]).toEqual([
1334
- ['2', 'a'],
1335
- ['4', 'b'],
1336
- ['6', 'c']
1337
- ]);
1338
- });
1339
-
1340
- it('reduce(): aggregates over entries', () => {
1341
- const sum = binaryTree.reduce((acc, currentValue, currentKey) => acc + currentKey, 0);
1342
- expect(sum).toBe(6);
1343
- });
1344
-
1345
- it('[Symbol.iterator]: yields entries', () => {
1346
- const entries = [];
1347
- for (const entry of binaryTree) {
1348
- entries.push(entry);
1349
- }
1350
-
1351
- expect(entries.length).toBe(3);
1352
- expect(entries).toEqual([
1353
- [2, 'b'],
1354
- [1, 'a'],
1355
- [3, 'c']
1356
- ]);
1357
- });
1358
-
1359
- it('clone(): preserves structure and allows get() by node', () => {
1360
- const cloned = binaryTree.clone();
1361
- expect(cloned.root?.left?.key).toBe(2);
1362
- expect(cloned.root?.right?.value).toBe('c');
1363
- expect(cloned.get(cloned.root?.right)).toBe('c');
1364
- });
1365
-
1366
- it('keys(): iterator yields keys in-order', () => {
1367
- const keys = binaryTree.keys();
1368
- expect([...keys]).toEqual([2, 1, 3]);
1369
- });
1370
-
1371
- it('values(): iterator yields values in-order', () => {
1372
- const values = binaryTree.values();
1373
- expect([...values]).toEqual(['b', 'a', 'c']);
1374
- });
1375
-
1376
- it('leaves(): returns leaf keys; clear() => []', () => {
1377
- const leaves = binaryTree.leaves();
1378
- expect(leaves).toEqual([2, 3]);
1379
- binaryTree.clear();
1380
- expect(binaryTree.leaves()).toEqual([]);
1381
- });
1382
-
1383
- it('bfs(includeNull=true, no callback): yields undefined placeholders', () => {
1384
- const binTree = new BinaryTree();
1385
- binTree.setMany([-10, -10, -10, 9, 9, 20, null, null, 15, 7, 8, null, 2, null, 6, null, null, 8, 8, 8]);
1386
- const bfsResult = binTree.bfs(undefined, undefined, undefined, true);
1387
- expect(bfsResult).toEqual([
1388
- -10,
1389
- 9,
1390
- 20,
1391
- undefined,
1392
- undefined,
1393
- 15,
1394
- 7,
1395
- 8,
1396
- undefined,
1397
- 2,
1398
- undefined,
1399
- 6,
1400
- undefined,
1401
- undefined
1402
- ]);
1403
- });
1404
- });
1405
-
1406
- describe('BinaryTree (non-Map mode) - higher-order & iteration', () => {
1407
- let binaryTree: BinaryTree<number, string>;
1408
- beforeEach(() => {
1409
- binaryTree = new BinaryTree<number, string>([], { isMapMode: false });
1410
- binaryTree.set([1, 'a']);
1411
- binaryTree.set(2, 'b');
1412
- binaryTree.set([3, 'c']);
1413
- });
1414
-
1415
- it('clone(): preserves structure and allows get() by node', () => {
1416
- const cloned = binaryTree.clone();
1417
- expect(cloned.root?.left?.key).toBe(2);
1418
- expect(cloned.get(cloned.root?.right)).toBe('c');
1419
- });
1420
- });
1421
-
1422
- describe('Coverage boosters - merge/print/iterator/startNode/addMany-mismatch/delete-miss', () => {
1423
- it('merge: merge another tree (Map mode)', () => {
1424
- const a = new BinaryTree<number, string>(
1425
- [
1426
- [2, 'b'],
1427
- [1, 'a']
1428
- ],
1429
- { isMapMode: true }
1430
- );
1431
- const b = new BinaryTree<number, string>(
1432
- [
1433
- [3, 'c'],
1434
- [4, 'd']
1435
- ],
1436
- { isMapMode: true }
1437
- );
1438
- a.merge(b);
1439
- expect(a.size).toBe(4);
1440
- expect(a.get(3)).toBe('c');
1441
- expect(a.get(4)).toBe('d');
1442
- });
1443
-
1444
- it('print: cover console.log branch (invokes toVisual)', () => {
1445
- const t = new BinaryTree<number>([4, 2, 6, 1, 3]);
1446
- const spy = jest.spyOn(console, 'log').mockImplementation(() => void 0);
1447
- t.print({ isShowNull: true } as any, t.root);
1448
- expect(spy).toHaveBeenCalledTimes(1);
1449
- const out: string = (spy.mock.calls[0]?.[0] as string) ?? '';
1450
- expect(out.includes('N for null')).toBe(true);
1451
- spy.mockRestore();
1452
- });
1453
-
1454
- it('for...of: trigger [Symbol.iterator] path (IterableEntryBase)', () => {
1455
- const t = new BinaryTree<number, string>(
1456
- [
1457
- [1, 'x'],
1458
- [2, 'y'],
1459
- [3, 'z']
1460
- ],
1461
- { isMapMode: true } as any
1462
- );
1463
- const arr = Array.from(t); // like Array<[K, V | undefined]>
1464
- const keys = arr.map(e => e?.[0]);
1465
- const vals = arr.map(e => e?.[1]);
1466
- expect(new Set(keys)).toEqual(new Set([1, 2, 3]));
1467
- expect(new Set(vals)).toEqual(new Set(['x', 'y', 'z']));
1468
- });
1469
-
1470
- it('startNode restricted to subtree: hits only within subtree', () => {
1471
- const t = new BinaryTree<number, string>([
1472
- [4, 'd'],
1473
- [2, 'b'],
1474
- [6, 'f'],
1475
- [1, 'a'],
1476
- [3, 'c']
1477
- ]);
1478
- const sub = t.getNode(2)!; // subtree {2,1,3}
1479
- // search 6 in subtree rooted at 2 -> miss
1480
- expect(t.search(6, true, n => (n ? n.key : undefined), sub)).toEqual([]);
1481
- // search 3 -> hit
1482
- expect(t.search(3, true, n => (n ? n.key : undefined), sub)).toEqual([3]);
1483
- });
1484
-
1485
- it('addMany: edge cases when values iterator shorter/longer than keys', () => {
1486
- const t = new BinaryTree<number, number>([], { isMapMode: true } as any);
1487
- // values has only 1 item, keys has 3
1488
- t.setMany([1, 2, 3], [10]);
1489
- expect(t.get(1)).toBe(10);
1490
- expect(t.get(2)).toBeUndefined(); // subsequent value not provided
1491
- expect(t.get(3)).toBeUndefined();
1492
-
1493
- // reverse test: values longer (extra values should be ignored)
1494
- const t2 = new BinaryTree<number, number>([], { isMapMode: true } as any);
1495
- t2.setMany([7, 8], [70, 80, 90, 100]);
1496
- expect(t2.get(7)).toBe(70);
1497
- expect(t2.get(8)).toBe(80);
1498
- });
1499
-
1500
- it('delete non-existent key: returns empty array and does not affect size', () => {
1501
- const t = new BinaryTree<number>([1, 2, 3]);
1502
- const before = t.size;
1503
- const res = t.delete(999);
1504
- expect(Array.isArray(res)).toBe(true);
1505
- expect(res.length).toBe(0);
1506
- expect(t.size).toBe(before);
1507
- });
1508
-
1509
- it('toVisual additional combinations (S only / U only)', () => {
1510
- const t = new BinaryTree<number>([2, 1, 3]);
1511
- const sOnly = t.toVisual(t.root, { isShowRedBlackNIL: true } as any);
1512
- const uOnly = t.toVisual(t.root, { isShowUndefined: true } as any);
1513
- expect(sOnly.includes('S for Sentinel Node')).toBe(true);
1514
- expect(uOnly.startsWith('U for undefined')).toBe(true);
1515
- });
1516
-
1517
- it('clone in Map mode does not share storage: updates in original not visible in clone', () => {
1518
- const t = new BinaryTree<number, string>(
1519
- [
1520
- [1, 'a'],
1521
- [2, 'b']
1522
- ],
1523
- { isMapMode: true } as any
1524
- );
1525
- const c = t.clone() as BinaryTree<number, string>;
1526
- // In the original tree, "replace" the value for the same key (Map mode triggers _store.set)
1527
- t.set([2, 'B']);
1528
- // Clone is independent; it keeps its own values
1529
- expect(c.get(2)).toBe('b');
1530
- });
1531
- });
1532
-
1533
- // === [Coverage boosters - appended at end of file] ===
1534
-
1535
- describe('Coverage boosters - close remaining uncovered branches', () => {
1536
- it('print(): omit all params -> hit default startNode branch', () => {
1537
- const t = new BinaryTree<number>([2, 1, 3]);
1538
- const spy = jest.spyOn(console, 'log').mockImplementation(() => void 0);
1539
- t.print(); // Use default arguments to cover the branch startNode = this._root
1540
- expect(spy).toHaveBeenCalledTimes(1);
1541
- spy.mockRestore();
1542
- });
1543
-
1544
- it('toVisual(): cover default args and empty-tree early return', () => {
1545
- const t1 = new BinaryTree<number>([2, 1, 3]);
1546
- const out1 = t1.toVisual(); // default startNode / options
1547
- expect(typeof out1).toBe('string');
1548
-
1549
- const t2 = new BinaryTree<number>(); // empty tree
1550
- expect(t2.toVisual()).toBe(''); // no root after ensureNode -> directly return empty string
1551
- });
1552
-
1553
- it('for...of (non-Map mode): hit else branch yielding [key, value]', () => {
1554
- // default isMapMode=false
1555
- const t = new BinaryTree<number, string>([
1556
- [1, 'a'],
1557
- [2, 'b']
1558
- ]);
1559
- const got = Array.from(t); // Iterator runs in non-Map mode
1560
- expect(got).toContainEqual([1, 'a']);
1561
- expect(got).toContainEqual([2, 'b']);
1562
- });
1563
-
1564
- it('listLevels(): cover default args + RECURSIVE + includeNull=true', () => {
1565
- // Level-order initialization with nulls to observe includeNull branch
1566
- const t = new BinaryTree<number>([4, 2, 6, null, 3]);
1567
- const levelsDefault = t.listLevels() as any; // default callback/startNode/iterationType
1568
- expect(Array.isArray(levelsDefault)).toBe(true);
1569
-
1570
- // enable includeNull=true (recursive branch)
1571
- const levelsWithNulls = t.listLevels(n => (n ? n.key : null), undefined, 'RECURSIVE', true);
1572
- const hasNull = levelsWithNulls.some(level => level.some(x => x === null));
1573
- expect(hasNull).toBe(true);
1574
- });
1575
-
1576
- it('map(options): pass options to cover _speciesCreate(options) path', () => {
1577
- const t = new BinaryTree<number, string>([
1578
- [1, 'a'],
1579
- [2, 'b']
1580
- ]);
1581
- const mapped = t.map((v, k) => [String(k), (v ?? '').toUpperCase()], { iterationType: 'RECURSIVE' } as any);
1582
- expect(Array.from(mapped)).toEqual([
1583
- ['1', 'A'],
1584
- ['2', 'B']
1585
- ]);
1586
- });
1587
-
1588
- it('set(): build tree with no undefined child slot -> return false path', () => {
1589
- const t = new BinaryTree<number>();
1590
- const r = t.createNode(1)!;
1591
- // explicitly set left/right child pointers to null (not undefined) so BFS finds no insertion slot
1592
- (r as any).left = null;
1593
- (r as any).right = null;
1594
- (t as any)._root = r;
1595
- (t as any)._size = 1;
1596
-
1597
- expect(t.set(2)).toBe(false); // no insertion position -> return false
1598
- });
1599
- });
1600
-
1601
- // === [Coverage Boosters #2 - append below] ===
1602
- describe('Coverage boosters v2 - hit remaining statements', () => {
1603
- it('BinaryTreeNode.familyPosition -> MAL_NODE when parent does not point back', () => {
1604
- const parent = new BinaryTreeNode<number>(1);
1605
- const child = new BinaryTreeNode<number>(2);
1606
- (child as any).parent = parent; // one-way parent assignment; parent does not attach child as left/right
1607
- expect(child.familyPosition).toBe('MAL_NODE');
1608
- });
1609
-
1610
- it('set(): returns false when tree has no undefined slots (all defined as null)', () => {
1611
- const t = new BinaryTree<number>();
1612
- const root = new BinaryTreeNode<number>(1);
1613
- (root as any).left = null;
1614
- (root as any).right = null;
1615
- (t as any)._root = root;
1616
- (t as any)._size = 1;
1617
- expect(t.set(2)).toBe(false); // no slot with left/right undefined after queue traversal
1618
- });
1619
-
1620
- it('getSuccessor(): climb ancestors while x is a right child', () => {
1621
- const t = new BinaryTree<number>();
1622
- const a = new BinaryTreeNode<number>(1);
1623
- const b = new BinaryTreeNode<number>(2);
1624
- const c = new BinaryTreeNode<number>(3);
1625
- (t as any)._root = a;
1626
- a.right = b;
1627
- (b as any).parent = a;
1628
- b.right = c;
1629
- (c as any).parent = b;
1630
- expect(t.getSuccessor(c)).toBe(undefined); // trigger multiple climbs in while (x === y.right)
1631
- });
1632
-
1633
- it('getPredecessor(): walk to right-most of left subtree', () => {
1634
- const t = new BinaryTree<number>();
1635
- const n5 = new BinaryTreeNode<number>(5);
1636
- const n3 = new BinaryTreeNode<number>(3);
1637
- const n4 = new BinaryTreeNode<number>(4);
1638
- (t as any)._root = n5;
1639
- n5.left = n3;
1640
- (n3 as any).parent = n5;
1641
- n3.right = n4;
1642
- (n4 as any).parent = n3;
1643
- expect(t.getPredecessor(n5)).toBe(n4); // hit the while loop
1644
- });
1645
-
1646
- it('_extractKey via Map mode: get/has on entry tuple + null/undefined keys', () => {
1647
- const t = new BinaryTree<number, string>([], { isMapMode: true } as any);
1648
- t.set([1, 'a']);
1649
- t.set([2, 'b']);
1650
- expect(t.get([2, 'anything'] as any)).toBe('b'); // entry tuple path
1651
- expect(t.has([1, 'x'] as any)).toBe(true);
1652
- expect(t.get([null as any, 'x'] as any)).toBeUndefined(); // null key
1653
- expect(t.get([undefined as any, 'x'] as any)).toBeUndefined(); // undefined key
1654
- });
1655
-
1656
- it('_setValue: value is undefined branch executes (Map mode)', () => {
1657
- const t = new BinaryTree<number, string>([], { isMapMode: true } as any);
1658
- expect(t.set([10, undefined] as any)).toBe(true); // trigger _setValue branch where value is undefined
1659
- expect(t.get(10)).toBeUndefined();
1660
- });
1661
-
1662
- it('print(): default-args branch (no params)', () => {
1663
- const t = new BinaryTree<number>([2, 1, 3]);
1664
- const spy = jest.spyOn(console, 'log').mockImplementation(() => void 0);
1665
- t.print(); // no arguments -> hit default startNode branch
1666
- expect(spy).toHaveBeenCalledTimes(1);
1667
- spy.mockRestore();
1668
- });
1669
-
1670
- it('search(undefined): returns [] (early return)', () => {
1671
- const t = new BinaryTree<number>([1, 2, 3]);
1672
- expect(t.search(undefined as any)).toEqual([]);
1673
- expect(t.search(null as any)).toEqual([]);
1674
- });
1675
-
1676
- it('isValidKey(null): returns true', () => {
1677
- const t = new BinaryTree<number>();
1678
- expect(t.isValidKey(null)).toBe(true);
1679
- });
1680
- });
1681
-
1682
- describe('Classic usage examples', () => {
1683
- it('@example basic BinaryTree creation and insertion', () => {
1684
- // Create a BinaryTree with entries
1685
- const entries: [number, string][] = [
1686
- [6, 'six'],
1687
- [1, 'one'],
1688
- [2, 'two'],
1689
- [7, 'seven'],
1690
- [5, 'five'],
1691
- [3, 'three'],
1692
- [4, 'four'],
1693
- [9, 'nine'],
1694
- [8, 'eight']
1695
- ];
1696
-
1697
- const tree = new BinaryTree(entries);
1698
-
1699
- // Verify size
1700
- expect(tree.size).toBe(9);
1701
-
1702
- // Add new element
1703
- tree.set(10, 'ten');
1704
- expect(tree.size).toBe(10);
1705
- });
1706
-
1707
- it('@example BinaryTree get and has operations', () => {
1708
- const tree = new BinaryTree(
1709
- [
1710
- [5, 'five'],
1711
- [3, 'three'],
1712
- [7, 'seven'],
1713
- [1, 'one'],
1714
- [4, 'four'],
1715
- [6, 'six'],
1716
- [8, 'eight']
1717
- ],
1718
- { isMapMode: false }
1719
- );
1720
-
1721
- // Check if key exists
1722
- expect(tree.has(5)).toBe(true);
1723
- expect(tree.has(10)).toBe(false);
1724
-
1725
- // Get value by key
1726
- expect(tree.get(3)).toBe('three');
1727
- expect(tree.get(7)).toBe('seven');
1728
- expect(tree.get(100)).toBeUndefined();
1729
-
1730
- // Get node structure
1731
- const node = tree.getNode(5);
1732
- expect(node?.key).toBe(5);
1733
- expect(node?.value).toBe('five');
1734
- });
1735
-
1736
- it('@example BinaryTree level-order traversal', () => {
1737
- const tree = new BinaryTree([
1738
- [1, 'one'],
1739
- [2, 'two'],
1740
- [3, 'three'],
1741
- [4, 'four'],
1742
- [5, 'five'],
1743
- [6, 'six'],
1744
- [7, 'seven']
1745
- ]);
1746
-
1747
- // Binary tree maintains level-order insertion
1748
- // Complete binary tree structure
1749
- expect(tree.size).toBe(7);
1750
-
1751
- // Verify all keys are present
1752
- expect(tree.has(1)).toBe(true);
1753
- expect(tree.has(4)).toBe(true);
1754
- expect(tree.has(7)).toBe(true);
1755
-
1756
- // Iterate through tree
1757
- const keys: number[] = [];
1758
- for (const [key] of tree) {
1759
- keys.push(key);
1760
- }
1761
- expect(keys.length).toBe(7);
1762
- });
1763
-
1764
- it('@example determine loan approval using a decision tree', () => {
1765
- // Decision tree structure
1766
- const loanDecisionTree = new BinaryTree<string>(
1767
- ['stableIncome', 'goodCredit', 'Rejected', 'Approved', 'Rejected'],
1768
- { isDuplicate: true }
1769
- );
1770
-
1771
- function determineLoanApproval(
1772
- node?: BinaryTreeNode<string> | null,
1773
- conditions?: { [key: string]: boolean }
1774
- ): string {
1775
- if (!node) throw new Error('Invalid node');
1776
-
1777
- // If it's a leaf node, return the decision result
1778
- if (!node.left && !node.right) return node.key;
1779
-
1780
- // Check if a valid condition exists for the current node's key
1781
- return conditions?.[node.key]
1782
- ? determineLoanApproval(node.left, conditions)
1783
- : determineLoanApproval(node.right, conditions);
1784
- }
1785
-
1786
- // Test case 1: Stable income and good credit score
1787
- expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: true })).toBe('Approved');
1788
-
1789
- // Test case 2: Stable income but poor credit score
1790
- expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: false })).toBe('Rejected');
1791
-
1792
- // Test case 3: No stable income
1793
- expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: true })).toBe('Rejected');
1794
-
1795
- // Test case 4: No stable income and poor credit score
1796
- expect(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: false })).toBe('Rejected');
1797
- });
1798
-
1799
- it('@example evaluate the arithmetic expression represented by the binary tree', () => {
1800
- const expressionTree = new BinaryTree<number | string>(['+', 3, '*', null, null, 5, '-', null, null, 2, 8]);
1801
-
1802
- function evaluate(node?: BinaryTreeNode<number | string> | null): number {
1803
- if (!node) return 0;
1804
-
1805
- if (typeof node.key === 'number') return node.key;
1806
-
1807
- const leftValue = evaluate(node.left); // Evaluate the left subtree
1808
- const rightValue = evaluate(node.right); // Evaluate the right subtree
1809
-
1810
- // Perform the operation based on the current node's operator
1811
- switch (node.key) {
1812
- case '+':
1813
- return leftValue + rightValue;
1814
- case '-':
1815
- return leftValue - rightValue;
1816
- case '*':
1817
- return leftValue * rightValue;
1818
- case '/':
1819
- return rightValue !== 0 ? leftValue / rightValue : 0; // Handle division by zero
1820
- default:
1821
- throw new Error(`Unsupported operator: ${node.key}`);
1822
- }
1823
- }
1824
-
1825
- expect(evaluate(expressionTree.root)).toBe(-27);
1826
- });
1827
-
1828
- it('BinaryTree getHeight and structure queries', () => {
1829
- const tree = new BinaryTree([
1830
- [1, 'one'],
1831
- [2, 'two'],
1832
- [3, 'three'],
1833
- [4, 'four'],
1834
- [5, 'five'],
1835
- [6, 'six'],
1836
- [7, 'seven'],
1837
- [8, 'eight'],
1838
- [9, 'nine'],
1839
- [10, 'ten'],
1840
- [11, 'eleven'],
1841
- [12, 'twelve'],
1842
- [13, 'thirteen'],
1843
- [14, 'fourteen'],
1844
- [15, 'fifteen']
1845
- ]);
1846
-
1847
- // Get overall tree height
1848
- const height = tree.getHeight();
1849
- expect(typeof height).toBe('number');
1850
- expect(height).toBeGreaterThan(0);
1851
-
1852
- // Complete binary tree with 15 nodes has height 3 (0-indexed from leaves)
1853
- expect(height).toBe(3);
1854
-
1855
- // Get height of specific node
1856
- const heightOf2 = tree.getHeight(2);
1857
- expect(typeof heightOf2).toBe('number');
1858
-
1859
- // Root should have maximum height
1860
- const heightOf1 = tree.getHeight(1);
1861
- expect(heightOf1).toBe(height);
1862
- });
1863
-
1864
- it('BinaryTree for hierarchical data representation', () => {
1865
- interface FileSystem {
1866
- id: number;
1867
- name: string;
1868
- type: 'file' | 'folder';
1869
- size: number;
1870
- }
1871
-
1872
- // Binary trees are ideal for complete binary trees and heap-like structures
1873
- // Here we use it for representing a file system hierarchy
1874
- const fileSystem = new BinaryTree<number, FileSystem>([
1875
- [1, { id: 1, name: 'root', type: 'folder', size: 1000 }],
1876
- [2, { id: 2, name: 'documents', type: 'folder', size: 500 }],
1877
- [3, { id: 3, name: 'images', type: 'folder', size: 400 }],
1878
- [4, { id: 4, name: 'file1.txt', type: 'file', size: 10 }],
1879
- [5, { id: 5, name: 'file2.txt', type: 'file', size: 20 }],
1880
- [6, { id: 6, name: 'photo.jpg', type: 'file', size: 150 }],
1881
- [7, { id: 7, name: 'video.mp4', type: 'file', size: 250 }]
1882
- ]);
1883
-
1884
- expect(fileSystem.size).toBe(7);
1885
-
1886
- // Quick lookup by ID
1887
- const rootFolder = fileSystem.get(1);
1888
- expect(rootFolder?.name).toBe('root');
1889
- expect(rootFolder?.type).toBe('folder');
1890
-
1891
- // Check existence
1892
- expect(fileSystem.has(4)).toBe(true);
1893
- expect(fileSystem.has(99)).toBe(false);
1894
-
1895
- // Get node with children info
1896
- const node = fileSystem.getNode(1);
1897
- expect(node?.key).toBe(1);
1898
- expect(node?.left).toBeDefined();
1899
- expect(node?.right).toBeDefined();
1900
-
1901
- // Calculate tree height
1902
- const treeHeight = fileSystem.getHeight();
1903
- expect(treeHeight).toBeGreaterThan(0);
1904
-
1905
- // Add new file
1906
- fileSystem.set(8, { id: 8, name: 'archive.zip', type: 'file', size: 300 });
1907
- expect(fileSystem.size).toBe(8);
1908
-
1909
- // Verify complete binary tree structure
1910
- expect(fileSystem.has(8)).toBe(true);
1911
- });
1912
- });