data-structure-typed 1.51.8 → 1.52.0

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 (216) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +152 -152
  5. package/dist/cjs/data-structures/base/index.d.ts +2 -1
  6. package/dist/cjs/data-structures/base/index.js +2 -1
  7. package/dist/cjs/data-structures/base/index.js.map +1 -1
  8. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +171 -0
  9. package/dist/cjs/data-structures/base/iterable-element-base.js +226 -0
  10. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -0
  11. package/dist/cjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
  12. package/dist/cjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +13 -190
  13. package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -0
  14. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
  15. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -87
  16. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
  18. package/dist/cjs/data-structures/binary-tree/avl-tree.js +78 -59
  19. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
  21. package/dist/cjs/data-structures/binary-tree/binary-tree.js +475 -363
  22. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  23. package/dist/cjs/data-structures/binary-tree/bst.d.ts +192 -202
  24. package/dist/cjs/data-structures/binary-tree/bst.js +207 -249
  25. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  26. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
  27. package/dist/cjs/data-structures/binary-tree/rb-tree.js +107 -98
  28. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  29. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
  30. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  31. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  32. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +10 -15
  33. package/dist/cjs/data-structures/graph/abstract-graph.js +10 -15
  34. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  35. package/dist/cjs/data-structures/hash/hash-map.d.ts +33 -40
  36. package/dist/cjs/data-structures/hash/hash-map.js +40 -55
  37. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/heap.d.ts +43 -114
  39. package/dist/cjs/data-structures/heap/heap.js +59 -127
  40. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  41. package/dist/cjs/data-structures/heap/max-heap.d.ts +50 -4
  42. package/dist/cjs/data-structures/heap/max-heap.js +76 -10
  43. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  44. package/dist/cjs/data-structures/heap/min-heap.d.ts +51 -5
  45. package/dist/cjs/data-structures/heap/min-heap.js +68 -11
  46. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  47. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
  48. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +26 -28
  49. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +22 -25
  51. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +29 -26
  52. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  53. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
  54. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +79 -10
  55. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  56. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +51 -5
  57. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +71 -11
  58. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  59. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +50 -4
  60. package/dist/cjs/data-structures/priority-queue/priority-queue.js +70 -1
  61. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  62. package/dist/cjs/data-structures/queue/deque.d.ts +21 -20
  63. package/dist/cjs/data-structures/queue/deque.js +29 -23
  64. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  65. package/dist/cjs/data-structures/queue/queue.d.ts +8 -28
  66. package/dist/cjs/data-structures/queue/queue.js +15 -31
  67. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  68. package/dist/cjs/data-structures/stack/stack.d.ts +17 -22
  69. package/dist/cjs/data-structures/stack/stack.js +25 -24
  70. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  71. package/dist/cjs/data-structures/trie/trie.d.ts +19 -14
  72. package/dist/cjs/data-structures/trie/trie.js +27 -16
  73. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  74. package/dist/cjs/interfaces/binary-tree.d.ts +7 -7
  75. package/dist/cjs/types/common.d.ts +1 -2
  76. package/dist/cjs/types/data-structures/base/base.d.ts +5 -2
  77. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
  78. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
  79. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
  80. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +4 -5
  81. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
  82. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
  83. package/dist/cjs/types/data-structures/heap/heap.d.ts +3 -2
  84. package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
  85. package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
  86. package/dist/cjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
  87. package/dist/cjs/types/data-structures/queue/deque.d.ts +3 -2
  88. package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -1
  89. package/dist/cjs/types/data-structures/stack/stack.d.ts +2 -1
  90. package/dist/cjs/types/data-structures/trie/trie.d.ts +3 -2
  91. package/dist/cjs/utils/utils.js +3 -5
  92. package/dist/cjs/utils/utils.js.map +1 -1
  93. package/dist/mjs/data-structures/base/index.d.ts +2 -1
  94. package/dist/mjs/data-structures/base/index.js +2 -1
  95. package/dist/mjs/data-structures/base/iterable-element-base.d.ts +171 -0
  96. package/dist/mjs/data-structures/base/iterable-element-base.js +222 -0
  97. package/dist/mjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
  98. package/dist/mjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +10 -186
  99. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
  100. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -87
  101. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
  102. package/dist/mjs/data-structures/binary-tree/avl-tree.js +78 -59
  103. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
  104. package/dist/mjs/data-structures/binary-tree/binary-tree.js +476 -364
  105. package/dist/mjs/data-structures/binary-tree/bst.d.ts +192 -202
  106. package/dist/mjs/data-structures/binary-tree/bst.js +211 -255
  107. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
  108. package/dist/mjs/data-structures/binary-tree/rb-tree.js +107 -98
  109. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
  110. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  111. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +10 -15
  112. package/dist/mjs/data-structures/graph/abstract-graph.js +10 -15
  113. package/dist/mjs/data-structures/hash/hash-map.d.ts +33 -40
  114. package/dist/mjs/data-structures/hash/hash-map.js +41 -55
  115. package/dist/mjs/data-structures/heap/heap.d.ts +43 -114
  116. package/dist/mjs/data-structures/heap/heap.js +60 -128
  117. package/dist/mjs/data-structures/heap/max-heap.d.ts +50 -4
  118. package/dist/mjs/data-structures/heap/max-heap.js +79 -10
  119. package/dist/mjs/data-structures/heap/min-heap.d.ts +51 -5
  120. package/dist/mjs/data-structures/heap/min-heap.js +68 -11
  121. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
  122. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +26 -28
  123. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +22 -25
  124. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +29 -26
  125. package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
  126. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +82 -10
  127. package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +51 -5
  128. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +71 -11
  129. package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +50 -4
  130. package/dist/mjs/data-structures/priority-queue/priority-queue.js +70 -1
  131. package/dist/mjs/data-structures/queue/deque.d.ts +21 -20
  132. package/dist/mjs/data-structures/queue/deque.js +29 -23
  133. package/dist/mjs/data-structures/queue/queue.d.ts +8 -28
  134. package/dist/mjs/data-structures/queue/queue.js +15 -31
  135. package/dist/mjs/data-structures/stack/stack.d.ts +17 -22
  136. package/dist/mjs/data-structures/stack/stack.js +25 -24
  137. package/dist/mjs/data-structures/trie/trie.d.ts +19 -14
  138. package/dist/mjs/data-structures/trie/trie.js +27 -16
  139. package/dist/mjs/interfaces/binary-tree.d.ts +7 -7
  140. package/dist/mjs/types/common.d.ts +1 -2
  141. package/dist/mjs/types/data-structures/base/base.d.ts +5 -2
  142. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
  143. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
  144. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
  145. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +4 -5
  146. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
  147. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
  148. package/dist/mjs/types/data-structures/heap/heap.d.ts +3 -2
  149. package/dist/mjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
  150. package/dist/mjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
  151. package/dist/mjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
  152. package/dist/mjs/types/data-structures/queue/deque.d.ts +3 -2
  153. package/dist/mjs/types/data-structures/queue/queue.d.ts +2 -1
  154. package/dist/mjs/types/data-structures/stack/stack.d.ts +2 -1
  155. package/dist/mjs/types/data-structures/trie/trie.d.ts +3 -2
  156. package/dist/mjs/utils/utils.js +3 -5
  157. package/dist/umd/data-structure-typed.js +1949 -1481
  158. package/dist/umd/data-structure-typed.min.js +2 -2
  159. package/dist/umd/data-structure-typed.min.js.map +1 -1
  160. package/package.json +6 -6
  161. package/src/data-structures/base/index.ts +2 -1
  162. package/src/data-structures/base/iterable-element-base.ts +250 -0
  163. package/src/data-structures/base/{iterable-base.ts → iterable-entry-base.ts} +22 -213
  164. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +144 -95
  165. package/src/data-structures/binary-tree/avl-tree.ts +96 -69
  166. package/src/data-structures/binary-tree/binary-tree.ts +535 -403
  167. package/src/data-structures/binary-tree/bst.ts +247 -277
  168. package/src/data-structures/binary-tree/rb-tree.ts +123 -103
  169. package/src/data-structures/binary-tree/tree-multi-map.ts +127 -102
  170. package/src/data-structures/graph/abstract-graph.ts +10 -10
  171. package/src/data-structures/hash/hash-map.ts +46 -53
  172. package/src/data-structures/heap/heap.ts +71 -152
  173. package/src/data-structures/heap/max-heap.ts +88 -13
  174. package/src/data-structures/heap/min-heap.ts +78 -15
  175. package/src/data-structures/linked-list/doubly-linked-list.ts +32 -32
  176. package/src/data-structures/linked-list/singly-linked-list.ts +37 -29
  177. package/src/data-structures/priority-queue/max-priority-queue.ts +94 -13
  178. package/src/data-structures/priority-queue/min-priority-queue.ts +84 -15
  179. package/src/data-structures/priority-queue/priority-queue.ts +81 -4
  180. package/src/data-structures/queue/deque.ts +37 -26
  181. package/src/data-structures/queue/queue.ts +23 -36
  182. package/src/data-structures/stack/stack.ts +31 -26
  183. package/src/data-structures/trie/trie.ts +35 -20
  184. package/src/interfaces/binary-tree.ts +9 -9
  185. package/src/types/common.ts +1 -2
  186. package/src/types/data-structures/base/base.ts +14 -6
  187. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +3 -4
  188. package/src/types/data-structures/binary-tree/avl-tree.ts +3 -4
  189. package/src/types/data-structures/binary-tree/binary-tree.ts +6 -6
  190. package/src/types/data-structures/binary-tree/bst.ts +4 -5
  191. package/src/types/data-structures/binary-tree/rb-tree.ts +3 -4
  192. package/src/types/data-structures/binary-tree/tree-multi-map.ts +3 -4
  193. package/src/types/data-structures/heap/heap.ts +4 -1
  194. package/src/types/data-structures/linked-list/doubly-linked-list.ts +3 -1
  195. package/src/types/data-structures/linked-list/singly-linked-list.ts +3 -1
  196. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -1
  197. package/src/types/data-structures/queue/deque.ts +3 -1
  198. package/src/types/data-structures/queue/queue.ts +3 -1
  199. package/src/types/data-structures/stack/stack.ts +3 -1
  200. package/src/types/data-structures/trie/trie.ts +3 -1
  201. package/src/utils/utils.ts +3 -3
  202. package/test/integration/avl-tree.test.ts +2 -2
  203. package/test/integration/bst.test.ts +3 -3
  204. package/test/integration/index.html +25 -11
  205. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +68 -0
  206. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +56 -0
  207. package/test/unit/data-structures/graph/directed-graph.test.ts +2 -2
  208. package/test/unit/data-structures/heap/heap.test.ts +80 -0
  209. package/test/unit/data-structures/heap/max-heap.test.ts +44 -1
  210. package/test/unit/data-structures/heap/min-heap.test.ts +18 -1
  211. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +42 -0
  212. package/test/unit/data-structures/queue/deque.test.ts +30 -0
  213. package/test/unit/data-structures/queue/queue.test.ts +56 -0
  214. package/test/utils/big-o.ts +12 -6
  215. package/tsconfig-base.json +1 -0
  216. package/dist/cjs/data-structures/base/iterable-base.js.map +0 -1
