data-structure-typed 2.4.1 → 2.4.3

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 (738) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/cjs/index.cjs +36 -9
  3. package/dist/cjs-legacy/index.cjs +36 -9
  4. package/dist/esm/index.mjs +36 -9
  5. package/dist/esm-legacy/index.mjs +36 -9
  6. package/dist/types/data-structures/binary-tree/tree-map.d.ts +10 -0
  7. package/dist/types/data-structures/binary-tree/tree-set.d.ts +10 -0
  8. package/dist/umd/data-structure-typed.js +36 -8
  9. package/dist/umd/data-structure-typed.min.js +2 -2
  10. package/package.json +7 -5
  11. package/src/data-structures/binary-tree/tree-map.ts +16 -0
  12. package/src/data-structures/binary-tree/tree-set.ts +16 -0
  13. package/src/data-structures/trie/trie.ts +6 -8
  14. package/CMakeLists.txt +0 -52
  15. package/benchmark/report.html +0 -221
  16. package/benchmark/report.json +0 -1972
  17. package/build/CMakeCache.txt +0 -603
  18. package/build/CMakeFiles/4.0.3/CMakeCXXCompiler.cmake +0 -104
  19. package/build/CMakeFiles/4.0.3/CMakeDetermineCompilerABI_CXX.bin +0 -0
  20. package/build/CMakeFiles/4.0.3/CMakeSystem.cmake +0 -15
  21. package/build/CMakeFiles/4.0.3/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -920
  22. package/build/CMakeFiles/4.0.3/CompilerIdCXX/a.out +0 -0
  23. package/build/CMakeFiles/4.0.3/CompilerIdCXX/apple-sdk.cpp +0 -1
  24. package/build/CMakeFiles/CMakeConfigureLog.yaml +0 -2146
  25. package/build/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  26. package/build/CMakeFiles/InstallScripts.json +0 -9
  27. package/build/CMakeFiles/Makefile.cmake +0 -100
  28. package/build/CMakeFiles/Makefile2 +0 -720
  29. package/build/CMakeFiles/TargetDirectories.txt +0 -23
  30. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/DependInfo.cmake +0 -23
  31. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/build.make +0 -114
  32. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/cmake_clean.cmake +0 -11
  33. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.internal +0 -839
  34. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.make +0 -2506
  35. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/compiler_depend.ts +0 -2
  36. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/depend.make +0 -2
  37. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/flags.make +0 -10
  38. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/link.txt +0 -1
  39. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/progress.make +0 -3
  40. package/build/CMakeFiles/avl-rb-range-search-benchmark.dir/test/performance/data-structures/binary-tree/avl-rb-range-search.test.cpp.o +0 -0
  41. 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
  42. package/build/CMakeFiles/avl-tree-benchmark.dir/DependInfo.cmake +0 -23
  43. package/build/CMakeFiles/avl-tree-benchmark.dir/build.make +0 -114
  44. package/build/CMakeFiles/avl-tree-benchmark.dir/cmake_clean.cmake +0 -11
  45. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.internal +0 -839
  46. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.make +0 -2506
  47. package/build/CMakeFiles/avl-tree-benchmark.dir/compiler_depend.ts +0 -2
  48. package/build/CMakeFiles/avl-tree-benchmark.dir/depend.make +0 -2
  49. package/build/CMakeFiles/avl-tree-benchmark.dir/flags.make +0 -10
  50. package/build/CMakeFiles/avl-tree-benchmark.dir/link.txt +0 -1
  51. package/build/CMakeFiles/avl-tree-benchmark.dir/progress.make +0 -3
  52. package/build/CMakeFiles/avl-tree-benchmark.dir/test/performance/data-structures/binary-tree/avl-tree.test.cpp.o +0 -0
  53. package/build/CMakeFiles/avl-tree-benchmark.dir/test/performance/data-structures/binary-tree/avl-tree.test.cpp.o.d +0 -835
  54. package/build/CMakeFiles/cmake.check_cache +0 -1
  55. package/build/CMakeFiles/deque-benchmark.dir/DependInfo.cmake +0 -23
  56. package/build/CMakeFiles/deque-benchmark.dir/build.make +0 -114
  57. package/build/CMakeFiles/deque-benchmark.dir/cmake_clean.cmake +0 -11
  58. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.internal +0 -791
  59. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.make +0 -2362
  60. package/build/CMakeFiles/deque-benchmark.dir/compiler_depend.ts +0 -2
  61. package/build/CMakeFiles/deque-benchmark.dir/depend.make +0 -2
  62. package/build/CMakeFiles/deque-benchmark.dir/flags.make +0 -10
  63. package/build/CMakeFiles/deque-benchmark.dir/link.txt +0 -1
  64. package/build/CMakeFiles/deque-benchmark.dir/progress.make +0 -3
  65. package/build/CMakeFiles/deque-benchmark.dir/test/performance/data-structures/queue/deque.test.cpp.o +0 -0
  66. package/build/CMakeFiles/deque-benchmark.dir/test/performance/data-structures/queue/deque.test.cpp.o.d +0 -787
  67. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/DependInfo.cmake +0 -23
  68. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/build.make +0 -114
  69. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/cmake_clean.cmake +0 -11
  70. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.internal +0 -790
  71. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.make +0 -2359
  72. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/compiler_depend.ts +0 -2
  73. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/depend.make +0 -2
  74. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/flags.make +0 -10
  75. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/link.txt +0 -1
  76. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/progress.make +0 -3
  77. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp.o +0 -0
  78. package/build/CMakeFiles/doubly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp.o.d +0 -786
  79. package/build/CMakeFiles/hash-map-benchmark.dir/DependInfo.cmake +0 -23
  80. package/build/CMakeFiles/hash-map-benchmark.dir/build.make +0 -114
  81. package/build/CMakeFiles/hash-map-benchmark.dir/cmake_clean.cmake +0 -11
  82. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.internal +0 -790
  83. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.make +0 -2359
  84. package/build/CMakeFiles/hash-map-benchmark.dir/compiler_depend.ts +0 -2
  85. package/build/CMakeFiles/hash-map-benchmark.dir/depend.make +0 -2
  86. package/build/CMakeFiles/hash-map-benchmark.dir/flags.make +0 -10
  87. package/build/CMakeFiles/hash-map-benchmark.dir/link.txt +0 -1
  88. package/build/CMakeFiles/hash-map-benchmark.dir/progress.make +0 -3
  89. package/build/CMakeFiles/hash-map-benchmark.dir/test/performance/data-structures/hash/hash-map.test.cpp.o +0 -0
  90. package/build/CMakeFiles/hash-map-benchmark.dir/test/performance/data-structures/hash/hash-map.test.cpp.o.d +0 -786
  91. package/build/CMakeFiles/heap-benchmark.dir/DependInfo.cmake +0 -23
  92. package/build/CMakeFiles/heap-benchmark.dir/build.make +0 -114
  93. package/build/CMakeFiles/heap-benchmark.dir/cmake_clean.cmake +0 -11
  94. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.internal +0 -843
  95. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.make +0 -2518
  96. package/build/CMakeFiles/heap-benchmark.dir/compiler_depend.ts +0 -2
  97. package/build/CMakeFiles/heap-benchmark.dir/depend.make +0 -2
  98. package/build/CMakeFiles/heap-benchmark.dir/flags.make +0 -10
  99. package/build/CMakeFiles/heap-benchmark.dir/link.txt +0 -1
  100. package/build/CMakeFiles/heap-benchmark.dir/progress.make +0 -3
  101. package/build/CMakeFiles/heap-benchmark.dir/test/performance/data-structures/heap/heap.test.cpp.o +0 -0
  102. package/build/CMakeFiles/heap-benchmark.dir/test/performance/data-structures/heap/heap.test.cpp.o.d +0 -839
  103. package/build/CMakeFiles/priority-queue-benchmark.dir/DependInfo.cmake +0 -23
  104. package/build/CMakeFiles/priority-queue-benchmark.dir/build.make +0 -114
  105. package/build/CMakeFiles/priority-queue-benchmark.dir/cmake_clean.cmake +0 -11
  106. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.internal +0 -793
  107. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.make +0 -2368
  108. package/build/CMakeFiles/priority-queue-benchmark.dir/compiler_depend.ts +0 -2
  109. package/build/CMakeFiles/priority-queue-benchmark.dir/depend.make +0 -2
  110. package/build/CMakeFiles/priority-queue-benchmark.dir/flags.make +0 -10
  111. package/build/CMakeFiles/priority-queue-benchmark.dir/link.txt +0 -1
  112. package/build/CMakeFiles/priority-queue-benchmark.dir/progress.make +0 -3
  113. package/build/CMakeFiles/priority-queue-benchmark.dir/test/performance/data-structures/priority-queue/priority-queue.test.cpp.o +0 -0
  114. package/build/CMakeFiles/priority-queue-benchmark.dir/test/performance/data-structures/priority-queue/priority-queue.test.cpp.o.d +0 -789
  115. package/build/CMakeFiles/progress.marks +0 -1
  116. package/build/CMakeFiles/queue-benchmark.dir/DependInfo.cmake +0 -23
  117. package/build/CMakeFiles/queue-benchmark.dir/build.make +0 -114
  118. package/build/CMakeFiles/queue-benchmark.dir/cmake_clean.cmake +0 -11
  119. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.internal +0 -793
  120. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.make +0 -2368
  121. package/build/CMakeFiles/queue-benchmark.dir/compiler_depend.ts +0 -2
  122. package/build/CMakeFiles/queue-benchmark.dir/depend.make +0 -2
  123. package/build/CMakeFiles/queue-benchmark.dir/flags.make +0 -10
  124. package/build/CMakeFiles/queue-benchmark.dir/link.txt +0 -1
  125. package/build/CMakeFiles/queue-benchmark.dir/progress.make +0 -3
  126. package/build/CMakeFiles/queue-benchmark.dir/test/performance/data-structures/queue/queue.test.cpp.o +0 -0
  127. package/build/CMakeFiles/queue-benchmark.dir/test/performance/data-structures/queue/queue.test.cpp.o.d +0 -789
  128. package/build/CMakeFiles/red-black-tree-benchmark.dir/DependInfo.cmake +0 -23
  129. package/build/CMakeFiles/red-black-tree-benchmark.dir/build.make +0 -114
  130. package/build/CMakeFiles/red-black-tree-benchmark.dir/cmake_clean.cmake +0 -11
  131. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.internal +0 -839
  132. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.make +0 -2506
  133. package/build/CMakeFiles/red-black-tree-benchmark.dir/compiler_depend.ts +0 -2
  134. package/build/CMakeFiles/red-black-tree-benchmark.dir/depend.make +0 -2
  135. package/build/CMakeFiles/red-black-tree-benchmark.dir/flags.make +0 -10
  136. package/build/CMakeFiles/red-black-tree-benchmark.dir/link.txt +0 -1
  137. package/build/CMakeFiles/red-black-tree-benchmark.dir/progress.make +0 -3
  138. package/build/CMakeFiles/red-black-tree-benchmark.dir/test/performance/data-structures/binary-tree/red-black-tree.test.cpp.o +0 -0
  139. package/build/CMakeFiles/red-black-tree-benchmark.dir/test/performance/data-structures/binary-tree/red-black-tree.test.cpp.o.d +0 -835
  140. package/build/CMakeFiles/singly-linked-list-benchmark.dir/DependInfo.cmake +0 -23
  141. package/build/CMakeFiles/singly-linked-list-benchmark.dir/build.make +0 -114
  142. package/build/CMakeFiles/singly-linked-list-benchmark.dir/cmake_clean.cmake +0 -11
  143. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.internal +0 -790
  144. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.make +0 -2359
  145. package/build/CMakeFiles/singly-linked-list-benchmark.dir/compiler_depend.ts +0 -2
  146. package/build/CMakeFiles/singly-linked-list-benchmark.dir/depend.make +0 -2
  147. package/build/CMakeFiles/singly-linked-list-benchmark.dir/flags.make +0 -10
  148. package/build/CMakeFiles/singly-linked-list-benchmark.dir/link.txt +0 -1
  149. package/build/CMakeFiles/singly-linked-list-benchmark.dir/progress.make +0 -3
  150. package/build/CMakeFiles/singly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/singly-linked-list.test.cpp.o +0 -0
  151. package/build/CMakeFiles/singly-linked-list-benchmark.dir/test/performance/data-structures/linked-list/singly-linked-list.test.cpp.o.d +0 -786
  152. package/build/CMakeFiles/stack-benchmark.dir/DependInfo.cmake +0 -23
  153. package/build/CMakeFiles/stack-benchmark.dir/build.make +0 -114
  154. package/build/CMakeFiles/stack-benchmark.dir/cmake_clean.cmake +0 -11
  155. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.internal +0 -793
  156. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.make +0 -2368
  157. package/build/CMakeFiles/stack-benchmark.dir/compiler_depend.ts +0 -2
  158. package/build/CMakeFiles/stack-benchmark.dir/depend.make +0 -2
  159. package/build/CMakeFiles/stack-benchmark.dir/flags.make +0 -10
  160. package/build/CMakeFiles/stack-benchmark.dir/link.txt +0 -1
  161. package/build/CMakeFiles/stack-benchmark.dir/progress.make +0 -3
  162. package/build/CMakeFiles/stack-benchmark.dir/test/performance/data-structures/stack/stack.test.cpp.o +0 -0
  163. package/build/CMakeFiles/stack-benchmark.dir/test/performance/data-structures/stack/stack.test.cpp.o.d +0 -789
  164. package/build/CMakeFiles/tree-map-benchmark.dir/DependInfo.cmake +0 -23
  165. package/build/CMakeFiles/tree-map-benchmark.dir/build.make +0 -114
  166. package/build/CMakeFiles/tree-map-benchmark.dir/cmake_clean.cmake +0 -11
  167. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.internal +0 -839
  168. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.make +0 -2506
  169. package/build/CMakeFiles/tree-map-benchmark.dir/compiler_depend.ts +0 -2
  170. package/build/CMakeFiles/tree-map-benchmark.dir/depend.make +0 -2
  171. package/build/CMakeFiles/tree-map-benchmark.dir/flags.make +0 -10
  172. package/build/CMakeFiles/tree-map-benchmark.dir/link.txt +0 -1
  173. package/build/CMakeFiles/tree-map-benchmark.dir/progress.make +0 -3
  174. package/build/CMakeFiles/tree-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-map.test.cpp.o +0 -0
  175. package/build/CMakeFiles/tree-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-map.test.cpp.o.d +0 -835
  176. package/build/CMakeFiles/tree-multi-map-benchmark.dir/DependInfo.cmake +0 -23
  177. package/build/CMakeFiles/tree-multi-map-benchmark.dir/build.make +0 -114
  178. package/build/CMakeFiles/tree-multi-map-benchmark.dir/cmake_clean.cmake +0 -11
  179. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.internal +0 -839
  180. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.make +0 -2506
  181. package/build/CMakeFiles/tree-multi-map-benchmark.dir/compiler_depend.ts +0 -2
  182. package/build/CMakeFiles/tree-multi-map-benchmark.dir/depend.make +0 -2
  183. package/build/CMakeFiles/tree-multi-map-benchmark.dir/flags.make +0 -10
  184. package/build/CMakeFiles/tree-multi-map-benchmark.dir/link.txt +0 -1
  185. package/build/CMakeFiles/tree-multi-map-benchmark.dir/progress.make +0 -3
  186. package/build/CMakeFiles/tree-multi-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp.o +0 -0
  187. package/build/CMakeFiles/tree-multi-map-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp.o.d +0 -835
  188. package/build/CMakeFiles/tree-multi-set-benchmark.dir/DependInfo.cmake +0 -23
  189. package/build/CMakeFiles/tree-multi-set-benchmark.dir/build.make +0 -114
  190. package/build/CMakeFiles/tree-multi-set-benchmark.dir/cmake_clean.cmake +0 -11
  191. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.internal +0 -839
  192. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.make +0 -2506
  193. package/build/CMakeFiles/tree-multi-set-benchmark.dir/compiler_depend.ts +0 -2
  194. package/build/CMakeFiles/tree-multi-set-benchmark.dir/depend.make +0 -2
  195. package/build/CMakeFiles/tree-multi-set-benchmark.dir/flags.make +0 -10
  196. package/build/CMakeFiles/tree-multi-set-benchmark.dir/link.txt +0 -1
  197. package/build/CMakeFiles/tree-multi-set-benchmark.dir/progress.make +0 -3
  198. package/build/CMakeFiles/tree-multi-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp.o +0 -0
  199. package/build/CMakeFiles/tree-multi-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp.o.d +0 -835
  200. package/build/CMakeFiles/tree-set-benchmark.dir/DependInfo.cmake +0 -23
  201. package/build/CMakeFiles/tree-set-benchmark.dir/build.make +0 -114
  202. package/build/CMakeFiles/tree-set-benchmark.dir/cmake_clean.cmake +0 -11
  203. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.internal +0 -839
  204. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.make +0 -2506
  205. package/build/CMakeFiles/tree-set-benchmark.dir/compiler_depend.ts +0 -2
  206. package/build/CMakeFiles/tree-set-benchmark.dir/depend.make +0 -2
  207. package/build/CMakeFiles/tree-set-benchmark.dir/flags.make +0 -10
  208. package/build/CMakeFiles/tree-set-benchmark.dir/link.txt +0 -1
  209. package/build/CMakeFiles/tree-set-benchmark.dir/progress.make +0 -3
  210. package/build/CMakeFiles/tree-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-set.test.cpp.o +0 -0
  211. package/build/CMakeFiles/tree-set-benchmark.dir/test/performance/data-structures/binary-tree/tree-set.test.cpp.o.d +0 -835
  212. package/build/Makefile +0 -783
  213. package/build/_deps/benchmark-build/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  214. package/build/_deps/benchmark-build/CMakeFiles/progress.marks +0 -1
  215. package/build/_deps/benchmark-build/Makefile +0 -140
  216. package/build/_deps/benchmark-build/benchmark.pc +0 -12
  217. package/build/_deps/benchmark-build/benchmarkConfig.cmake +0 -14
  218. package/build/_deps/benchmark-build/benchmarkConfigVersion.cmake +0 -65
  219. package/build/_deps/benchmark-build/benchmarkTargets.cmake +0 -84
  220. package/build/_deps/benchmark-build/cmake_install.cmake +0 -50
  221. package/build/_deps/benchmark-build/src/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  222. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/DependInfo.cmake +0 -41
  223. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark.cc.o +0 -0
  224. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark.cc.o.d +0 -875
  225. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_api_internal.cc.o +0 -0
  226. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_api_internal.cc.o.d +0 -802
  227. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_name.cc.o +0 -0
  228. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_name.cc.o.d +0 -772
  229. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o +0 -0
  230. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o.d +0 -841
  231. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_runner.cc.o +0 -0
  232. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/benchmark_runner.cc.o.d +0 -833
  233. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/build.make +0 -402
  234. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/check.cc.o +0 -0
  235. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/check.cc.o.d +0 -784
  236. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/cmake_clean.cmake +0 -47
  237. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/cmake_clean_target.cmake +0 -3
  238. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/colorprint.cc.o +0 -0
  239. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/colorprint.cc.o.d +0 -791
  240. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/commandlineflags.cc.o +0 -0
  241. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/commandlineflags.cc.o.d +0 -795
  242. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.internal +0 -15519
  243. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.make +0 -17500
  244. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/compiler_depend.ts +0 -2
  245. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/complexity.cc.o +0 -0
  246. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/complexity.cc.o.d +0 -793
  247. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/console_reporter.cc.o +0 -0
  248. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/console_reporter.cc.o.d +0 -802
  249. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/counter.cc.o +0 -0
  250. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/counter.cc.o.d +0 -773
  251. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/csv_reporter.cc.o +0 -0
  252. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/csv_reporter.cc.o.d +0 -799
  253. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/depend.make +0 -2
  254. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/flags.make +0 -10
  255. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/json_reporter.cc.o +0 -0
  256. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/json_reporter.cc.o.d +0 -800
  257. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/link.txt +0 -2
  258. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/perf_counters.cc.o +0 -0
  259. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/perf_counters.cc.o.d +0 -807
  260. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/progress.make +0 -21
  261. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/reporter.cc.o +0 -0
  262. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/reporter.cc.o.d +0 -798
  263. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/statistics.cc.o +0 -0
  264. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/statistics.cc.o.d +0 -800
  265. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/string_util.cc.o +0 -0
  266. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/string_util.cc.o.d +0 -795
  267. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/sysinfo.cc.o +0 -0
  268. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/sysinfo.cc.o.d +0 -933
  269. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/timers.cc.o +0 -0
  270. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark.dir/timers.cc.o.d +0 -904
  271. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/DependInfo.cmake +0 -23
  272. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/benchmark_main.cc.o +0 -0
  273. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/benchmark_main.cc.o.d +0 -772
  274. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/build.make +0 -114
  275. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/cmake_clean.cmake +0 -11
  276. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/cmake_clean_target.cmake +0 -3
  277. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.internal +0 -776
  278. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.make +0 -2317
  279. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/compiler_depend.ts +0 -2
  280. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/depend.make +0 -2
  281. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/flags.make +0 -10
  282. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/link.txt +0 -2
  283. package/build/_deps/benchmark-build/src/CMakeFiles/benchmark_main.dir/progress.make +0 -3
  284. package/build/_deps/benchmark-build/src/CMakeFiles/progress.marks +0 -1
  285. package/build/_deps/benchmark-build/src/Makefile +0 -710
  286. package/build/_deps/benchmark-build/src/cmake_install.cmake +0 -45
  287. package/build/_deps/benchmark-build/src/libbenchmark.a +0 -0
  288. package/build/_deps/benchmark-build/src/libbenchmark_main.a +0 -0
  289. package/build/_deps/benchmark-src/.clang-format +0 -5
  290. package/build/_deps/benchmark-src/.clang-tidy +0 -7
  291. package/build/_deps/benchmark-src/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  292. package/build/_deps/benchmark-src/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  293. package/build/_deps/benchmark-src/.github/install_bazel.sh +0 -13
  294. package/build/_deps/benchmark-src/.github/libcxx-setup.sh +0 -26
  295. package/build/_deps/benchmark-src/.github/workflows/bazel.yml +0 -35
  296. package/build/_deps/benchmark-src/.github/workflows/build-and-test-min-cmake.yml +0 -46
  297. package/build/_deps/benchmark-src/.github/workflows/build-and-test-perfcounters.yml +0 -51
  298. package/build/_deps/benchmark-src/.github/workflows/build-and-test.yml +0 -114
  299. package/build/_deps/benchmark-src/.github/workflows/clang-format-lint.yml +0 -17
  300. package/build/_deps/benchmark-src/.github/workflows/clang-tidy.yml +0 -38
  301. package/build/_deps/benchmark-src/.github/workflows/doxygen.yml +0 -28
  302. package/build/_deps/benchmark-src/.github/workflows/pylint.yml +0 -28
  303. package/build/_deps/benchmark-src/.github/workflows/sanitizer.yml +0 -96
  304. package/build/_deps/benchmark-src/.github/workflows/test_bindings.yml +0 -29
  305. package/build/_deps/benchmark-src/.github/workflows/wheels.yml +0 -79
  306. package/build/_deps/benchmark-src/.travis.yml +0 -208
  307. package/build/_deps/benchmark-src/.ycm_extra_conf.py +0 -115
  308. package/build/_deps/benchmark-src/AUTHORS +0 -71
  309. package/build/_deps/benchmark-src/BUILD.bazel +0 -87
  310. package/build/_deps/benchmark-src/CMakeLists.txt +0 -340
  311. package/build/_deps/benchmark-src/CONTRIBUTING.md +0 -58
  312. package/build/_deps/benchmark-src/CONTRIBUTORS +0 -95
  313. package/build/_deps/benchmark-src/LICENSE +0 -202
  314. package/build/_deps/benchmark-src/MODULE.bazel +0 -24
  315. package/build/_deps/benchmark-src/README.md +0 -223
  316. package/build/_deps/benchmark-src/WORKSPACE +0 -22
  317. package/build/_deps/benchmark-src/WORKSPACE.bzlmod +0 -2
  318. package/build/_deps/benchmark-src/_config.yml +0 -2
  319. package/build/_deps/benchmark-src/appveyor.yml +0 -50
  320. package/build/_deps/benchmark-src/bazel/benchmark_deps.bzl +0 -65
  321. package/build/_deps/benchmark-src/bindings/python/BUILD +0 -3
  322. package/build/_deps/benchmark-src/bindings/python/build_defs.bzl +0 -25
  323. package/build/_deps/benchmark-src/bindings/python/google_benchmark/BUILD +0 -40
  324. package/build/_deps/benchmark-src/bindings/python/google_benchmark/__init__.py +0 -162
  325. package/build/_deps/benchmark-src/bindings/python/google_benchmark/benchmark.cc +0 -184
  326. package/build/_deps/benchmark-src/bindings/python/google_benchmark/example.py +0 -136
  327. package/build/_deps/benchmark-src/bindings/python/nanobind.BUILD +0 -17
  328. package/build/_deps/benchmark-src/bindings/python/python_headers.BUILD +0 -6
  329. package/build/_deps/benchmark-src/cmake/AddCXXCompilerFlag.cmake +0 -78
  330. package/build/_deps/benchmark-src/cmake/CXXFeatureCheck.cmake +0 -82
  331. package/build/_deps/benchmark-src/cmake/Config.cmake.in +0 -7
  332. package/build/_deps/benchmark-src/cmake/GetGitVersion.cmake +0 -58
  333. package/build/_deps/benchmark-src/cmake/GoogleTest.cmake +0 -58
  334. package/build/_deps/benchmark-src/cmake/GoogleTest.cmake.in +0 -59
  335. package/build/_deps/benchmark-src/cmake/benchmark.pc.in +0 -12
  336. package/build/_deps/benchmark-src/cmake/gnu_posix_regex.cpp +0 -12
  337. package/build/_deps/benchmark-src/cmake/llvm-toolchain.cmake +0 -8
  338. package/build/_deps/benchmark-src/cmake/posix_regex.cpp +0 -14
  339. package/build/_deps/benchmark-src/cmake/pthread_affinity.cpp +0 -16
  340. package/build/_deps/benchmark-src/cmake/split_list.cmake +0 -3
  341. package/build/_deps/benchmark-src/cmake/std_regex.cpp +0 -10
  342. package/build/_deps/benchmark-src/cmake/steady_clock.cpp +0 -7
  343. package/build/_deps/benchmark-src/cmake/thread_safety_attributes.cpp +0 -4
  344. package/build/_deps/benchmark-src/docs/AssemblyTests.md +0 -149
  345. package/build/_deps/benchmark-src/docs/_config.yml +0 -3
  346. package/build/_deps/benchmark-src/docs/assets/images/icon.png +0 -0
  347. package/build/_deps/benchmark-src/docs/assets/images/icon.xcf +0 -0
  348. package/build/_deps/benchmark-src/docs/assets/images/icon_black.png +0 -0
  349. package/build/_deps/benchmark-src/docs/assets/images/icon_black.xcf +0 -0
  350. package/build/_deps/benchmark-src/docs/dependencies.md +0 -13
  351. package/build/_deps/benchmark-src/docs/index.md +0 -12
  352. package/build/_deps/benchmark-src/docs/perf_counters.md +0 -35
  353. package/build/_deps/benchmark-src/docs/platform_specific_build_instructions.md +0 -48
  354. package/build/_deps/benchmark-src/docs/python_bindings.md +0 -34
  355. package/build/_deps/benchmark-src/docs/random_interleaving.md +0 -13
  356. package/build/_deps/benchmark-src/docs/reducing_variance.md +0 -100
  357. package/build/_deps/benchmark-src/docs/releasing.md +0 -41
  358. package/build/_deps/benchmark-src/docs/tools.md +0 -343
  359. package/build/_deps/benchmark-src/docs/user_guide.md +0 -1266
  360. package/build/_deps/benchmark-src/include/benchmark/benchmark.h +0 -1991
  361. package/build/_deps/benchmark-src/include/benchmark/export.h +0 -47
  362. package/build/_deps/benchmark-src/pyproject.toml +0 -50
  363. package/build/_deps/benchmark-src/setup.py +0 -113
  364. package/build/_deps/benchmark-src/src/CMakeLists.txt +0 -170
  365. package/build/_deps/benchmark-src/src/arraysize.h +0 -33
  366. package/build/_deps/benchmark-src/src/benchmark.cc +0 -779
  367. package/build/_deps/benchmark-src/src/benchmark_api_internal.cc +0 -118
  368. package/build/_deps/benchmark-src/src/benchmark_api_internal.h +0 -87
  369. package/build/_deps/benchmark-src/src/benchmark_main.cc +0 -18
  370. package/build/_deps/benchmark-src/src/benchmark_name.cc +0 -59
  371. package/build/_deps/benchmark-src/src/benchmark_register.cc +0 -520
  372. package/build/_deps/benchmark-src/src/benchmark_register.h +0 -109
  373. package/build/_deps/benchmark-src/src/benchmark_runner.cc +0 -497
  374. package/build/_deps/benchmark-src/src/benchmark_runner.h +0 -131
  375. package/build/_deps/benchmark-src/src/check.cc +0 -11
  376. package/build/_deps/benchmark-src/src/check.h +0 -106
  377. package/build/_deps/benchmark-src/src/colorprint.cc +0 -200
  378. package/build/_deps/benchmark-src/src/colorprint.h +0 -33
  379. package/build/_deps/benchmark-src/src/commandlineflags.cc +0 -298
  380. package/build/_deps/benchmark-src/src/commandlineflags.h +0 -133
  381. package/build/_deps/benchmark-src/src/complexity.cc +0 -244
  382. package/build/_deps/benchmark-src/src/complexity.h +0 -55
  383. package/build/_deps/benchmark-src/src/console_reporter.cc +0 -206
  384. package/build/_deps/benchmark-src/src/counter.cc +0 -80
  385. package/build/_deps/benchmark-src/src/counter.h +0 -32
  386. package/build/_deps/benchmark-src/src/csv_reporter.cc +0 -161
  387. package/build/_deps/benchmark-src/src/cycleclock.h +0 -230
  388. package/build/_deps/benchmark-src/src/internal_macros.h +0 -115
  389. package/build/_deps/benchmark-src/src/json_reporter.cc +0 -320
  390. package/build/_deps/benchmark-src/src/log.h +0 -88
  391. package/build/_deps/benchmark-src/src/mutex.h +0 -155
  392. package/build/_deps/benchmark-src/src/perf_counters.cc +0 -282
  393. package/build/_deps/benchmark-src/src/perf_counters.h +0 -200
  394. package/build/_deps/benchmark-src/src/re.h +0 -158
  395. package/build/_deps/benchmark-src/src/reporter.cc +0 -118
  396. package/build/_deps/benchmark-src/src/statistics.cc +0 -209
  397. package/build/_deps/benchmark-src/src/statistics.h +0 -44
  398. package/build/_deps/benchmark-src/src/string_util.cc +0 -254
  399. package/build/_deps/benchmark-src/src/string_util.h +0 -70
  400. package/build/_deps/benchmark-src/src/sysinfo.cc +0 -855
  401. package/build/_deps/benchmark-src/src/thread_manager.h +0 -63
  402. package/build/_deps/benchmark-src/src/thread_timer.h +0 -86
  403. package/build/_deps/benchmark-src/src/timers.cc +0 -272
  404. package/build/_deps/benchmark-src/src/timers.h +0 -48
  405. package/build/_deps/benchmark-src/test/AssemblyTests.cmake +0 -67
  406. package/build/_deps/benchmark-src/test/BUILD +0 -127
  407. package/build/_deps/benchmark-src/test/CMakeLists.txt +0 -309
  408. package/build/_deps/benchmark-src/test/args_product_test.cc +0 -77
  409. package/build/_deps/benchmark-src/test/basic_test.cc +0 -180
  410. package/build/_deps/benchmark-src/test/benchmark_gtest.cc +0 -169
  411. package/build/_deps/benchmark-src/test/benchmark_min_time_flag_iters_test.cc +0 -66
  412. package/build/_deps/benchmark-src/test/benchmark_min_time_flag_time_test.cc +0 -90
  413. package/build/_deps/benchmark-src/test/benchmark_name_gtest.cc +0 -82
  414. package/build/_deps/benchmark-src/test/benchmark_random_interleaving_gtest.cc +0 -126
  415. package/build/_deps/benchmark-src/test/benchmark_setup_teardown_test.cc +0 -157
  416. package/build/_deps/benchmark-src/test/benchmark_test.cc +0 -274
  417. package/build/_deps/benchmark-src/test/clobber_memory_assembly_test.cc +0 -64
  418. package/build/_deps/benchmark-src/test/commandlineflags_gtest.cc +0 -228
  419. package/build/_deps/benchmark-src/test/complexity_test.cc +0 -228
  420. package/build/_deps/benchmark-src/test/cxx03_test.cc +0 -62
  421. package/build/_deps/benchmark-src/test/diagnostics_test.cc +0 -91
  422. package/build/_deps/benchmark-src/test/display_aggregates_only_test.cc +0 -45
  423. package/build/_deps/benchmark-src/test/donotoptimize_assembly_test.cc +0 -201
  424. package/build/_deps/benchmark-src/test/donotoptimize_test.cc +0 -69
  425. package/build/_deps/benchmark-src/test/filter_test.cc +0 -117
  426. package/build/_deps/benchmark-src/test/fixture_test.cc +0 -51
  427. package/build/_deps/benchmark-src/test/internal_threading_test.cc +0 -185
  428. package/build/_deps/benchmark-src/test/link_main_test.cc +0 -9
  429. package/build/_deps/benchmark-src/test/map_test.cc +0 -59
  430. package/build/_deps/benchmark-src/test/memory_manager_test.cc +0 -47
  431. package/build/_deps/benchmark-src/test/min_time_parse_gtest.cc +0 -30
  432. package/build/_deps/benchmark-src/test/multiple_ranges_test.cc +0 -96
  433. package/build/_deps/benchmark-src/test/options_test.cc +0 -77
  434. package/build/_deps/benchmark-src/test/output_test.h +0 -211
  435. package/build/_deps/benchmark-src/test/output_test_helper.cc +0 -519
  436. package/build/_deps/benchmark-src/test/perf_counters_gtest.cc +0 -307
  437. package/build/_deps/benchmark-src/test/perf_counters_test.cc +0 -92
  438. package/build/_deps/benchmark-src/test/register_benchmark_test.cc +0 -196
  439. package/build/_deps/benchmark-src/test/repetitions_test.cc +0 -214
  440. package/build/_deps/benchmark-src/test/report_aggregates_only_test.cc +0 -41
  441. package/build/_deps/benchmark-src/test/reporter_output_test.cc +0 -1130
  442. package/build/_deps/benchmark-src/test/skip_with_error_test.cc +0 -199
  443. package/build/_deps/benchmark-src/test/spec_arg_test.cc +0 -105
  444. package/build/_deps/benchmark-src/test/spec_arg_verbosity_test.cc +0 -43
  445. package/build/_deps/benchmark-src/test/state_assembly_test.cc +0 -68
  446. package/build/_deps/benchmark-src/test/statistics_gtest.cc +0 -35
  447. package/build/_deps/benchmark-src/test/string_util_gtest.cc +0 -199
  448. package/build/_deps/benchmark-src/test/templated_fixture_test.cc +0 -28
  449. package/build/_deps/benchmark-src/test/time_unit_gtest.cc +0 -37
  450. package/build/_deps/benchmark-src/test/user_counters_tabular_test.cc +0 -558
  451. package/build/_deps/benchmark-src/test/user_counters_test.cc +0 -561
  452. package/build/_deps/benchmark-src/test/user_counters_thousands_test.cc +0 -186
  453. package/build/_deps/benchmark-src/tools/BUILD.bazel +0 -19
  454. package/build/_deps/benchmark-src/tools/compare.py +0 -432
  455. package/build/_deps/benchmark-src/tools/gbench/Inputs/test1_run1.json +0 -127
  456. package/build/_deps/benchmark-src/tools/gbench/Inputs/test1_run2.json +0 -127
  457. package/build/_deps/benchmark-src/tools/gbench/Inputs/test2_run.json +0 -81
  458. package/build/_deps/benchmark-src/tools/gbench/Inputs/test3_run0.json +0 -65
  459. package/build/_deps/benchmark-src/tools/gbench/Inputs/test3_run1.json +0 -65
  460. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run.json +0 -96
  461. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run0.json +0 -21
  462. package/build/_deps/benchmark-src/tools/gbench/Inputs/test4_run1.json +0 -21
  463. package/build/_deps/benchmark-src/tools/gbench/__init__.py +0 -8
  464. package/build/_deps/benchmark-src/tools/gbench/report.py +0 -1201
  465. package/build/_deps/benchmark-src/tools/gbench/util.py +0 -203
  466. package/build/_deps/benchmark-src/tools/libpfm.BUILD.bazel +0 -22
  467. package/build/_deps/benchmark-src/tools/requirements.txt +0 -2
  468. package/build/_deps/benchmark-src/tools/strip_asm.py +0 -151
  469. package/build/_deps/benchmark-subbuild/CMakeCache.txt +0 -133
  470. package/build/_deps/benchmark-subbuild/CMakeFiles/4.0.3/CMakeSystem.cmake +0 -15
  471. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeConfigureLog.yaml +0 -11
  472. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeDirectoryInformation.cmake +0 -16
  473. package/build/_deps/benchmark-subbuild/CMakeFiles/CMakeRuleHashes.txt +0 -11
  474. package/build/_deps/benchmark-subbuild/CMakeFiles/InstallScripts.json +0 -7
  475. package/build/_deps/benchmark-subbuild/CMakeFiles/Makefile.cmake +0 -52
  476. package/build/_deps/benchmark-subbuild/CMakeFiles/Makefile2 +0 -122
  477. package/build/_deps/benchmark-subbuild/CMakeFiles/TargetDirectories.txt +0 -3
  478. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate-complete +0 -0
  479. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/DependInfo.cmake +0 -22
  480. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/Labels.json +0 -46
  481. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/Labels.txt +0 -14
  482. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/build.make +0 -162
  483. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/cmake_clean.cmake +0 -17
  484. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/compiler_depend.make +0 -2
  485. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/compiler_depend.ts +0 -2
  486. package/build/_deps/benchmark-subbuild/CMakeFiles/benchmark-populate.dir/progress.make +0 -10
  487. package/build/_deps/benchmark-subbuild/CMakeFiles/cmake.check_cache +0 -1
  488. package/build/_deps/benchmark-subbuild/CMakeFiles/progress.marks +0 -1
  489. package/build/_deps/benchmark-subbuild/CMakeLists.txt +0 -42
  490. package/build/_deps/benchmark-subbuild/Makefile +0 -162
  491. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-build +0 -0
  492. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-configure +0 -0
  493. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-done +0 -0
  494. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-download +0 -0
  495. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-gitclone-lastrun.txt +0 -15
  496. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-gitinfo.txt +0 -15
  497. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-install +0 -0
  498. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-mkdir +0 -0
  499. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-patch +0 -0
  500. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-patch-info.txt +0 -6
  501. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-test +0 -0
  502. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/src/benchmark-populate-stamp/benchmark-populate-update-info.txt +0 -7
  503. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-cfgcmd.txt +0 -1
  504. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-gitclone.cmake +0 -87
  505. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-gitupdate.cmake +0 -317
  506. package/build/_deps/benchmark-subbuild/benchmark-populate-prefix/tmp/benchmark-populate-mkdirs.cmake +0 -27
  507. package/build/_deps/benchmark-subbuild/cmake_install.cmake +0 -56
  508. package/build/bin/avl-rb-range-search-benchmark +0 -0
  509. package/build/bin/avl-tree-benchmark +0 -0
  510. package/build/bin/deque-benchmark +0 -0
  511. package/build/bin/doubly-linked-list-benchmark +0 -0
  512. package/build/bin/hash-map-benchmark +0 -0
  513. package/build/bin/heap-benchmark +0 -0
  514. package/build/bin/priority-queue-benchmark +0 -0
  515. package/build/bin/queue-benchmark +0 -0
  516. package/build/bin/red-black-tree-benchmark +0 -0
  517. package/build/bin/singly-linked-list-benchmark +0 -0
  518. package/build/bin/stack-benchmark +0 -0
  519. package/build/bin/tree-map-benchmark +0 -0
  520. package/build/bin/tree-multi-map-benchmark +0 -0
  521. package/build/bin/tree-multi-set-benchmark +0 -0
  522. package/build/bin/tree-set-benchmark +0 -0
  523. package/build/cmake_install.cmake +0 -66
  524. package/dist/cjs/index.cjs.map +0 -1
  525. package/dist/cjs-legacy/index.cjs.map +0 -1
  526. package/dist/esm/index.mjs.map +0 -1
  527. package/dist/esm-legacy/index.mjs.map +0 -1
  528. package/dist/umd/data-structure-typed.js.map +0 -1
  529. package/dist/umd/data-structure-typed.min.js.map +0 -1
  530. package/eslint.config.mjs +0 -73
  531. package/test/config.ts +0 -4
  532. package/test/integration/all-in-one.test.ts +0 -110
  533. package/test/integration/avl-tree.test.ts +0 -127
  534. package/test/integration/bst.test.ts +0 -385
  535. package/test/integration/compile.test.mjs +0 -159
  536. package/test/integration/compile.test.ts +0 -176
  537. package/test/integration/heap.test.js +0 -21
  538. package/test/integration/index.html +0 -462
  539. package/test/performance/benchmark-runner-enhanced.mjs +0 -818
  540. package/test/performance/cmake-benchmark-runner.mjs +0 -234
  541. package/test/performance/data-structures/binary-tree/avl-rb-range-search.test.cpp +0 -112
  542. package/test/performance/data-structures/binary-tree/avl-rb-range-search.test.mjs +0 -51
  543. package/test/performance/data-structures/binary-tree/avl-tree.test.cpp +0 -181
  544. package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +0 -138
  545. package/test/performance/data-structures/binary-tree/binary-tree-overall.test.mjs +0 -85
  546. package/test/performance/data-structures/binary-tree/binary-tree.test.mjs +0 -100
  547. package/test/performance/data-structures/binary-tree/bst.test.mjs +0 -61
  548. package/test/performance/data-structures/binary-tree/red-black-tree-cjs.test.mjs +0 -259
  549. package/test/performance/data-structures/binary-tree/red-black-tree.test.cpp +0 -213
  550. package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +0 -275
  551. package/test/performance/data-structures/binary-tree/tree-map.test.cpp +0 -129
  552. package/test/performance/data-structures/binary-tree/tree-map.test.mjs +0 -171
  553. package/test/performance/data-structures/binary-tree/tree-multi-map.test.cpp +0 -205
  554. package/test/performance/data-structures/binary-tree/tree-multi-map.test.mjs +0 -106
  555. package/test/performance/data-structures/binary-tree/tree-multi-set.test.cpp +0 -217
  556. package/test/performance/data-structures/binary-tree/tree-multi-set.test.mjs +0 -91
  557. package/test/performance/data-structures/binary-tree/tree-set.test.cpp +0 -127
  558. package/test/performance/data-structures/binary-tree/tree-set.test.mjs +0 -174
  559. package/test/performance/data-structures/comparison/comparison.test.mjs +0 -99
  560. package/test/performance/data-structures/graph/directed-graph.test.mjs +0 -38
  561. package/test/performance/data-structures/hash/hash-map.test.cpp +0 -183
  562. package/test/performance/data-structures/hash/hash-map.test.mjs +0 -187
  563. package/test/performance/data-structures/heap/heap.test.cpp +0 -61
  564. package/test/performance/data-structures/heap/heap.test.mjs +0 -31
  565. package/test/performance/data-structures/linked-list/doubly-linked-list.test.cpp +0 -84
  566. package/test/performance/data-structures/linked-list/doubly-linked-list.test.mjs +0 -125
  567. package/test/performance/data-structures/linked-list/singly-linked-list.test.cpp +0 -77
  568. package/test/performance/data-structures/linked-list/singly-linked-list.test.mjs +0 -84
  569. package/test/performance/data-structures/priority-queue/max-priority-queue.test.mjs +0 -40
  570. package/test/performance/data-structures/priority-queue/priority-queue.test.cpp +0 -59
  571. package/test/performance/data-structures/priority-queue/priority-queue.test.mjs +0 -64
  572. package/test/performance/data-structures/queue/deque.test.cpp +0 -119
  573. package/test/performance/data-structures/queue/deque.test.mjs +0 -144
  574. package/test/performance/data-structures/queue/queue.test.cpp +0 -59
  575. package/test/performance/data-structures/queue/queue.test.mjs +0 -77
  576. package/test/performance/data-structures/stack/stack.test.cpp +0 -40
  577. package/test/performance/data-structures/stack/stack.test.mjs +0 -69
  578. package/test/performance/data-structures/trie/trie.test.mjs +0 -43
  579. package/test/performance/reportor-enhanced.mjs +0 -1027
  580. package/test/performance/runner-config.json +0 -51
  581. package/test/types/index.ts +0 -1
  582. package/test/types/utils/big-o.ts +0 -1
  583. package/test/types/utils/index.ts +0 -2
  584. package/test/types/utils/json2html.ts +0 -5
  585. package/test/unit/data-structures/base/iterable-element-base.coverage.test.ts +0 -106
  586. package/test/unit/data-structures/base/iterable-element-base.more-branches.coverage.test.ts +0 -61
  587. package/test/unit/data-structures/base/linear-base.array.coverage.test.ts +0 -168
  588. package/test/unit/data-structures/base/linear-base.concat-else.coverage.test.ts +0 -82
  589. package/test/unit/data-structures/base/linear-base.coverage.test.ts +0 -72
  590. package/test/unit/data-structures/base/linear-base.more-branches.coverage.test.ts +0 -414
  591. package/test/unit/data-structures/binary-tree/avl-tree-node.familyPosition-root-left.coverage.test.ts +0 -17
  592. package/test/unit/data-structures/binary-tree/avl-tree.more-branches-2.coverage.test.ts +0 -99
  593. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +0 -729
  594. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +0 -345
  595. package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts +0 -18
  596. package/test/unit/data-structures/binary-tree/binary-tree.more-branches.coverage.test.ts +0 -56
  597. package/test/unit/data-structures/binary-tree/binary-tree.remaining-branches.coverage.test.ts +0 -232
  598. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +0 -1912
  599. package/test/unit/data-structures/binary-tree/bst.bound-by-predicate.coverage.test.ts +0 -33
  600. package/test/unit/data-structures/binary-tree/bst.coverage.test.ts +0 -94
  601. package/test/unit/data-structures/binary-tree/bst.deletebykey.coverage.test.ts +0 -70
  602. package/test/unit/data-structures/binary-tree/bst.deletewhere.coverage.test.ts +0 -37
  603. package/test/unit/data-structures/binary-tree/bst.floor-lower-predicate.coverage.test.ts +0 -29
  604. package/test/unit/data-structures/binary-tree/bst.floor-setmany.coverage.test.ts +0 -72
  605. package/test/unit/data-structures/binary-tree/bst.getnode.range-ensure.coverage.test.ts +0 -22
  606. package/test/unit/data-structures/binary-tree/bst.misc-branches.coverage.test.ts +0 -100
  607. package/test/unit/data-structures/binary-tree/bst.more-branches-2.coverage.test.ts +0 -133
  608. package/test/unit/data-structures/binary-tree/bst.more-branches-3.coverage.test.ts +0 -45
  609. package/test/unit/data-structures/binary-tree/bst.more-branches-4.coverage.test.ts +0 -36
  610. package/test/unit/data-structures/binary-tree/bst.more-branches-5.coverage.test.ts +0 -40
  611. package/test/unit/data-structures/binary-tree/bst.more.coverage.test.ts +0 -39
  612. package/test/unit/data-structures/binary-tree/bst.node-family.coverage.test.ts +0 -29
  613. package/test/unit/data-structures/binary-tree/bst.range-pruning.coverage.test.ts +0 -43
  614. package/test/unit/data-structures/binary-tree/bst.search-fastpath.coverage.test.ts +0 -30
  615. package/test/unit/data-structures/binary-tree/bst.test.ts +0 -3472
  616. package/test/unit/data-structures/binary-tree/data/cost-of-living-by-country.ts +0 -259
  617. package/test/unit/data-structures/binary-tree/overall.test.ts +0 -219
  618. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-corruption-repair.coverage.test.ts +0 -66
  619. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-max-update.coverage.test.ts +0 -18
  620. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-null.coverage.test.ts +0 -53
  621. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-stale-cache.coverage.test.ts +0 -25
  622. package/test/unit/data-structures/binary-tree/red-black-tree.boundary-update.coverage.test.ts +0 -23
  623. package/test/unit/data-structures/binary-tree/red-black-tree.cache-delete.coverage.test.ts +0 -49
  624. package/test/unit/data-structures/binary-tree/red-black-tree.cache-edge.coverage.test.ts +0 -37
  625. package/test/unit/data-structures/binary-tree/red-black-tree.cache-stale-insert.coverage.test.ts +0 -39
  626. package/test/unit/data-structures/binary-tree/red-black-tree.coverage.test.ts +0 -334
  627. package/test/unit/data-structures/binary-tree/red-black-tree.delete-fixup.coverage.test.ts +0 -68
  628. package/test/unit/data-structures/binary-tree/red-black-tree.delete-successor.coverage.test.ts +0 -75
  629. package/test/unit/data-structures/binary-tree/red-black-tree.factories.coverage.test.ts +0 -26
  630. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-compare-update.coverage.test.ts +0 -74
  631. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-no-update.coverage.test.ts +0 -44
  632. package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-nullish.coverage.test.ts +0 -61
  633. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-defined.coverage.test.ts +0 -35
  634. package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-undefined.coverage.test.ts +0 -43
  635. package/test/unit/data-structures/binary-tree/red-black-tree.hint-more.coverage.test.ts +0 -99
  636. package/test/unit/data-structures/binary-tree/red-black-tree.hint.coverage.test.ts +0 -60
  637. package/test/unit/data-structures/binary-tree/red-black-tree.insert-cache-nullish.coverage.test.ts +0 -29
  638. package/test/unit/data-structures/binary-tree/red-black-tree.insert-header-parent-nullish.coverage.test.ts +0 -17
  639. package/test/unit/data-structures/binary-tree/red-black-tree.internal-walk.coverage.test.ts +0 -57
  640. package/test/unit/data-structures/binary-tree/red-black-tree.minmax-cache.test.ts +0 -65
  641. package/test/unit/data-structures/binary-tree/red-black-tree.misc-inputs.coverage.test.ts +0 -17
  642. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-2.coverage.test.ts +0 -121
  643. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-3.coverage.test.ts +0 -55
  644. package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-4.coverage.test.ts +0 -44
  645. package/test/unit/data-structures/binary-tree/red-black-tree.predsucc.coverage.test.ts +0 -40
  646. package/test/unit/data-structures/binary-tree/red-black-tree.remaining-branches.coverage.test.ts +0 -123
  647. package/test/unit/data-structures/binary-tree/red-black-tree.set-inputs.coverage.test.ts +0 -64
  648. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-parent-cache.coverage.test.ts +0 -79
  649. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-remaining.coverage.test.ts +0 -44
  650. package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-uncovered.coverage.test.ts +0 -74
  651. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +0 -936
  652. package/test/unit/data-structures/binary-tree/red-black-tree.update-branches.coverage.test.ts +0 -30
  653. package/test/unit/data-structures/binary-tree/segment-tree.more-branches.coverage.test.ts +0 -31
  654. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +0 -104
  655. package/test/unit/data-structures/binary-tree/tree-map.test.ts +0 -316
  656. package/test/unit/data-structures/binary-tree/tree-multi-map.coverage.test.ts +0 -245
  657. package/test/unit/data-structures/binary-tree/tree-multi-map.legacy.test.ts.skip +0 -1115
  658. package/test/unit/data-structures/binary-tree/tree-multi-map.more-branches-2.coverage.test.ts.skip +0 -59
  659. package/test/unit/data-structures/binary-tree/tree-multi-map.rfc.test.ts +0 -146
  660. package/test/unit/data-structures/binary-tree/tree-multi-map.simplified.test.ts +0 -482
  661. package/test/unit/data-structures/binary-tree/tree-multi-set.test.ts +0 -594
  662. package/test/unit/data-structures/binary-tree/tree-set.test.ts +0 -231
  663. package/test/unit/data-structures/graph/abstract-graph.more-branches-2.coverage.test.ts +0 -40
  664. package/test/unit/data-structures/graph/abstract-graph.more-branches-3.coverage.test.ts +0 -65
  665. package/test/unit/data-structures/graph/abstract-graph.more-branches-4.coverage.test.ts +0 -98
  666. package/test/unit/data-structures/graph/abstract-graph.more-branches-5.coverage.test.ts +0 -51
  667. package/test/unit/data-structures/graph/abstract-graph.more-branches.coverage.test.ts +0 -62
  668. package/test/unit/data-structures/graph/abstract-graph.test.ts +0 -117
  669. package/test/unit/data-structures/graph/directed-graph.more-branches-2.coverage.test.ts +0 -38
  670. package/test/unit/data-structures/graph/directed-graph.more-branches-3.coverage.test.ts +0 -25
  671. package/test/unit/data-structures/graph/directed-graph.more-branches.coverage.test.ts +0 -82
  672. package/test/unit/data-structures/graph/directed-graph.test.ts +0 -1185
  673. package/test/unit/data-structures/graph/map-graph.more-branches.coverage.test.ts +0 -22
  674. package/test/unit/data-structures/graph/map-graph.test.ts +0 -148
  675. package/test/unit/data-structures/graph/overall.test.ts +0 -49
  676. package/test/unit/data-structures/graph/salty-edges.json +0 -875
  677. package/test/unit/data-structures/graph/salty-vertexes.json +0 -200
  678. package/test/unit/data-structures/graph/undirected-graph.more-branches-2.coverage.test.ts +0 -35
  679. package/test/unit/data-structures/graph/undirected-graph.more-branches.coverage.test.ts +0 -87
  680. package/test/unit/data-structures/graph/undirected-graph.test.ts +0 -782
  681. package/test/unit/data-structures/hash/hash-map.more-branches.coverage.test.ts +0 -64
  682. package/test/unit/data-structures/hash/hash-map.test.ts +0 -1125
  683. package/test/unit/data-structures/hash/hash-map.toEntryFn-branch.coverage.test.ts +0 -9
  684. package/test/unit/data-structures/heap/heap.misc-branches.coverage.test.ts +0 -110
  685. package/test/unit/data-structures/heap/heap.remaining-branches.coverage.test.ts +0 -22
  686. package/test/unit/data-structures/heap/heap.test.ts +0 -760
  687. package/test/unit/data-structures/heap/max-heap.coverage.test.ts +0 -29
  688. package/test/unit/data-structures/heap/max-heap.test.ts +0 -98
  689. package/test/unit/data-structures/heap/min-heap.test.ts +0 -117
  690. package/test/unit/data-structures/linked-list/doubly-linked-list.more-branches.coverage.test.ts +0 -72
  691. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +0 -1150
  692. package/test/unit/data-structures/linked-list/linked-list.test.ts +0 -8
  693. package/test/unit/data-structures/linked-list/linked-list.unshiftMany-else.coverage.test.ts +0 -15
  694. package/test/unit/data-structures/linked-list/singly-linked-list.coverage.test.ts +0 -221
  695. package/test/unit/data-structures/linked-list/singly-linked-list.more-branches.coverage.test.ts +0 -86
  696. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +0 -836
  697. package/test/unit/data-structures/linked-list/skip-linked-list.more-branches.coverage.test.ts +0 -31
  698. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +0 -13
  699. package/test/unit/data-structures/linked-list/skip-list.test.ts +0 -86
  700. package/test/unit/data-structures/matrix/matrix.more-branches.coverage.test.ts +0 -81
  701. package/test/unit/data-structures/matrix/matrix.pivotElement-nullish.coverage.test.ts +0 -28
  702. package/test/unit/data-structures/matrix/matrix.test.ts +0 -377
  703. package/test/unit/data-structures/matrix/navigator.test.ts +0 -244
  704. package/test/unit/data-structures/priority-queue/max-priority-queue.more-branches.coverage.test.ts +0 -10
  705. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +0 -160
  706. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +0 -78
  707. package/test/unit/data-structures/priority-queue/priority-queue.coverage.test.ts +0 -21
  708. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +0 -101
  709. package/test/unit/data-structures/queue/deque.coverage.test.ts +0 -173
  710. package/test/unit/data-structures/queue/deque.more-branches-2.coverage.test.ts +0 -39
  711. package/test/unit/data-structures/queue/deque.more-branches-3.coverage.test.ts +0 -9
  712. package/test/unit/data-structures/queue/deque.more-branches.coverage.test.ts +0 -95
  713. package/test/unit/data-structures/queue/deque.test.ts +0 -936
  714. package/test/unit/data-structures/queue/queue.coverage.test.ts +0 -138
  715. package/test/unit/data-structures/queue/queue.more-branches-2.coverage.test.ts +0 -27
  716. package/test/unit/data-structures/queue/queue.test.ts +0 -703
  717. package/test/unit/data-structures/stack/stack.coverage.test.ts +0 -112
  718. package/test/unit/data-structures/stack/stack.test.ts +0 -438
  719. package/test/unit/data-structures/tree/tree.more-branches.coverage.test.ts +0 -9
  720. package/test/unit/data-structures/tree/tree.test.ts +0 -58
  721. package/test/unit/data-structures/trie/trie.more-branches-2.coverage.test.ts +0 -51
  722. package/test/unit/data-structures/trie/trie.test.ts +0 -1181
  723. package/test/unit/unrestricted-interconversion.test.ts +0 -299
  724. package/test/unit/utils/utils.test.ts +0 -174
  725. package/test/utils/array.ts +0 -5517
  726. package/test/utils/big-o.ts +0 -228
  727. package/test/utils/console.ts +0 -31
  728. package/test/utils/index.ts +0 -8
  729. package/test/utils/is.ts +0 -56
  730. package/test/utils/json2html.ts +0 -164
  731. package/test/utils/number.ts +0 -13
  732. package/test/utils/patch.ts +0 -33
  733. package/test/utils/perf.mjs +0 -34
  734. package/test/utils/performanc.ts +0 -7
  735. package/test/utils/string.ts +0 -49
  736. package/tsconfig.types.json +0 -15
  737. package/tsup.config.js +0 -63
  738. 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
- });