@@ -97,24 +97,27 @@ export class BinaryTreeNode {
97
97
  export class BinaryTree extends IterableEntryBase {
98
98
  iterationType = 'ITERATIVE';
99
99
  /**
100
- * The constructor function initializes a binary tree object with optional keysOrNodesOrEntries and options.
101
- * @param [keysOrNodesOrEntries] - An optional iterable of KeyOrNodeOrEntry objects. These objects represent the
100
+ * The constructor function initializes a binary tree object with optional keysOrNodesOrEntriesOrRawElements and options.
101
+ * @param [keysOrNodesOrEntriesOrRawElements] - Optional iterable of KeyOrNodeOrEntry objects. These objects represent the
102
102
  * nodes to be added to the binary tree.
103
103
  * @param [options] - The `options` parameter is an optional object that can contain additional
104
104
  * configuration options for the binary tree. In this case, it is of type
105
105
  * `Partial<BinaryTreeOptions>`, which means that not all properties of `BinaryTreeOptions` are
106
106
  * required.
107
107
  */
108
- constructor(keysOrNodesOrEntries = [], options) {
108
+ constructor(keysOrNodesOrEntriesOrRawElements = [], options) {
109
109
  super();
110
110
  if (options) {
111
- const { iterationType } = options;
111
+ const { iterationType, toEntryFn } = options;
112
112
  if (iterationType)
113
113
  this.iterationType = iterationType;
114
+ if (typeof toEntryFn === 'function')
115
+ this._toEntryFn = toEntryFn;
116
+ else if (toEntryFn)
117
+ throw TypeError('toEntryFn must be a function type');
114
118
  }
115
- this._size = 0;
116
- if (keysOrNodesOrEntries)
117
- this.addMany(keysOrNodesOrEntries);
119
+ if (keysOrNodesOrEntriesOrRawElements)
120
+ this.addMany(keysOrNodesOrEntriesOrRawElements);
118
121
  }
119
122
  _root;
120
123
  /**
@@ -125,7 +128,7 @@ export class BinaryTree extends IterableEntryBase {
125
128
  get root() {
126
129
  return this._root;
127
130
  }
128
- _size;
131
+ _size = 0;
129
132
  /**
130
133
  * The function returns the size of an object.
131
134
  * @returns The size of the object, which is a number.
@@ -141,6 +144,14 @@ export class BinaryTree extends IterableEntryBase {
141
144
  get NIL() {
142
145
  return this._NIL;
143
146
  }
147
+ _toEntryFn;
148
+ /**
149
+ * The function returns the value of the _toEntryFn property.
150
+ * @returns The function being returned is `this._toEntryFn`.
151
+ */
152
+ get toEntryFn() {
153
+ return this._toEntryFn;
154
+ }
144
155
  /**
145
156
  * Creates a new instance of BinaryTreeNode with the given key and value.
146
157
  * @param {K} key - The key for the new node.
@@ -161,42 +172,42 @@ export class BinaryTree extends IterableEntryBase {
161
172
  return new BinaryTree([], { iterationType: this.iterationType, ...options });
162
173
  }
163
174
  /**
164
- * The function `keyValueOrEntryToNode` converts an keyOrNodeOrEntry object into a node object.
165
- * @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter is of type `KeyOrNodeOrEntry<K, V, NODE>`.
175
+ * The function `keyValueOrEntryOrRawElementToNode` converts a key-value pair, entry, or raw element
176
+ * into a node object.
177
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
178
+ * `keyOrNodeOrEntryOrRawElement` can be of type `R` or `KeyOrNodeOrEntry<K, V, NODE>`.
166
179
  * @param {V} [value] - The `value` parameter is an optional value that can be passed to the
167
- * `keyValueOrEntryToNode` function. It represents the value associated with the keyOrNodeOrEntry node. If no value
168
- * is provided, it will be `undefined`.
169
- * @returns a value of type NODE (node), or null, or undefined.
180
+ * `keyValueOrEntryOrRawElementToNode` function. It represents the value associated with a key in a
181
+ * key-value pair. If provided, it will be used to create a node with the specified key and value.
182
+ * @returns The function `keyValueOrEntryOrRawElementToNode` returns either a `NODE` object, `null`,
183
+ * or `undefined`.
170
184
  */
171
- keyValueOrEntryToNode(keyOrNodeOrEntry, value) {
172
- if (keyOrNodeOrEntry === undefined)
185
+ keyValueOrEntryOrRawElementToNode(keyOrNodeOrEntryOrRawElement, value) {
186
+ if (keyOrNodeOrEntryOrRawElement === undefined)
173
187
  return;
174
- let node;
175
- if (keyOrNodeOrEntry === null) {
176
- node = null;
177
- }
178
- else if (this.isEntry(keyOrNodeOrEntry)) {
179
- const [key, value] = keyOrNodeOrEntry;
180
- if (key === undefined) {
188
+ if (keyOrNodeOrEntryOrRawElement === null)
189
+ return null;
190
+ if (this.isNode(keyOrNodeOrEntryOrRawElement))
191
+ return keyOrNodeOrEntryOrRawElement;
192
+ if (this.toEntryFn) {
193
+ const [key, entryValue] = this.toEntryFn(keyOrNodeOrEntryOrRawElement);
194
+ if (key)
195
+ return this.createNode(key, entryValue ?? value);
196
+ else
181
197
  return;
182
- }
183
- else if (key === null) {
184
- node = null;
185
- }
186
- else {
187
- node = this.createNode(key, value);
188
- }
189
- }
190
- else if (this.isNode(keyOrNodeOrEntry)) {
191
- node = keyOrNodeOrEntry;
192
- }
193
- else if (!this.isNode(keyOrNodeOrEntry)) {
194
- node = this.createNode(keyOrNodeOrEntry, value);
195
198
  }
196
- else {
197
- return;
199
+ if (this.isEntry(keyOrNodeOrEntryOrRawElement)) {
200
+ const [key, value] = keyOrNodeOrEntryOrRawElement;
201
+ if (key === undefined)
202
+ return;
203
+ else if (key === null)
204
+ return null;
205
+ else
206
+ return this.createNode(key, value);
198
207
  }
199
- return node;
208
+ if (this.isKey(keyOrNodeOrEntryOrRawElement))
209
+ return this.createNode(keyOrNodeOrEntryOrRawElement, value);
210
+ return;
200
211
  }
201
212
  /**
202
213
  * Time Complexity: O(n)
@@ -206,56 +217,56 @@ export class BinaryTree extends IterableEntryBase {
206
217
  * Time Complexity: O(n)
207
218
  * Space Complexity: O(log n)
208
219
  *
209
- * The function `ensureNode` returns the node corresponding to the given key if it is a valid node
210
- * key, otherwise it returns the key itself.
211
- * @param {K | NODE | null | undefined} keyOrNodeOrEntry - The `key` parameter can be of type `K`, `NODE`,
212
- * `null`, or `undefined`. It represents a key used to identify a node in a binary tree.
213
- * @param iterationType - The `iterationType` parameter is an optional parameter that specifies the
214
- * type of iteration to be used when searching for a node by key. It has a default value of
215
- * `'ITERATIVE'`.
216
- * @returns either the node corresponding to the given key if it is a valid node key, or the key
217
- * itself if it is not a valid node key.
218
- */
219
- ensureNode(keyOrNodeOrEntry, iterationType = 'ITERATIVE') {
220
- if (keyOrNodeOrEntry === this.NIL)
220
+ * The `ensureNode` function checks if the input is a valid node and returns it, or converts it to a
221
+ * node if it is a key or entry.
222
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
223
+ * `keyOrNodeOrEntryOrRawElement` can accept a value of type `R`, `KeyOrNodeOrEntry<K, V, NODE>`, or
224
+ * a raw element.
225
+ * @param {IterationType} [iterationType=ITERATIVE] - The `iterationType` parameter is an optional
226
+ * parameter that specifies the type of iteration to be used when searching for a node. It has a
227
+ * default value of `'ITERATIVE'`.
228
+ * @returns The function `ensureNode` returns either a `NODE` object, `null`, or `undefined`.
229
+ */
230
+ ensureNode(keyOrNodeOrEntryOrRawElement, iterationType = 'ITERATIVE') {
231
+ if (keyOrNodeOrEntryOrRawElement === null)
232
+ return null;
233
+ if (keyOrNodeOrEntryOrRawElement === undefined)
234
+ return;
235
+ if (keyOrNodeOrEntryOrRawElement === this.NIL)
221
236
  return;
222
- if (this.isRealNode(keyOrNodeOrEntry)) {
223
- return keyOrNodeOrEntry;
237
+ if (this.isNode(keyOrNodeOrEntryOrRawElement))
238
+ return keyOrNodeOrEntryOrRawElement;
239
+ if (this.toEntryFn) {
240
+ const [key] = this.toEntryFn(keyOrNodeOrEntryOrRawElement);
241
+ if (key)
242
+ return this.getNodeByKey(key);
224
243
  }
225
- if (this.isEntry(keyOrNodeOrEntry)) {
226
- const key = keyOrNodeOrEntry[0];
244
+ if (this.isEntry(keyOrNodeOrEntryOrRawElement)) {
245
+ const key = keyOrNodeOrEntryOrRawElement[0];
227
246
  if (key === null)
228
247
  return null;
229
248
  if (key === undefined)
230
249
  return;
231
250
  return this.getNodeByKey(key, iterationType);
232
251
  }
233
- if (keyOrNodeOrEntry === null)
234
- return null;
235
- if (keyOrNodeOrEntry === undefined)
236
- return;
237
- return this.getNodeByKey(keyOrNodeOrEntry, iterationType);
252
+ if (this.isKey(keyOrNodeOrEntryOrRawElement))
253
+ return this.getNodeByKey(keyOrNodeOrEntryOrRawElement, iterationType);
254
+ return;
238
255
  }
239
256
  /**
240
- * The function checks if a given node is a real node or null.
241
- * @param {any} node - The parameter `node` is of type `any`, which means it can be any data type.
242
- * @returns a boolean value.
257
+ * The function checks if the input is an instance of the BinaryTreeNode class.
258
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
259
+ * `keyOrNodeOrEntryOrRawElement` can be of type `R` or `KeyOrNodeOrEntry<K, V, NODE>`.
260
+ * @returns a boolean value indicating whether the input parameter `keyOrNodeOrEntryOrRawElement` is
261
+ * an instance of the `BinaryTreeNode` class.
243
262
  */
244
- isNodeOrNull(node) {
245
- return this.isRealNode(node) || node === null;
263
+ isNode(keyOrNodeOrEntryOrRawElement) {
264
+ return keyOrNodeOrEntryOrRawElement instanceof BinaryTreeNode;
246
265
  }
247
266
  /**
248
- * The function "isNode" checks if an keyOrNodeOrEntry is an instance of the BinaryTreeNode class.
249
- * @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter is a variable of type `KeyOrNodeOrEntry<K, V,NODE>`.
250
- * @returns a boolean value indicating whether the keyOrNodeOrEntry is an instance of the class NODE.
251
- */
252
- isNode(keyOrNodeOrEntry) {
253
- return keyOrNodeOrEntry instanceof BinaryTreeNode;
254
- }
255
- /**
256
- * The function checks if a given node is a real node by verifying if it is an instance of
257
- * BinaryTreeNode and its key is not NaN.
258
- * @param {any} node - The parameter `node` is of type `any`, which means it can be any data type.
267
+ * The function checks if a given node is a valid node in a binary search tree.
268
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} node - The parameter `node` can be of type `R` or
269
+ * `KeyOrNodeOrEntry<K, V, NODE>`.
259
270
  * @returns a boolean value.
260
271
  */
261
272
  isRealNode(node) {
@@ -264,21 +275,64 @@ export class BinaryTree extends IterableEntryBase {
264
275
  return this.isNode(node);
265
276
  }
266
277
  /**
267
- * The function checks if a given node is a BinaryTreeNode instance and has a key value of NaN.
268
- * @param {any} node - The parameter `node` is of type `any`, which means it can be any data type.
278
+ * The function checks if a given node is a real node or null.
279
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} node - The parameter `node` can be of type `R` or
280
+ * `KeyOrNodeOrEntry<K, V, NODE>`.
281
+ * @returns a boolean value.
282
+ */
283
+ isNodeOrNull(node) {
284
+ return this.isRealNode(node) || node === null;
285
+ }
286
+ /**
287
+ * The function checks if a given node is equal to the NIL value.
288
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} node - The parameter `node` can be of type `R` or
289
+ * `KeyOrNodeOrEntry<K, V, NODE>`.
269
290
  * @returns a boolean value.
270
291
  */
271
292
  isNIL(node) {
272
293
  return node === this.NIL;
273
294
  }
274
295
  /**
275
- * The function checks if a given value is an entry in a binary tree node.
276
- * @param keyOrNodeOrEntry - KeyOrNodeOrEntry<K, V,NODE> - A generic type representing a node in a binary tree. It has
277
- * two type parameters V and NODE, representing the value and node type respectively.
296
+ * The function checks if the input is an array with two elements, indicating it is a binary tree
297
+ * node entry.
298
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
299
+ * `keyOrNodeOrEntryOrRawElement` can be of type `R` or `KeyOrNodeOrEntry<K, V, NODE>`.
278
300
  * @returns a boolean value.
279
301
  */
280
- isEntry(keyOrNodeOrEntry) {
281
- return Array.isArray(keyOrNodeOrEntry) && keyOrNodeOrEntry.length === 2;
302
+ isEntry(keyOrNodeOrEntryOrRawElement) {
303
+ return Array.isArray(keyOrNodeOrEntryOrRawElement) && keyOrNodeOrEntryOrRawElement.length === 2;
304
+ }
305
+ /**
306
+ * The function checks if a given value is a valid key by evaluating its type and value.
307
+ * @param {any} key - The `key` parameter can be of any type. It is the value that we want to check
308
+ * if it is a valid key.
309
+ * @param [isCheckValueOf=true] - The `isCheckValueOf` parameter is a boolean flag that determines
310
+ * whether the function should check the valueOf() method of an object when the key is of type
311
+ * 'object'. If `isCheckValueOf` is true, the function will recursively call itself with the value
312
+ * returned by key.valueOf().
313
+ * @returns a boolean value.
314
+ */
315
+ isKey(key, isCheckValueOf = true) {
316
+ if (key === null)
317
+ return true;
318
+ const keyType = typeof key;
319
+ if (keyType === 'string' || keyType === 'bigint' || keyType === 'boolean')
320
+ return true;
321
+ if (keyType === 'number')
322
+ return !isNaN(key);
323
+ if (keyType === 'symbol' || keyType === 'undefined')
324
+ return false;
325
+ if (keyType === 'function')
326
+ return this.isKey(key());
327
+ if (keyType === 'object') {
328
+ if (typeof key.toString === 'function')
329
+ return true;
330
+ if (isCheckValueOf && typeof key.valueOf === 'function') {
331
+ this.isKey(key.valueOf(), false);
332
+ }
333
+ return false;
334
+ }
335
+ return false;
282
336
  }
283
337
  /**
284
338
  * Time Complexity O(n)
@@ -288,14 +342,20 @@ export class BinaryTree extends IterableEntryBase {
288
342
  * Time Complexity O(n)
289
343
  * Space Complexity O(1)
290
344
  *
291
- * The `add` function adds a new node to a binary tree, either by creating a new node or replacing an
292
- * existing node with the same key.
293
- * @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter can be one of the following:
294
- * @param {V} [value] - The value to be inserted into the binary tree.
295
- * @returns The function `add` returns either a node (`NODE`), `null`, or `undefined`.
296
- */
297
- add(keyOrNodeOrEntry, value) {
298
- const newNode = this.keyValueOrEntryToNode(keyOrNodeOrEntry, value);
345
+ * The `add` function is used to insert a new node into a binary tree, checking for duplicate keys
346
+ * and finding the appropriate insertion position.
347
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The
348
+ * `keyOrNodeOrEntryOrRawElement` parameter can accept a value of type `R`, which represents the key,
349
+ * node, entry, or raw element to be added to the tree. It can also accept a value of type
350
+ * `KeyOrNodeOrEntry<K, V, NODE>
351
+ * @param {V} [value] - The `value` parameter is an optional value that can be associated with the
352
+ * key being added to the tree. It represents the value that will be stored in the tree for the given
353
+ * key.
354
+ * @returns a boolean value. It returns `true` if the insertion is successful, and `false` if the
355
+ * insertion position cannot be found or if there are duplicate keys.
356
+ */
357
+ add(keyOrNodeOrEntryOrRawElement, value) {
358
+ const newNode = this.keyValueOrEntryOrRawElementToNode(keyOrNodeOrEntryOrRawElement, value);
299
359
  if (newNode === undefined)
300
360
  return false;
301
361
  // If the tree is empty, directly set the new node as the root node
@@ -349,20 +409,24 @@ export class BinaryTree extends IterableEntryBase {
349
409
  * Time Complexity: O(k * n)
350
410
  * Space Complexity: O(1)
351
411
  *
352
- * The `addMany` function takes in a collection of keysOrNodesOrEntries and an optional collection of values, and
353
- * adds each node with its corresponding value to the data structure.
354
- * @param keysOrNodesOrEntries - An iterable collection of KeyOrNodeOrEntry objects.
355
- * @param [values] - An optional iterable of values that will be assigned to each node being added.
356
- * @returns The function `addMany` returns an array of `NODE`, `null`, or `undefined` values.
357
- */
358
- addMany(keysOrNodesOrEntries, values) {
412
+ * The `addMany` function takes in an iterable of keys or nodes or entries or raw elements, and an
413
+ * optional iterable of values, and adds each key or node or entry with its corresponding value to a
414
+ * data structure, returning an array of booleans indicating whether each insertion was successful.
415
+ * @param keysOrNodesOrEntriesOrRawElements - An iterable containing keys, nodes, entries, or raw
416
+ * elements. These elements will be added to the data structure.
417
+ * @param [values] - An optional iterable of values that correspond to the keys or nodes or entries
418
+ * in the `keysOrNodesOrEntriesOrRawElements` parameter.
419
+ * @returns The function `addMany` returns an array of booleans indicating whether each element was
420
+ * successfully added to the data structure.
421
+ */
422
+ addMany(keysOrNodesOrEntriesOrRawElements, values) {
359
423
  // TODO not sure addMany not be run multi times
360
424
  const inserted = [];
361
425
  let valuesIterator;
362
426
  if (values) {
363
427
  valuesIterator = values[Symbol.iterator]();
364
428
  }
365
- for (const keyOrNodeOrEntry of keysOrNodesOrEntries) {
429
+ for (const keyOrNodeOrEntryOrRawElement of keysOrNodesOrEntriesOrRawElements) {
366
430
  let value = undefined;
367
431
  if (valuesIterator) {
368
432
  const valueResult = valuesIterator.next();
@@ -370,7 +434,7 @@ export class BinaryTree extends IterableEntryBase {
370
434
  value = valueResult.value;
371
435
  }
372
436
  }
373
- inserted.push(this.add(keyOrNodeOrEntry, value));
437
+ inserted.push(this.add(keyOrNodeOrEntryOrRawElement, value));
374
438
  }
375
439
  return inserted;
376
440
  }
@@ -383,36 +447,34 @@ export class BinaryTree extends IterableEntryBase {
383
447
  * Time Complexity: O(k * n)
384
448
  * Space Complexity: O(1)
385
449
  *
386
- * The `refill` function clears the current data and adds new key-value pairs to the data structure.
387
- * @param keysOrNodesOrEntries - An iterable containing keys, nodes, or entries. These can be of type
388
- * KeyOrNodeOrEntry<K, V, NODE>.
389
- * @param [values] - The `values` parameter is an optional iterable that contains the values to be
390
- * associated with the keys or nodes or entries in the `keysOrNodesOrEntries` parameter. If provided,
391
- * the values will be associated with the corresponding keys or nodes or entries in the
392
- * `keysOrNodesOrEntries` iterable
393
- */
394
- refill(keysOrNodesOrEntries, values) {
450
+ * The `refill` function clears the current data and adds new data to the collection.
451
+ * @param keysOrNodesOrEntriesOrRawElements - An iterable collection of keys, nodes, entries, or raw
452
+ * elements. These can be of any type (R) or a specific type (KeyOrNodeOrEntry<K, V, NODE>).
453
+ * @param [values] - The `values` parameter is an optional iterable of values that will be associated
454
+ * with the keys or nodes being added. If provided, the values will be assigned to the corresponding
455
+ * keys or nodes. If not provided, the values will be set to `undefined`.
456
+ */
457
+ refill(keysOrNodesOrEntriesOrRawElements, values) {
395
458
  this.clear();
396
- this.addMany(keysOrNodesOrEntries, values);
459
+ this.addMany(keysOrNodesOrEntriesOrRawElements, values);
397
460
  }
398
461
  /**
399
462
  * Time Complexity: O(n)
400
463
  * Space Complexity: O(1)
401
- * /
402
-
403
- /**
464
+ */
465
+ /**
404
466
  * Time Complexity: O(n)
405
467
  * Space Complexity: O(1)
406
468
  *
407
- * The function deletes a node from a binary tree and returns an array of the deleted nodes along
408
- * with the nodes that need to be balanced.
409
- * @param {ReturnType<C> | null | undefined} identifier - The identifier parameter is the value or
410
- * object that you want to delete from the binary tree. It can be of any type that is compatible with
411
- * the callback function's return type. It can also be null or undefined if you want to delete a
412
- * specific node based on its value or object.
469
+ * The above function is a TypeScript implementation of deleting a node from a binary tree, returning
470
+ * the deleted node and the node that needs to be balanced.
471
+ * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is the value
472
+ * used to identify the node that needs to be deleted from the binary tree. It can be of any type
473
+ * that is returned by the callback function.
413
474
  * @param {C} callback - The `callback` parameter is a function that is used to determine the
414
- * identifier of the node to be deleted. It is optional and has a default value of
415
- * `this._DEFAULT_CALLBACK`. The `callback` function should return the identifier of the node.
475
+ * identifier of the node to be deleted. It is of type `C`, which extends the `BTNCallback<NODE>`
476
+ * interface. The `BTNCallback<NODE>` interface represents a callback function that takes a node of
477
+ * type `NODE
416
478
  * @returns an array of `BinaryTreeDeleteResult<NODE>`.
417
479
  */
418
480
  delete(identifier, callback = this._DEFAULT_CALLBACK) {
@@ -467,28 +529,27 @@ export class BinaryTree extends IterableEntryBase {
467
529
  */
468
530
  /**
469
531
  * Time Complexity: O(n)
470
- * Space Complexity: O(k + log n).
532
+ * Space Complexity: O(k + log n)
471
533
  *
472
- * The function `getNodes` retrieves nodes from a binary tree based on a given identifier and
473
- * callback function.
534
+ * The function `getNodes` returns an array of nodes that match a given identifier, using either a
535
+ * recursive or iterative approach.
474
536
  * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is the value
475
- * that you want to search for in the binary tree. It can be of any type that is returned by the
476
- * callback function `C`. It can also be `null` or `undefined` if you don't want to search for a
477
- * specific value.
478
- * @param {C} callback - The `callback` parameter is a function that takes a node of type `NODE` as
479
- * input and returns a value of type `C`. It is used to determine if a node matches the given
480
- * identifier. If no callback is provided, the `_DEFAULT_CALLBACK` function is used as the
481
- * default
482
- * @param [onlyOne=false] - A boolean value indicating whether to only return the first node that
483
- * matches the identifier. If set to true, the function will stop iterating once it finds a matching
484
- * node and return that node. If set to false (default), the function will continue iterating and
485
- * return all nodes that match the identifier.
486
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
487
- * starting node for the traversal. It can be either a key, a node object, or `null`/`undefined`. If
488
- * it is `null` or `undefined`, an empty array will be returned.
489
- * @param iterationType - The `iterationType` parameter determines the type of iteration used to
490
- * traverse the binary tree. It can have two possible values:
491
- * @returns an array of nodes of type `NODE`.
537
+ * that is used to identify the nodes. It can be of any type and is used to match against the result
538
+ * of the callback function for each node.
539
+ * @param {C} callback - The `callback` parameter is a function that takes a node as input and
540
+ * returns a value. This value is used to identify the nodes that match the given identifier. The
541
+ * `callback` function is optional and defaults to a default callback function
542
+ * (`this._DEFAULT_CALLBACK`) if not provided.
543
+ * @param [onlyOne=false] - A boolean value indicating whether to return only one node that matches
544
+ * the identifier or all nodes that match the identifier. If set to true, only the first matching
545
+ * node will be returned. If set to false, all matching nodes will be returned. The default value is
546
+ * false.
547
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
548
+ * point for the search. It can be either a node object, a key-value pair, or a key. If it is not
549
+ * provided, the `root` of the data structure is used as the starting point.
550
+ * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
551
+ * iteration to be performed on the nodes of a binary tree. It can have two possible values:
552
+ * @returns an array of NODE objects.
492
553
  */
493
554
  getNodes(identifier, callback = this._DEFAULT_CALLBACK, onlyOne = false, beginRoot = this.root, iterationType = this.iterationType) {
494
555
  beginRoot = this.ensureNode(beginRoot);
@@ -533,24 +594,21 @@ export class BinaryTree extends IterableEntryBase {
533
594
  */
534
595
  /**
535
596
  * Time Complexity: O(n)
536
- * Space Complexity: O(log n)
597
+ * Space Complexity: O(log n).
537
598
  *
538
- * The function `getNode` returns the first node that matches the given identifier and callback
539
- * function.
599
+ * The function `getNode` returns the first node that matches the given identifier and callback,
600
+ * starting from the specified root node and using the specified iteration type.
540
601
  * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is the value
541
- * used to identify the node you want to retrieve. It can be of any type that is returned by the
542
- * callback function `C`. It can also be `null` or `undefined` if you don't have a specific
543
- * identifier.
544
- * @param {C} callback - The `callback` parameter is a function that will be called for each node in
545
- * the binary tree. It is used to determine if a node matches the given identifier. The `callback`
546
- * function should take a single parameter of type `NODE` (the type of the nodes in the binary tree) and
547
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting point
548
- * for searching the binary tree. It can be either a key value, a node object, or `null`/`undefined`.
549
- * If `null` or `undefined` is passed, the search will start from the root of the binary tree.
550
- * @param iterationType - The `iterationType` parameter is used to specify the type of iteration to
551
- * be performed when searching for nodes in the binary tree. It determines the order in which the
552
- * nodes are visited during the search.
553
- * @returns a value of type `NODE | null | undefined`.
602
+ * used to identify the node you want to retrieve. It can be of any type that is the return type of
603
+ * the `C` callback function, or it can be `null` or `undefined`.
604
+ * @param {C} callback - The `callback` parameter is a function that will be used to determine if a
605
+ * node matches the desired criteria. It should return a value that can be used to identify the node.
606
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
607
+ * point for searching nodes in a tree structure. It can be either a root node, a key-value pair, or
608
+ * a node entry. If not provided, the search will start from the root of the tree.
609
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to specify the type
610
+ * of iteration to be performed when searching for nodes. It can have one of the following values:
611
+ * @returns The method is returning a NODE object, or null, or undefined.
554
612
  */
555
613
  getNode(identifier, callback = this._DEFAULT_CALLBACK, beginRoot = this.root, iterationType = this.iterationType) {
556
614
  return this.getNodes(identifier, callback, true, beginRoot, iterationType)[0] ?? null;
@@ -563,15 +621,13 @@ export class BinaryTree extends IterableEntryBase {
563
621
  * Time Complexity: O(n)
564
622
  * Space Complexity: O(log n)
565
623
  *
566
- * The function `getNodeByKey` searches for a node in a binary tree by its key, using either
567
- * recursive or iterative iteration.
568
- * @param {K} key - The `key` parameter is the key value that we are searching for in the tree.
569
- * It is used to find the node with the matching key value.
570
- * @param iterationType - The `iterationType` parameter is used to determine whether the search for
571
- * the node with the given key should be performed iteratively or recursively. It has two possible
572
- * values:
573
- * @returns The function `getNodeByKey` returns a node (`NODE`) if a node with the specified key is
574
- * found in the binary tree. If no node is found, it returns `undefined`.
624
+ * The function `getNodeByKey` returns a node with a specific key value from a tree structure.
625
+ * @param {K} key - The key parameter is the value that you want to search for in the tree. It is
626
+ * used to find the node with the matching key value.
627
+ * @param {IterationType} [iterationType=ITERATIVE] - The `iterationType` parameter is an optional
628
+ * parameter that specifies the type of iteration to be used when searching for a node in the tree.
629
+ * It has a default value of `'ITERATIVE'`.
630
+ * @returns a value of type NODE, null, or undefined.
575
631
  */
576
632
  getNodeByKey(key, iterationType = 'ITERATIVE') {
577
633
  return this.getNode(key, this._DEFAULT_CALLBACK, this.root, iterationType);
@@ -584,51 +640,49 @@ export class BinaryTree extends IterableEntryBase {
584
640
  * Time Complexity: O(n)
585
641
  * Space Complexity: O(log n)
586
642
  *
587
- * The function `get` retrieves the value of a node in a binary tree based on the provided identifier
588
- * and callback function.
643
+ * The function `get` in TypeScript overrides the base class method and returns the value associated
644
+ * with the given identifier.
589
645
  * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is the value
590
- * used to identify the node in the binary tree. It can be of any type that is the return type of the
646
+ * used to identify the node in the binary tree. It can be of any type that is returned by the
591
647
  * callback function `C`. It can also be `null` or `undefined` if no identifier is provided.
592
- * @param {C} callback - The `callback` parameter is a function that will be called with each node in
593
- * the binary tree. It is used to determine whether a node matches the given identifier. The callback
594
- * function should return a value that can be compared to the identifier to determine if it is a
595
- * match.
596
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting point
597
- * for the search in the binary tree. It can be specified as a `K` (a unique identifier for a
598
- * node), a node object of type `NODE`, or `null`/`undefined` to start the search from the root of
599
- * @param iterationType - The `iterationType` parameter is used to specify the type of iteration to
600
- * be performed when searching for a node in the binary tree. It is an optional parameter with a
601
- * default value specified by `this.iterationType`.
602
- * @returns The value of the node with the given identifier is being returned. If the node is not
603
- * found, `undefined` is returned.
648
+ * @param {C} callback - The `callback` parameter is a function that will be used to determine if a
649
+ * node matches the given identifier. It is optional and defaults to `this._DEFAULT_CALLBACK`.
650
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
651
+ * point for the search in the binary tree. It can be either a root node of the tree or a key, node,
652
+ * or entry object that exists in the tree. If no specific starting point is provided, the search
653
+ * will begin from the root of the
654
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to specify the type
655
+ * of iteration to be performed when searching for a node in the tree. It can have one of the
656
+ * following values:
657
+ * @returns The method is returning the value associated with the specified identifier in the binary
658
+ * tree.
604
659
  */
605
660
  get(identifier, callback = this._DEFAULT_CALLBACK, beginRoot = this.root, iterationType = this.iterationType) {
606
661
  return this.getNode(identifier, callback, beginRoot, iterationType)?.value;
607
662
  }
608
663
  /**
609
664
  * Time Complexity: O(n)
610
- * Space Complexity: O(log n).
665
+ * Space Complexity: O(log n)
611
666
  */
612
667
  /**
613
668
  * Time Complexity: O(n)
614
- * Space Complexity: O(log n).
669
+ * Space Complexity: O(log n)
615
670
  *
616
- * The function checks if a Binary Tree Node with a specific identifier exists in the tree.
671
+ * The `has` function checks if a given identifier exists in the data structure and returns a boolean
672
+ * value.
617
673
  * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is the value
618
- * that you want to search for in the binary tree. It can be of any type that is returned by the
619
- * callback function `C`. It can also be `null` or `undefined` if you don't want to specify a
620
- * specific identifier.
621
- * @param {C} callback - The `callback` parameter is a function that will be called for each node in
622
- * the binary tree. It is used to filter the nodes based on certain conditions. The `callback`
623
- * function should return a boolean value indicating whether the node should be included in the
624
- * result or not.
625
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting point
626
- * for the search in the binary tree. It can be specified as a `K` (a unique identifier for a
627
- * node in the binary tree), a node object (`NODE`), or `null`/`undefined` to start the search from
628
- * @param iterationType - The `iterationType` parameter is a variable that determines the type of
629
- * iteration to be performed on the binary tree. It is used to specify whether the iteration should
630
- * be performed in a pre-order, in-order, or post-order manner.
631
- * @returns a boolean value.
674
+ * used to identify a specific node or entry in the data structure. It can be of any type that is
675
+ * returned by the callback function `C`. It can also be `null` or `undefined` if no specific
676
+ * identifier is provided.
677
+ * @param {C} callback - The `callback` parameter is a function that will be used to determine
678
+ * whether a node should be included in the result or not. It is of type `C`, which extends the
679
+ * `BTNCallback<NODE>` type.
680
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
681
+ * point for the iteration in the data structure. It can be either a root node, a key-value pair, or
682
+ * a node entry. If not specified, it defaults to the root of the data structure.
683
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to specify the type
684
+ * of iteration to be performed. It is an optional parameter with a default value of `IterationType`.
685
+ * @returns The method is returning a boolean value.
632
686
  */
633
687
  has(identifier, callback = this._DEFAULT_CALLBACK, beginRoot = this.root, iterationType = this.iterationType) {
634
688
  callback = this._ensureCallback(identifier, callback);
@@ -672,9 +726,10 @@ export class BinaryTree extends IterableEntryBase {
672
726
  *
673
727
  * The function checks if a binary tree is perfectly balanced by comparing the minimum height and the
674
728
  * height of the tree.
675
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting point
676
- * for calculating the height and minimum height of a binary tree. It can be either a `K` (a key
677
- * value of a binary tree node), `NODE` (a node of a binary tree), `null`, or `undefined`. If
729
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The parameter `beginRoot` is optional and
730
+ * has a default value of `this.root`. It represents the starting point for checking if the tree is
731
+ * perfectly balanced. It can be either a root node (`R`), a key or node or entry
732
+ * (`KeyOrNodeOrEntry<K, V, NODE
678
733
  * @returns a boolean value.
679
734
  */
680
735
  isPerfectlyBalanced(beginRoot = this.root) {
@@ -688,12 +743,14 @@ export class BinaryTree extends IterableEntryBase {
688
743
  * Time Complexity: O(n)
689
744
  * Space Complexity: O(1)
690
745
  *
691
- * The function `isSubtreeBST` checks if a given binary tree is a valid binary search tree.
692
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the root
693
- * node of the binary search tree (BST) that you want to check if it is a subtree of another BST.
694
- * @param iterationType - The `iterationType` parameter is an optional parameter that specifies the
695
- * type of iteration to use when checking if a subtree is a binary search tree (BST). It can have two
696
- * possible values:
746
+ * The function `isBST` checks if a binary search tree is valid, either recursively or iteratively.
747
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
748
+ * starting point for checking if a binary search tree (BST) is valid. It can be either a root node
749
+ * of the BST, a key value of a node in the BST, or an entry object containing both the key and value
750
+ * of a node in the BST
751
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to determine the type
752
+ * of iteration to be performed while checking if the binary search tree (BST) is valid. It can have
753
+ * two possible values:
697
754
  * @returns a boolean value.
698
755
  */
699
756
  isBST(beginRoot = this.root, iterationType = this.iterationType) {
@@ -746,14 +803,15 @@ export class BinaryTree extends IterableEntryBase {
746
803
  * Time Complexity: O(n)
747
804
  * Space Complexity: O(1)
748
805
  *
749
- * The function calculates the depth of a given node in a binary tree.
750
- * @param {K | NODE | null | undefined} dist - The `dist` parameter represents the node in
751
- * the binary tree whose depth we want to find. It can be of type `K`, `NODE`, `null`, or
752
- * `undefined`.
753
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting node
754
- * from which we want to calculate the depth. It can be either a `K` (binary tree node key) or
755
- * `NODE` (binary tree node) or `null` or `undefined`. If no value is provided for `beginRoot
756
- * @returns the depth of the `dist` relative to the `beginRoot`.
806
+ * The function calculates the depth of a given node or key in a tree-like data structure.
807
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} dist - The `dist` parameter can be either a `R`
808
+ * (representing a root node), or a `KeyOrNodeOrEntry<K, V, NODE>` (representing a key, node, or
809
+ * entry).
810
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is optional and
811
+ * represents the starting point from which to calculate the depth. It can be either a reference to a
812
+ * node in the tree or a key-value pair or an entry object. If not provided, the default value is
813
+ * `this.root`, which refers to the root node
814
+ * @returns the depth of a node in a tree structure.
757
815
  */
758
816
  getDepth(dist, beginRoot = this.root) {
759
817
  let distEnsured = this.ensureNode(dist);
@@ -774,17 +832,16 @@ export class BinaryTree extends IterableEntryBase {
774
832
  */
775
833
  /**
776
834
  * Time Complexity: O(n)
777
- * Space Complexity: O(log n)
835
+ * Space Complexity: O(1)
778
836
  *
779
- * The function `getHeight` calculates the maximum height of a binary tree using either recursive or
780
- * iterative traversal.
781
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
782
- * starting node of the binary tree from which we want to calculate the height. It can be of type
783
- * `K`, `NODE`, `null`, or `undefined`. If not provided, it defaults to `this.root`.
784
- * @param iterationType - The `iterationType` parameter is used to determine whether to calculate the
785
- * height of the tree using a recursive approach or an iterative approach. It can have two possible
786
- * values:
787
- * @returns the height of the binary tree.
837
+ * The `getHeight` function calculates the maximum height of a binary tree using either a recursive
838
+ * or iterative approach.
839
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
840
+ * starting point for calculating the height of a tree. It can be either a root node (`R`), a key or
841
+ * node or entry (`KeyOrNodeOrEntry<K, V, NODE>`), or it defaults to the root of the current tree.
842
+ * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
843
+ * iteration used to calculate the height of the tree. It can have two possible values:
844
+ * @returns the maximum height of the binary tree.
788
845
  */
789
846
  getHeight(beginRoot = this.root, iterationType = this.iterationType) {
790
847
  beginRoot = this.ensureNode(beginRoot);
@@ -824,12 +881,15 @@ export class BinaryTree extends IterableEntryBase {
824
881
  *
825
882
  * The `getMinHeight` function calculates the minimum height of a binary tree using either a
826
883
  * recursive or iterative approach.
827
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
828
- * starting node of the binary tree from which we want to calculate the minimum height. It can be of
829
- * type `K`, `NODE`, `null`, or `undefined`. If no value is provided, it defaults to `this.root`.
830
- * @param iterationType - The `iterationType` parameter is used to determine the method of iteration
831
- * to calculate the minimum height of a binary tree. It can have two possible values:
832
- * @returns The function `getMinHeight` returns the minimum height of a binary tree.
884
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
885
+ * starting point for calculating the minimum height of a tree. It can be either a root node (`R`), a
886
+ * key or node or entry (`KeyOrNodeOrEntry<K, V, NODE>`), or it defaults to the root of the current
887
+ * tree.
888
+ * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
889
+ * iteration to be used when calculating the minimum height of the tree. It can have two possible
890
+ * values:
891
+ * @returns The function `getMinHeight` returns a number, which represents the minimum height of the
892
+ * binary tree.
833
893
  */
834
894
  getMinHeight(beginRoot = this.root, iterationType = this.iterationType) {
835
895
  beginRoot = this.ensureNode(beginRoot);
@@ -878,31 +938,27 @@ export class BinaryTree extends IterableEntryBase {
878
938
  /**
879
939
  * Time Complexity: O(log n)
880
940
  * Space Complexity: O(log n)
881
- * /
882
-
883
- /**
941
+ */
942
+ /**
884
943
  * Time Complexity: O(log n)
885
944
  * Space Complexity: O(log n)
886
945
  *
887
- * The function `getPathToRoot` returns an array of nodes from a given node to the root of a tree
888
- * structure, with the option to reverse the order of the nodes.
889
- * @param {K | NODE | null | undefined} beginNode - The `beginRoot` parameter represents the
890
- * starting node from which you want to find the path to the root. It can be of type `K`, `NODE`,
891
- * `null`, or `undefined`.
946
+ * The function `getPathToRoot` returns an array of nodes starting from a given node and traversing
947
+ * up to the root node, with an option to reverse the order of the nodes.
948
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginNode - The `beginNode` parameter can be either of
949
+ * type `R` or `KeyOrNodeOrEntry<K, V, NODE>`.
892
950
  * @param [isReverse=true] - The `isReverse` parameter is a boolean flag that determines whether the
893
951
  * resulting path should be reversed or not. If `isReverse` is set to `true`, the path will be
894
- * reversed before returning it. If `isReverse` is set to `false`, the path will be returned as is
895
- * @returns The function `getPathToRoot` returns an array of nodes (`NODE[]`).
952
+ * reversed before returning it. If `isReverse` is set to `false` or not provided, the path will
953
+ * @returns The function `getPathToRoot` returns an array of `NODE` objects.
896
954
  */
897
955
  getPathToRoot(beginNode, isReverse = true) {
898
- // TODO to support get path through passing key
899
956
  const result = [];
900
957
  let beginNodeEnsured = this.ensureNode(beginNode);
901
958
  if (!beginNodeEnsured)
902
959
  return result;
903
960
  while (beginNodeEnsured.parent) {
904
961
  // Array.push + Array.reverse is more efficient than Array.unshift
905
- // TODO may consider using Deque, so far this is not the performance bottleneck
906
962
  result.push(beginNodeEnsured);
907
963
  beginNodeEnsured = beginNodeEnsured.parent;
908
964
  }
@@ -917,15 +973,14 @@ export class BinaryTree extends IterableEntryBase {
917
973
  * Time Complexity: O(log n)
918
974
  * Space Complexity: O(1)
919
975
  *
920
- * The function `getLeftMost` returns the leftmost node in a binary tree, either recursively or
921
- * iteratively.
922
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting point
923
- * for finding the leftmost node in a binary tree. It can be either a `K` (a key value), `NODE` (a
924
- * node), `null`, or `undefined`. If not provided, it defaults to `this.root`,
925
- * @param iterationType - The `iterationType` parameter is used to determine the type of iteration to
926
- * be performed when finding the leftmost node in a binary tree. It can have two possible values:
927
- * @returns The function `getLeftMost` returns the leftmost node (`NODE`) in the binary tree. If there
928
- * is no leftmost node, it returns `null` or `undefined` depending on the input.
976
+ * The `getLeftMost` function returns the leftmost node in a binary tree, either using recursive or
977
+ * iterative traversal.
978
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
979
+ * starting point for finding the leftmost node in a binary tree. It can be either a root node (`R`),
980
+ * a key or node or entry (`KeyOrNodeOrEntry<K, V, NODE>`), or `null` or `undefined`.
981
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to specify the type
982
+ * of iteration to be performed. It can have two possible values:
983
+ * @returns The function `getLeftMost` returns the leftmost node in a binary tree.
929
984
  */
930
985
  getLeftMost(beginRoot = this.root, iterationType = this.iterationType) {
931
986
  if (this.isNIL(beginRoot))
@@ -959,16 +1014,15 @@ export class BinaryTree extends IterableEntryBase {
959
1014
  * Time Complexity: O(log n)
960
1015
  * Space Complexity: O(1)
961
1016
  *
962
- * The function `getRightMost` returns the rightmost node in a binary tree, either recursively or
1017
+ * The `getRightMost` function returns the rightmost node in a binary tree, either recursively or
963
1018
  * iteratively.
964
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
965
- * starting node from which we want to find the rightmost node. It can be of type `K`, `NODE`,
966
- * `null`, or `undefined`. If not provided, it defaults to `this.root`, which is a property of the
967
- * current object.
968
- * @param iterationType - The `iterationType` parameter is an optional parameter that specifies the
969
- * type of iteration to use when finding the rightmost node. It can have one of two values:
970
- * @returns The function `getRightMost` returns the rightmost node (`NODE`) in a binary tree. If there
971
- * is no rightmost node, it returns `null` or `undefined`, depending on the input.
1019
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
1020
+ * starting point for finding the rightmost node in a binary tree. It can be either a root node
1021
+ * (`R`), a key or node or entry (`KeyOrNodeOrEntry<K, V, NODE>`), or `null` or `undefined`.
1022
+ * @param {IterationType} iterationType - The `iterationType` parameter is used to specify the type
1023
+ * of iteration to be performed when finding the rightmost node in a binary tree. It can have two
1024
+ * possible values:
1025
+ * @returns The function `getRightMost` returns a NODE object, `null`, or `undefined`.
972
1026
  */
973
1027
  getRightMost(beginRoot = this.root, iterationType = this.iterationType) {
974
1028
  if (this.isNIL(beginRoot))
@@ -1003,10 +1057,10 @@ export class BinaryTree extends IterableEntryBase {
1003
1057
  * Time Complexity: O(log n)
1004
1058
  * Space Complexity: O(1)
1005
1059
  *
1006
- * The function returns the predecessor of a given node in a tree.
1007
- * @param {NODE} node - The parameter `node` is of type `RedBlackTreeNode`, which represents a node in a
1060
+ * The function returns the predecessor node of a given node in a binary tree.
1061
+ * @param {NODE} node - The parameter "node" is of type "NODE", which represents a node in a binary
1008
1062
  * tree.
1009
- * @returns the predecessor of the given 'node'.
1063
+ * @returns the predecessor node of the given node.
1010
1064
  */
1011
1065
  getPredecessor(node) {
1012
1066
  if (this.isRealNode(node.left)) {
@@ -1032,8 +1086,8 @@ export class BinaryTree extends IterableEntryBase {
1032
1086
  *
1033
1087
  * The function `getSuccessor` returns the next node in a binary tree given a current node.
1034
1088
  * @param {K | NODE | null} [x] - The parameter `x` can be of type `K`, `NODE`, or `null`.
1035
- * @returns the successor of the given node or key. The successor is the node that comes immediately
1036
- * after the given node in the inorder traversal of the binary tree.
1089
+ * @returns The function `getSuccessor` returns a `NODE` object if a successor exists, `null` if
1090
+ * there is no successor, and `undefined` if the input `x` is not a valid node.
1037
1091
  */
1038
1092
  getSuccessor(x) {
1039
1093
  x = this.ensureNode(x);
@@ -1052,30 +1106,29 @@ export class BinaryTree extends IterableEntryBase {
1052
1106
  /**
1053
1107
  * Time complexity: O(n)
1054
1108
  * Space complexity: O(n)
1055
- * /
1056
-
1057
- /**
1109
+ */
1110
+ /**
1058
1111
  * Time complexity: O(n)
1059
1112
  * Space complexity: O(n)
1060
1113
  *
1061
- * The `dfs` function performs a depth-first search traversal on a binary tree or graph, based on the
1062
- * specified pattern and iteration type, and returns an array of values obtained from applying a
1063
- * callback function to each visited node.
1064
- * @param {C} callback - The `callback` parameter is a function that will be called for each node in
1065
- * the tree during the depth-first search. It takes a single parameter, which can be of type `NODE`,
1066
- * `null`, or `undefined`, and returns a value of any type. The default value for this parameter is
1067
- * @param {DFSOrderPattern} [pattern=in] - The `pattern` parameter determines the order in which the
1068
- * nodes are traversed during the depth-first search. It can have one of the following values:
1069
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting node
1070
- * for the depth-first search traversal. It can be specified as a key, a node object, or
1071
- * `null`/`undefined`. If not provided, the `beginRoot` will default to the root node of the tree.
1072
- * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
1073
- * iteration to use when traversing the tree. It can have one of the following values:
1114
+ * The `dfs` function performs a depth-first search traversal on a binary tree, executing a callback
1115
+ * function on each node according to a specified pattern and iteration type.
1116
+ * @param {C} callback - The `callback` parameter is a function that will be called for each node
1117
+ * visited during the depth-first search. It takes a node as an argument and returns a value. The
1118
+ * return type of the callback function is determined by the generic type `C`.
1119
+ * @param {DFSOrderPattern} [pattern=IN] - The `pattern` parameter determines the order in which the
1120
+ * nodes are visited during the depth-first search. It can have one of the following values:
1121
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
1122
+ * point of the depth-first search. It can be either a node object, a key-value pair, or a key. If it
1123
+ * is a key or key-value pair, the method will find the corresponding node in the tree and start the
1124
+ * search from there.
1125
+ * @param {IterationType} [iterationType=ITERATIVE] - The `iterationType` parameter determines the
1126
+ * type of iteration to use during the depth-first search. It can have two possible values:
1074
1127
  * @param [includeNull=false] - The `includeNull` parameter is a boolean value that determines
1075
- * whether null or undefined nodes should be included in the traversal. If `includeNull` is set to
1076
- * `true`, null or undefined nodes will be included in the traversal. If `includeNull` is set to
1077
- * `false`, null or undefined
1078
- * @returns an array of values that are the return values of the callback function.
1128
+ * whether or not to include null values in the depth-first search traversal. If `includeNull` is set
1129
+ * to `true`, null values will be included in the traversal. If `includeNull` is set to `false`, null
1130
+ * values will
1131
+ * @returns an array of the return types of the callback function.
1079
1132
  */
1080
1133
  dfs(callback = this._DEFAULT_CALLBACK, pattern = 'IN', beginRoot = this.root, iterationType = 'ITERATIVE', includeNull = false) {
1081
1134
  beginRoot = this.ensureNode(beginRoot);
@@ -1191,22 +1244,23 @@ export class BinaryTree extends IterableEntryBase {
1191
1244
  * Time complexity: O(n)
1192
1245
  * Space complexity: O(n)
1193
1246
  *
1194
- * The `bfs` function performs a breadth-first search traversal on a binary tree, executing a
1195
- * callback function on each node.
1247
+ * The `bfs` function performs a breadth-first search on a binary tree, calling a callback function
1248
+ * on each node and returning an array of the results.
1196
1249
  * @param {C} callback - The `callback` parameter is a function that will be called for each node in
1197
- * the breadth-first search traversal. It takes a single parameter, which is the current node being
1250
+ * the breadth-first search traversal. It takes a single argument, which is the current node being
1198
1251
  * visited, and returns a value of any type.
1199
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
1200
- * starting node for the breadth-first search traversal. It can be specified as a key, a node object,
1201
- * or `null`/`undefined` to indicate the root of the tree. If not provided, the `root` property of
1202
- * the class is used as
1203
- * @param iterationType - The `iterationType` parameter determines the type of iteration to be
1204
- * performed during the breadth-first search (BFS). It can have two possible values:
1205
- * @param [includeNull=false] - The `includeNull` parameter is a boolean flag that determines whether
1206
- * to include null values in the breadth-first search traversal. If `includeNull` is set to
1207
- * `true`, null values will be included in the traversal, otherwise they will be skipped.
1208
- * @returns an array of values that are the result of invoking the callback function on each node in
1209
- * the breadth-first traversal of a binary tree.
1252
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
1253
+ * starting point of the breadth-first search. It can be either a root node of a tree or a key, node,
1254
+ * or entry object. If no value is provided, the `root` property of the class is used as the default
1255
+ * starting point.
1256
+ * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
1257
+ * iteration to be performed. It can have two possible values:
1258
+ * @param [includeNull=false] - The `includeNull` parameter is a boolean value that determines
1259
+ * whether or not to include null values in the breadth-first search (BFS) traversal. If
1260
+ * `includeNull` is set to `true`, null values will be included in the traversal. If `includeNull` is
1261
+ * set to `false
1262
+ * @returns The function `bfs` returns an array of values that are the result of invoking the
1263
+ * `callback` function on each node in the breadth-first order traversal of the binary tree.
1210
1264
  */
1211
1265
  bfs(callback = this._DEFAULT_CALLBACK, beginRoot = this.root, iterationType = this.iterationType, includeNull = false) {
1212
1266
  beginRoot = this.ensureNode(beginRoot);
@@ -1269,18 +1323,18 @@ export class BinaryTree extends IterableEntryBase {
1269
1323
  * Space complexity: O(n)
1270
1324
  *
1271
1325
  * The `listLevels` function returns an array of arrays, where each inner array represents a level in
1272
- * a binary tree and contains the values returned by a callback function applied to the nodes at that
1273
- * level.
1326
+ * a binary tree and contains the results of applying a callback function to the nodes at that level.
1274
1327
  * @param {C} callback - The `callback` parameter is a function that will be called for each node in
1275
- * the tree. It takes a single parameter, which can be of type `NODE`, `null`, or `undefined`, and
1276
- * returns a value of any type.
1277
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter represents the
1278
- * starting node for traversing the tree. It can be either a node object (`NODE`), a key value
1279
- * (`K`), `null`, or `undefined`. If not provided, it defaults to the root node of the tree.
1280
- * @param iterationType - The `iterationType` parameter determines the type of iteration to be
1281
- * performed on the tree. It can have two possible values:
1328
+ * the tree. It takes a node as an argument and returns a value. The return type of the callback
1329
+ * function is determined by the generic type `C` which extends `BTNCallback<NODE | null>`.
1330
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter represents the
1331
+ * starting point for traversing the tree. It can be either a root node, a key-value pair, or a node
1332
+ * entry. If no value is provided, the `root` property of the class is used as the default starting
1333
+ * point.
1334
+ * @param {IterationType} iterationType - The `iterationType` parameter determines the type of
1335
+ * iteration to be performed on the binary tree. It can have two possible values:
1282
1336
  * @param [includeNull=false] - The `includeNull` parameter is a boolean value that determines
1283
- * whether to include null values in the resulting levels. If `includeNull` is set to `true`,
1337
+ * whether or not to include null values in the resulting levels. If `includeNull` is set to `true`,
1284
1338
  * null values will be included in the levels. If `includeNull` is set to `false`, null values will
1285
1339
  * be excluded
1286
1340
  * @returns The function `listLevels` returns a two-dimensional array of type `ReturnType<C>[][]`.
@@ -1345,17 +1399,17 @@ export class BinaryTree extends IterableEntryBase {
1345
1399
  * The `morris` function performs a depth-first traversal on a binary tree using the Morris traversal
1346
1400
  * algorithm.
1347
1401
  * @param {C} callback - The `callback` parameter is a function that will be called for each node in
1348
- * the tree. It takes a single parameter of type `NODE` (the type of the nodes in the tree) and returns
1349
- * a value of any type.
1350
- * @param {DFSOrderPattern} [pattern=in] - The `pattern` parameter in the `morris` function
1351
- * determines the order in which the nodes of a binary tree are traversed. It can have one of the
1402
+ * the tree. It takes a single argument, which is the current node, and can return any value. The
1403
+ * return type of the `callback` function is determined by the `ReturnType<C>` type, which represents
1404
+ * the return
1405
+ * @param {DFSOrderPattern} [pattern=IN] - The `pattern` parameter in the `morris` function is used
1406
+ * to specify the order in which the nodes of a binary tree are traversed. It can take one of the
1352
1407
  * following values:
1353
- * @param {K | NODE | null | undefined} beginRoot - The `beginRoot` parameter is the starting node
1354
- * for the traversal. It can be specified as a key, a node object, or `null`/`undefined` to indicate
1355
- * the root of the tree. If no value is provided, the default value is the root of the tree.
1356
- * @returns The function `morris` returns an array of values that are the result of invoking the
1357
- * `callback` function on each node in the binary tree. The type of the array nodes is determined
1358
- * by the return type of the `callback` function.
1408
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
1409
+ * point for the traversal. It can be either a node object, a key, or an entry object. If no value is
1410
+ * provided, the `root` of the tree is used as the starting point.
1411
+ * @returns The function `morris` returns an array of values that are the return values of the
1412
+ * callback function `callback`.
1359
1413
  */
1360
1414
  morris(callback = this._DEFAULT_CALLBACK, pattern = 'IN', beginRoot = this.root) {
1361
1415
  beginRoot = this.ensureNode(beginRoot);
@@ -1450,8 +1504,7 @@ export class BinaryTree extends IterableEntryBase {
1450
1504
  * Time complexity: O(n)
1451
1505
  * Space complexity: O(n)
1452
1506
  *
1453
- * The `clone` function creates a new tree object and copies all the nodes from the original tree to
1454
- * the new tree.
1507
+ * The `clone` function creates a deep copy of a tree object.
1455
1508
  * @returns The `clone()` method is returning a cloned instance of the `TREE` object.
1456
1509
  */
1457
1510
  clone() {
@@ -1472,16 +1525,16 @@ export class BinaryTree extends IterableEntryBase {
1472
1525
  * Time Complexity: O(n)
1473
1526
  * Space Complexity: O(n)
1474
1527
  *
1475
- * The `filter` function creates a new tree by iterating over the nodes of the current tree and
1476
- * adding only the nodes that satisfy the given predicate function.
1477
- * @param predicate - The `predicate` parameter is a function that takes three arguments: `value`,
1478
- * `key`, and `index`. It should return a boolean value indicating whether the pair should be
1479
- * included in the filtered tree or not.
1480
- * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value
1481
- * to be used as the `this` value when executing the `predicate` function. If `thisArg` is provided,
1482
- * it will be passed as the first argument to the `predicate` function. If `thisArg` is
1483
- * @returns The `filter` method is returning a new tree object that contains the key-value pairs that
1484
- * pass the given predicate function.
1528
+ * The `filter` function creates a new tree with entries that pass a given predicate function.
1529
+ * @param predicate - The `predicate` parameter is a callback function that is used to test each
1530
+ * element in the tree. It takes three arguments: `value`, `key`, and `index`. The `value` argument
1531
+ * represents the value of the current element being processed, the `key` argument represents the key
1532
+ * of the
1533
+ * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to
1534
+ * specify the value of `this` within the `predicate` function. When the `predicate` function is
1535
+ * called, `thisArg` will be used as the value of `this` within the function. If `thisArg`
1536
+ * @returns The `filter` method is returning a new tree object that contains the entries that pass
1537
+ * the given predicate function.
1485
1538
  */
1486
1539
  filter(predicate, thisArg) {
1487
1540
  const newTree = this.createTree();
@@ -1501,15 +1554,15 @@ export class BinaryTree extends IterableEntryBase {
1501
1554
  * Time Complexity: O(n)
1502
1555
  * Space Complexity: O(n)
1503
1556
  *
1504
- * The `map` function creates a new tree by applying a callback function to each key-value pair in
1505
- * the original tree.
1506
- * @param callback - The callback parameter is a function that will be called for each key-value pair
1507
- * in the tree. It takes four arguments: the value of the current pair, the key of the current pair,
1508
- * the index of the current pair, and a reference to the tree itself. The callback function should
1509
- * return a new
1510
- * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that allows you to
1511
- * specify the value of `this` within the callback function. If you pass a value for `thisArg`, it
1512
- * will be used as the `this` value when the callback function is called. If you don't pass a value
1557
+ * The `map` function creates a new tree by applying a callback function to each entry in the current
1558
+ * tree.
1559
+ * @param callback - The callback parameter is a function that will be called for each entry in the
1560
+ * tree. It takes three arguments: value, key, and index. The value argument represents the value of
1561
+ * the current entry, the key argument represents the key of the current entry, and the index
1562
+ * argument represents the index of the
1563
+ * @param {any} [thisArg] - The `thisArg` parameter is an optional argument that specifies the value
1564
+ * to be used as `this` when executing the `callback` function. If `thisArg` is provided, it will be
1565
+ * passed as the `this` value to the `callback` function. If `thisArg` is
1513
1566
  * @returns The `map` method is returning a new tree object.
1514
1567
  */
1515
1568
  map(callback, thisArg) {
@@ -1537,11 +1590,15 @@ export class BinaryTree extends IterableEntryBase {
1537
1590
  * Time Complexity: O(n)
1538
1591
  * Space Complexity: O(n)
1539
1592
  *
1540
- * The `print` function is used to display a binary tree structure in a visually appealing way.
1541
- * @param {K | NODE | null | undefined} [beginRoot=this.root] - The `root` parameter is of type `K | NODE | null |
1542
- * undefined`. It represents the root node of a binary tree. The root node can have one of the
1543
- * following types:
1544
- * @param {BinaryTreePrintOptions} [options={ isShowUndefined: false, isShowNull: false, isShowRedBlackNIL: false}] - Options object that controls printing behavior. You can specify whether to display undefined, null, or sentinel nodes.
1593
+ * The `print` function in TypeScript prints the binary tree structure with customizable options.
1594
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} beginRoot - The `beginRoot` parameter is the starting
1595
+ * point for printing the binary tree. It can be either a node of the binary tree or a key or entry
1596
+ * that exists in the binary tree. If no value is provided, the root of the binary tree will be used
1597
+ * as the starting point.
1598
+ * @param {BinaryTreePrintOptions} [options] - The `options` parameter is an optional object that
1599
+ * allows you to customize the printing behavior. It has the following properties:
1600
+ * @returns Nothing is being returned. The function has a return type of `void`, which means it does
1601
+ * not return any value.
1545
1602
  */
1546
1603
  print(beginRoot = this.root, options) {
1547
1604
  const opts = { isShowUndefined: false, isShowNull: false, isShowRedBlackNIL: false, ...options };
@@ -1566,13 +1623,18 @@ export class BinaryTree extends IterableEntryBase {
1566
1623
  display(beginRoot);
1567
1624
  }
1568
1625
  /**
1569
- * The function `_getIterator` is a protected generator function that returns an iterator for the
1570
- * key-value pairs in a binary search tree.
1571
- * @param node - The `node` parameter represents the current node in the binary search tree. It is an
1572
- * optional parameter with a default value of `this.root`, which means if no node is provided, the
1573
- * root node of the tree will be used as the starting point for iteration.
1574
- * @returns The function `_getIterator` returns an `IterableIterator` of key-value pairs `[K, V |
1575
- * undefined]`.
1626
+ * Time Complexity: O(1)
1627
+ * Space Complexity: O(1)
1628
+ */
1629
+ /**
1630
+ * Time Complexity: O(1)
1631
+ * Space Complexity: O(1)
1632
+ *
1633
+ * The function `_getIterator` is a generator function that returns an iterator for the key-value
1634
+ * pairs in a binary search tree.
1635
+ * @param node - The `node` parameter represents the current node in the binary search tree. It is
1636
+ * initially set to the root node of the tree.
1637
+ * @returns an IterableIterator<[K, V | undefined]>.
1576
1638
  */
1577
1639
  *_getIterator(node = this.root) {
1578
1640
  if (!node)
@@ -1603,6 +1665,13 @@ export class BinaryTree extends IterableEntryBase {
1603
1665
  }
1604
1666
  }
1605
1667
  /**
1668
+ * Time Complexity: O(n)
1669
+ * Space Complexity: O(n)
1670
+ */
1671
+ /**
1672
+ * Time Complexity: O(n)
1673
+ * Space Complexity: O(n)
1674
+ *
1606
1675
  * The `_displayAux` function is responsible for generating the display layout of a binary tree node,
1607
1676
  * taking into account various options such as whether to show null, undefined, or NaN nodes.
1608
1677
  * @param {NODE | null | undefined} node - The `node` parameter represents a node in a binary tree.
@@ -1631,12 +1700,12 @@ export class BinaryTree extends IterableEntryBase {
1631
1700
  }
1632
1701
  else if (node !== null && node !== undefined) {
1633
1702
  // Display logic of normal nodes
1634
- const key = node.key, line = this.isNIL(node) ? 'S' : key.toString(), width = line.length;
1703
+ const key = node.key, line = this.isNIL(node) ? 'S' : String(key), width = line.length;
1635
1704
  return _buildNodeDisplay(line, width, this._displayAux(node.left, options), this._displayAux(node.right, options));
1636
1705
  }
1637
1706
  else {
1638
1707
  // For cases where none of the conditions are met, null, undefined, and NaN nodes are not displayed
1639
- const line = node === undefined ? 'U' : 'NODE', width = line.length;
1708
+ const line = node === undefined ? 'U' : 'N', width = line.length;
1640
1709
  return _buildNodeDisplay(line, width, [[''], 1, 0, 0], [[''], 1, 0, 0]);
1641
1710
  }
1642
1711
  function _buildNodeDisplay(line, width, left, right) {
@@ -1670,10 +1739,21 @@ export class BinaryTree extends IterableEntryBase {
1670
1739
  }
1671
1740
  _DEFAULT_CALLBACK = (node) => (node ? node.key : undefined);
1672
1741
  /**
1673
- * Swap the data of two nodes in the binary tree.
1674
- * @param {NODE} srcNode - The source node to swap.
1675
- * @param {NODE} destNode - The destination node to swap.
1676
- * @returns {NODE} - The destination node after the swap.
1742
+ * Time Complexity: O(1)
1743
+ * Space Complexity: O(1)
1744
+ */
1745
+ /**
1746
+ * Time Complexity: O(1)
1747
+ * Space Complexity: O(1)
1748
+ *
1749
+ * The function `_swapProperties` swaps the key-value properties between two nodes.
1750
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} srcNode - The source node that will be swapped with the
1751
+ * destination node. It can be either an instance of the class `R`, or an object of type
1752
+ * `KeyOrNodeOrEntry<K, V, NODE>`.
1753
+ * @param {R | KeyOrNodeOrEntry<K, V, NODE>} destNode - The `destNode` parameter is the node where
1754
+ * the properties will be swapped with the `srcNode`.
1755
+ * @returns either the `destNode` object with its properties swapped with the `srcNode` object's
1756
+ * properties, or `undefined` if either `srcNode` or `destNode` is falsy.
1677
1757
  */
1678
1758
  _swapProperties(srcNode, destNode) {
1679
1759
  srcNode = this.ensureNode(srcNode);
@@ -1692,12 +1772,20 @@ export class BinaryTree extends IterableEntryBase {
1692
1772
  return undefined;
1693
1773
  }
1694
1774
  /**
1695
- * The function replaces an old node with a new node in a binary tree.
1775
+ * Time Complexity: O(1)
1776
+ * Space Complexity: O(1)
1777
+ */
1778
+ /**
1779
+ * Time Complexity: O(1)
1780
+ * Space Complexity: O(1)
1781
+ *
1782
+ * The function replaces a node in a binary tree with a new node, updating the parent, left child,
1783
+ * right child, and root if necessary.
1696
1784
  * @param {NODE} oldNode - The oldNode parameter represents the node that needs to be replaced in the
1697
1785
  * tree.
1698
1786
  * @param {NODE} newNode - The `newNode` parameter is the node that will replace the `oldNode` in the
1699
1787
  * tree.
1700
- * @returns The method is returning the newNode.
1788
+ * @returns the newNode.
1701
1789
  */
1702
1790
  _replaceNode(oldNode, newNode) {
1703
1791
  if (oldNode.parent) {
@@ -1717,10 +1805,17 @@ export class BinaryTree extends IterableEntryBase {
1717
1805
  return newNode;
1718
1806
  }
1719
1807
  /**
1720
- * The function sets the root property of an object to a given value, and if the value is not null,
1721
- * it also sets the parent property of the value to undefined.
1722
- * @param {NODE | null | undefined} v - The parameter `v` is of type `NODE | null | undefined`, which means it can either be of
1723
- * type `NODE` or `null`.
1808
+ * Time Complexity: O(1)
1809
+ * Space Complexity: O(1)
1810
+ */
1811
+ /**
1812
+ * Time Complexity: O(1)
1813
+ * Space Complexity: O(1)
1814
+ *
1815
+ * The function sets the root property of an object to the provided value, and also updates the
1816
+ * parent property of the new root.
1817
+ * @param {NODE | null | undefined} v - The parameter `v` is of type `NODE | null | undefined`. This
1818
+ * means that it can accept a value of type `NODE`, `null`, or `undefined`.
1724
1819
  */
1725
1820
  _setRoot(v) {
1726
1821
  if (v) {
@@ -1728,6 +1823,23 @@ export class BinaryTree extends IterableEntryBase {
1728
1823
  }
1729
1824
  this._root = v;
1730
1825
  }
1826
+ /**
1827
+ * Time Complexity: O(1)
1828
+ * Space Complexity: O(1)
1829
+ */
1830
+ /**
1831
+ * Time Complexity: O(1)
1832
+ * Space Complexity: O(1)
1833
+ *
1834
+ * The function `_ensureCallback` ensures that a callback function is provided and returns it.
1835
+ * @param {ReturnType<C> | null | undefined} identifier - The `identifier` parameter is of type
1836
+ * `ReturnType<C> | null | undefined`. This means it can accept a value that is the return type of
1837
+ * the generic type `C`, or it can be `null` or `undefined`.
1838
+ * @param {C} callback - The `callback` parameter is a function that takes a `node` as an argument
1839
+ * and returns a value. It is of type `C`, which is a generic type that extends the
1840
+ * `BTNCallback<NODE>` type.
1841
+ * @returns the callback parameter.
1842
+ */
1731
1843
  _ensureCallback(identifier, callback = this._DEFAULT_CALLBACK) {
1732
1844
  if ((!callback || callback === this._DEFAULT_CALLBACK) && this.isNode(identifier)) {
1733
1845
  callback = (node => node);