avl-tree-typed 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +3859 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/index.mjs +3852 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/types/data-structures/base/index.d.ts +2 -1
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +182 -2
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +135 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +291 -2
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +174 -1
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +754 -29
- package/dist/types/data-structures/binary-tree/bst.d.ts +413 -12
- package/dist/types/data-structures/binary-tree/index.d.ts +3 -2
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +208 -3
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +160 -1
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +190 -2
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +270 -2
- package/dist/types/data-structures/graph/abstract-graph.d.ts +340 -14
- package/dist/types/data-structures/graph/directed-graph.d.ts +207 -1
- package/dist/types/data-structures/graph/index.d.ts +2 -1
- package/dist/types/data-structures/graph/map-graph.d.ts +78 -1
- package/dist/types/data-structures/graph/undirected-graph.d.ts +188 -1
- package/dist/types/data-structures/hash/hash-map.d.ts +345 -19
- package/dist/types/data-structures/hash/index.d.ts +0 -1
- package/dist/types/data-structures/heap/heap.d.ts +503 -5
- package/dist/types/data-structures/heap/index.d.ts +2 -0
- package/dist/types/data-structures/heap/max-heap.d.ts +32 -1
- package/dist/types/data-structures/heap/min-heap.d.ts +33 -1
- package/dist/types/data-structures/index.d.ts +7 -7
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +769 -2
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +451 -2
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +27 -4
- package/dist/types/data-structures/matrix/index.d.ts +1 -1
- package/dist/types/data-structures/matrix/matrix.d.ts +168 -7
- package/dist/types/data-structures/matrix/navigator.d.ts +54 -13
- package/dist/types/data-structures/priority-queue/max-priority-queue.d.ts +27 -1
- package/dist/types/data-structures/priority-queue/min-priority-queue.d.ts +26 -1
- package/dist/types/data-structures/priority-queue/priority-queue.d.ts +15 -2
- package/dist/types/data-structures/queue/deque.d.ts +431 -4
- package/dist/types/data-structures/queue/queue.d.ts +308 -4
- package/dist/types/data-structures/stack/stack.d.ts +306 -2
- package/dist/types/data-structures/tree/tree.d.ts +62 -1
- package/dist/types/data-structures/trie/trie.d.ts +350 -4
- package/dist/types/index.d.ts +15 -3
- package/dist/{interfaces → types/interfaces}/binary-tree.d.ts +1 -1
- package/dist/types/types/data-structures/base/index.d.ts +1 -0
- package/dist/types/types/data-structures/binary-tree/avl-tree-counter.d.ts +2 -0
- package/dist/types/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -0
- package/dist/types/types/data-structures/binary-tree/avl-tree.d.ts +2 -0
- package/dist/types/types/data-structures/binary-tree/binary-indexed-tree.d.ts +1 -0
- package/dist/types/types/data-structures/binary-tree/binary-tree.d.ts +29 -0
- package/dist/types/types/data-structures/binary-tree/bst.d.ts +12 -0
- package/dist/{data-structures → types/types/data-structures}/binary-tree/index.d.ts +2 -3
- package/dist/types/types/data-structures/binary-tree/red-black-tree.d.ts +3 -0
- package/dist/types/types/data-structures/binary-tree/segment-tree.d.ts +1 -0
- package/dist/types/types/data-structures/binary-tree/tree-counter.d.ts +2 -0
- package/dist/types/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -0
- package/dist/types/types/data-structures/graph/abstract-graph.d.ts +14 -0
- package/dist/types/types/data-structures/graph/directed-graph.d.ts +1 -0
- package/dist/{data-structures → types/types/data-structures}/graph/index.d.ts +1 -2
- package/dist/types/types/data-structures/graph/map-graph.d.ts +1 -0
- package/dist/types/types/data-structures/graph/undirected-graph.d.ts +1 -0
- package/dist/types/types/data-structures/hash/hash-map.d.ts +19 -0
- package/dist/types/types/data-structures/hash/index.d.ts +2 -0
- package/dist/types/types/data-structures/heap/heap.d.ts +5 -0
- package/dist/types/types/data-structures/heap/index.d.ts +1 -0
- package/dist/types/types/data-structures/heap/max-heap.d.ts +1 -0
- package/dist/types/types/data-structures/heap/min-heap.d.ts +1 -0
- package/dist/types/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -0
- package/dist/types/types/data-structures/linked-list/singly-linked-list.d.ts +2 -0
- package/dist/types/types/data-structures/linked-list/skip-linked-list.d.ts +4 -0
- package/dist/types/types/data-structures/matrix/matrix.d.ts +7 -0
- package/dist/types/types/data-structures/matrix/navigator.d.ts +14 -0
- package/dist/types/types/data-structures/priority-queue/max-priority-queue.d.ts +1 -0
- package/dist/types/types/data-structures/priority-queue/min-priority-queue.d.ts +1 -0
- package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +2 -0
- package/dist/types/types/data-structures/queue/deque.d.ts +4 -0
- package/dist/types/types/data-structures/queue/queue.d.ts +4 -0
- package/dist/types/types/data-structures/stack/stack.d.ts +2 -0
- package/dist/types/types/data-structures/tree/tree.d.ts +1 -0
- package/dist/types/types/data-structures/trie/trie.d.ts +4 -0
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/types/utils/index.d.ts +2 -0
- package/dist/types/types/utils/utils.d.ts +22 -0
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/utils.d.ts +209 -22
- package/dist/umd/avl-tree-typed.js +3852 -0
- package/dist/umd/avl-tree-typed.js.map +1 -0
- package/dist/umd/avl-tree-typed.min.js +13 -0
- package/dist/umd/avl-tree-typed.min.js.map +1 -0
- package/package.json +25 -5
- package/src/data-structures/binary-tree/avl-tree-counter.ts +4 -4
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +2 -2
- package/src/data-structures/binary-tree/binary-tree.ts +4 -4
- package/src/data-structures/binary-tree/bst.ts +1 -1
- package/src/data-structures/binary-tree/red-black-tree.ts +2 -2
- package/src/data-structures/binary-tree/tree-counter.ts +4 -4
- package/src/data-structures/binary-tree/tree-multi-map.ts +1 -1
- package/src/data-structures/heap/heap.ts +5 -5
- package/src/data-structures/linked-list/singly-linked-list.ts +2 -2
- package/src/interfaces/binary-tree.ts +1 -1
- package/tsconfig.base.json +23 -0
- package/tsconfig.json +8 -34
- package/tsconfig.test.json +8 -0
- package/tsconfig.types.json +15 -0
- package/tsup.config.js +28 -0
- package/tsup.node.config.js +37 -0
- package/dist/common/index.js +0 -28
- package/dist/constants/index.js +0 -8
- package/dist/data-structures/base/index.d.ts +0 -2
- package/dist/data-structures/base/index.js +0 -18
- package/dist/data-structures/base/iterable-element-base.js +0 -243
- package/dist/data-structures/base/iterable-entry-base.js +0 -183
- package/dist/data-structures/base/linear-base.js +0 -415
- package/dist/data-structures/binary-tree/avl-tree-counter.d.ts +0 -182
- package/dist/data-structures/binary-tree/avl-tree-counter.js +0 -374
- package/dist/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -135
- package/dist/data-structures/binary-tree/avl-tree-multi-map.js +0 -250
- package/dist/data-structures/binary-tree/avl-tree.d.ts +0 -291
- package/dist/data-structures/binary-tree/avl-tree.js +0 -611
- package/dist/data-structures/binary-tree/binary-indexed-tree.d.ts +0 -174
- package/dist/data-structures/binary-tree/binary-indexed-tree.js +0 -294
- package/dist/data-structures/binary-tree/binary-tree.d.ts +0 -754
- package/dist/data-structures/binary-tree/binary-tree.js +0 -1925
- package/dist/data-structures/binary-tree/bst.d.ts +0 -413
- package/dist/data-structures/binary-tree/bst.js +0 -903
- package/dist/data-structures/binary-tree/index.js +0 -26
- package/dist/data-structures/binary-tree/red-black-tree.d.ts +0 -208
- package/dist/data-structures/binary-tree/red-black-tree.js +0 -546
- package/dist/data-structures/binary-tree/segment-tree.d.ts +0 -160
- package/dist/data-structures/binary-tree/segment-tree.js +0 -297
- package/dist/data-structures/binary-tree/tree-counter.d.ts +0 -190
- package/dist/data-structures/binary-tree/tree-counter.js +0 -413
- package/dist/data-structures/binary-tree/tree-multi-map.d.ts +0 -270
- package/dist/data-structures/binary-tree/tree-multi-map.js +0 -384
- package/dist/data-structures/graph/abstract-graph.d.ts +0 -340
- package/dist/data-structures/graph/abstract-graph.js +0 -896
- package/dist/data-structures/graph/directed-graph.d.ts +0 -207
- package/dist/data-structures/graph/directed-graph.js +0 -525
- package/dist/data-structures/graph/index.js +0 -20
- package/dist/data-structures/graph/map-graph.d.ts +0 -78
- package/dist/data-structures/graph/map-graph.js +0 -107
- package/dist/data-structures/graph/undirected-graph.d.ts +0 -188
- package/dist/data-structures/graph/undirected-graph.js +0 -424
- package/dist/data-structures/hash/hash-map.d.ts +0 -345
- package/dist/data-structures/hash/hash-map.js +0 -692
- package/dist/data-structures/hash/index.d.ts +0 -1
- package/dist/data-structures/hash/index.js +0 -17
- package/dist/data-structures/heap/heap.d.ts +0 -503
- package/dist/data-structures/heap/heap.js +0 -901
- package/dist/data-structures/heap/index.d.ts +0 -3
- package/dist/data-structures/heap/index.js +0 -19
- package/dist/data-structures/heap/max-heap.d.ts +0 -32
- package/dist/data-structures/heap/max-heap.js +0 -40
- package/dist/data-structures/heap/min-heap.d.ts +0 -33
- package/dist/data-structures/heap/min-heap.js +0 -31
- package/dist/data-structures/index.js +0 -28
- package/dist/data-structures/linked-list/doubly-linked-list.d.ts +0 -769
- package/dist/data-structures/linked-list/doubly-linked-list.js +0 -1111
- package/dist/data-structures/linked-list/index.js +0 -19
- package/dist/data-structures/linked-list/singly-linked-list.d.ts +0 -451
- package/dist/data-structures/linked-list/singly-linked-list.js +0 -850
- package/dist/data-structures/linked-list/skip-linked-list.d.ts +0 -27
- package/dist/data-structures/linked-list/skip-linked-list.js +0 -144
- package/dist/data-structures/matrix/index.js +0 -18
- package/dist/data-structures/matrix/matrix.d.ts +0 -168
- package/dist/data-structures/matrix/matrix.js +0 -448
- package/dist/data-structures/matrix/navigator.d.ts +0 -55
- package/dist/data-structures/matrix/navigator.js +0 -111
- package/dist/data-structures/priority-queue/index.js +0 -19
- package/dist/data-structures/priority-queue/max-priority-queue.d.ts +0 -27
- package/dist/data-structures/priority-queue/max-priority-queue.js +0 -34
- package/dist/data-structures/priority-queue/min-priority-queue.d.ts +0 -26
- package/dist/data-structures/priority-queue/min-priority-queue.js +0 -24
- package/dist/data-structures/priority-queue/priority-queue.d.ts +0 -15
- package/dist/data-structures/priority-queue/priority-queue.js +0 -20
- package/dist/data-structures/queue/deque.d.ts +0 -431
- package/dist/data-structures/queue/deque.js +0 -879
- package/dist/data-structures/queue/index.js +0 -18
- package/dist/data-structures/queue/queue.d.ts +0 -308
- package/dist/data-structures/queue/queue.js +0 -473
- package/dist/data-structures/stack/index.js +0 -17
- package/dist/data-structures/stack/stack.d.ts +0 -306
- package/dist/data-structures/stack/stack.js +0 -401
- package/dist/data-structures/tree/index.js +0 -17
- package/dist/data-structures/tree/tree.d.ts +0 -62
- package/dist/data-structures/tree/tree.js +0 -107
- package/dist/data-structures/trie/index.js +0 -17
- package/dist/data-structures/trie/trie.d.ts +0 -350
- package/dist/data-structures/trie/trie.js +0 -610
- package/dist/index.d.ts +0 -15
- package/dist/index.js +0 -31
- package/dist/interfaces/binary-tree.js +0 -2
- package/dist/interfaces/doubly-linked-list.js +0 -2
- package/dist/interfaces/graph.js +0 -2
- package/dist/interfaces/heap.js +0 -2
- package/dist/interfaces/index.js +0 -24
- package/dist/interfaces/navigator.js +0 -2
- package/dist/interfaces/priority-queue.js +0 -2
- package/dist/interfaces/segment-tree.js +0 -2
- package/dist/interfaces/singly-linked-list.js +0 -2
- package/dist/types/common.js +0 -2
- package/dist/types/data-structures/base/base.js +0 -2
- package/dist/types/data-structures/base/index.js +0 -17
- package/dist/types/data-structures/binary-tree/avl-tree-counter.js +0 -2
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.js +0 -2
- package/dist/types/data-structures/binary-tree/avl-tree.js +0 -2
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.js +0 -2
- package/dist/types/data-structures/binary-tree/binary-tree.js +0 -2
- package/dist/types/data-structures/binary-tree/bst.js +0 -2
- package/dist/types/data-structures/binary-tree/index.js +0 -25
- package/dist/types/data-structures/binary-tree/red-black-tree.js +0 -2
- package/dist/types/data-structures/binary-tree/segment-tree.js +0 -2
- package/dist/types/data-structures/binary-tree/tree-counter.js +0 -2
- package/dist/types/data-structures/binary-tree/tree-multi-map.js +0 -2
- package/dist/types/data-structures/graph/abstract-graph.js +0 -2
- package/dist/types/data-structures/graph/directed-graph.js +0 -2
- package/dist/types/data-structures/graph/index.js +0 -19
- package/dist/types/data-structures/graph/map-graph.js +0 -2
- package/dist/types/data-structures/graph/undirected-graph.js +0 -2
- package/dist/types/data-structures/hash/hash-map.js +0 -2
- package/dist/types/data-structures/hash/index.js +0 -17
- package/dist/types/data-structures/heap/heap.js +0 -2
- package/dist/types/data-structures/heap/index.js +0 -17
- package/dist/types/data-structures/heap/max-heap.js +0 -2
- package/dist/types/data-structures/heap/min-heap.js +0 -2
- package/dist/types/data-structures/index.js +0 -28
- package/dist/types/data-structures/linked-list/doubly-linked-list.js +0 -2
- package/dist/types/data-structures/linked-list/index.js +0 -19
- package/dist/types/data-structures/linked-list/singly-linked-list.js +0 -2
- package/dist/types/data-structures/linked-list/skip-linked-list.js +0 -2
- package/dist/types/data-structures/matrix/index.js +0 -18
- package/dist/types/data-structures/matrix/matrix.js +0 -2
- package/dist/types/data-structures/matrix/navigator.js +0 -2
- package/dist/types/data-structures/priority-queue/index.js +0 -19
- package/dist/types/data-structures/priority-queue/max-priority-queue.js +0 -2
- package/dist/types/data-structures/priority-queue/min-priority-queue.js +0 -2
- package/dist/types/data-structures/priority-queue/priority-queue.js +0 -2
- package/dist/types/data-structures/queue/deque.js +0 -2
- package/dist/types/data-structures/queue/index.js +0 -18
- package/dist/types/data-structures/queue/queue.js +0 -2
- package/dist/types/data-structures/stack/index.js +0 -17
- package/dist/types/data-structures/stack/stack.js +0 -2
- package/dist/types/data-structures/tree/index.js +0 -17
- package/dist/types/data-structures/tree/tree.js +0 -2
- package/dist/types/data-structures/trie/index.js +0 -17
- package/dist/types/data-structures/trie/trie.js +0 -2
- package/dist/types/index.js +0 -19
- package/dist/types/utils/index.js +0 -18
- package/dist/types/utils/utils.js +0 -2
- package/dist/types/utils/validate-type.js +0 -2
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -18
- package/dist/utils/number.js +0 -23
- package/dist/utils/utils.d.ts +0 -209
- package/dist/utils/utils.js +0 -353
- package/dist/{common → types/common}/index.d.ts +0 -0
- package/dist/{constants → types/constants}/index.d.ts +0 -0
- package/dist/{data-structures → types/data-structures}/base/iterable-element-base.d.ts +0 -0
- package/dist/{data-structures → types/data-structures}/base/iterable-entry-base.d.ts +0 -0
- package/dist/{data-structures → types/data-structures}/base/linear-base.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/doubly-linked-list.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/graph.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/heap.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/index.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/navigator.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/priority-queue.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/segment-tree.d.ts +0 -0
- package/dist/{interfaces → types/interfaces}/singly-linked-list.d.ts +0 -0
- package/dist/types/{common.d.ts → types/common.d.ts} +0 -0
- package/dist/types/{data-structures → types/data-structures}/base/base.d.ts +0 -0
- package/dist/{data-structures → types/types/data-structures}/index.d.ts +7 -7
- package/dist/{data-structures → types/types/data-structures}/linked-list/index.d.ts +0 -0
- package/dist/{data-structures → types/types/data-structures}/matrix/index.d.ts +1 -1
- /package/dist/{data-structures → types/types/data-structures}/priority-queue/index.d.ts +0 -0
- /package/dist/{data-structures → types/types/data-structures}/queue/index.d.ts +0 -0
- /package/dist/{data-structures → types/types/data-structures}/stack/index.d.ts +0 -0
- /package/dist/{data-structures → types/types/data-structures}/tree/index.d.ts +0 -0
- /package/dist/{data-structures → types/types/data-structures}/trie/index.d.ts +0 -0
- /package/dist/types/{utils → types/utils}/validate-type.d.ts +0 -0
- /package/dist/{utils → types/utils}/number.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/utils.ts","../../src/data-structures/base/iterable-element-base.ts","../../src/data-structures/base/linear-base.ts","../../src/data-structures/queue/queue.ts","../../src/data-structures/base/iterable-entry-base.ts","../../src/common/index.ts","../../src/data-structures/binary-tree/binary-tree.ts","../../src/data-structures/binary-tree/bst.ts","../../src/data-structures/binary-tree/avl-tree.ts"],"names":["cur","node"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * data-structure-typed\n *\n * @author Pablo Zeng\n * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>\n * @license MIT License\n */\nimport type { Comparable, ComparablePrimitive, Trampoline, TrampolineThunk } from '../types';\n\n/**\n * The function generates a random UUID (Universally Unique Identifier) in TypeScript.\n * @returns A randomly generated UUID (Universally Unique Identifier) in the format\n * 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' where each 'x' is replaced with a random hexadecimal\n * character.\n */\nexport const uuidV4 = function () {\n return 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\n/**\n * The `arrayRemove` function removes elements from an array based on a specified predicate function\n * and returns the removed elements.\n * @param {T[]} array - An array of elements that you want to filter based on the provided predicate\n * function.\n * @param predicate - The `predicate` parameter is a function that takes three arguments:\n * @returns The `arrayRemove` function returns an array containing the elements that satisfy the given\n * `predicate` function.\n */\nexport const arrayRemove = function <T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): T[] {\n let i = -1,\n len = array ? array.length : 0;\n const result = [];\n\n while (++i < len) {\n const value = array[i];\n if (predicate(value, i, array)) {\n result.push(value);\n Array.prototype.splice.call(array, i--, 1);\n len--;\n }\n }\n\n return result;\n};\n\n/**\n * The function `getMSB` returns the most significant bit of a given number.\n * @param {number} value - The `value` parameter is a number for which we want to find the position of\n * the Most Significant Bit (MSB). The function `getMSB` takes this number as input and calculates the\n * position of the MSB in its binary representation.\n * @returns The function `getMSB` returns the most significant bit (MSB) of the input `value`. If the\n * input value is less than or equal to 0, it returns 0. Otherwise, it calculates the position of the\n * MSB using the `Math.clz32` function and bitwise left shifts 1 to that position.\n */\nexport const getMSB = (value: number): number => {\n if (value <= 0) {\n return 0;\n }\n return 1 << (31 - Math.clz32(value));\n};\n\n/**\n * The `rangeCheck` function in TypeScript is used to validate if an index is within a specified range\n * and throws a `RangeError` with a custom message if it is out of bounds.\n * @param {number} index - The `index` parameter represents the value that you want to check if it\n * falls within a specified range.\n * @param {number} min - The `min` parameter represents the minimum value that the `index` should be\n * compared against in the `rangeCheck` function.\n * @param {number} max - The `max` parameter in the `rangeCheck` function represents the maximum value\n * that the `index` parameter is allowed to have. If the `index` is greater than this `max` value, a\n * `RangeError` will be thrown.\n * @param [message=Index out of bounds.] - The `message` parameter is a string that represents the\n * error message to be thrown if the index is out of bounds. By default, if no message is provided when\n * calling the `rangeCheck` function, the message \"Index out of bounds.\" will be used.\n */\nexport const rangeCheck = (index: number, min: number, max: number, message = 'Index out of bounds.'): void => {\n if (index < min || index > max) throw new RangeError(message);\n};\n\n/**\n * The function `throwRangeError` throws a RangeError with a custom message if called.\n * @param [message=The value is off-limits.] - The `message` parameter is a string that represents the\n * error message to be displayed when a `RangeError` is thrown. If no message is provided, the default\n * message is 'The value is off-limits.'.\n */\nexport const throwRangeError = (message = 'The value is off-limits.'): void => {\n throw new RangeError(message);\n};\n\n/**\n * The function `isWeakKey` checks if the input is an object or a function in TypeScript.\n * @param {unknown} input - The `input` parameter in the `isWeakKey` function is of type `unknown`,\n * which means it can be any type. The function checks if the `input` is an object (excluding `null`)\n * or a function, and returns a boolean indicating whether the `input` is a weak\n * @returns The function `isWeakKey` returns a boolean value indicating whether the input is an object\n * or a function.\n */\nexport const isWeakKey = (input: unknown): input is object => {\n const inputType = typeof input;\n return (inputType === 'object' && input !== null) || inputType === 'function';\n};\n\n/**\n * The function `calcMinUnitsRequired` calculates the minimum number of units required to accommodate a\n * given total quantity based on a specified unit size.\n * @param {number} totalQuantity - The `totalQuantity` parameter represents the total quantity of items\n * that need to be processed or handled.\n * @param {number} unitSize - The `unitSize` parameter represents the size of each unit or package. It\n * is used in the `calcMinUnitsRequired` function to calculate the minimum number of units required to\n * accommodate a total quantity of items.\n */\nexport const calcMinUnitsRequired = (totalQuantity: number, unitSize: number) =>\n Math.floor((totalQuantity + unitSize - 1) / unitSize);\n\n/**\n * The `roundFixed` function in TypeScript rounds a number to a specified number of decimal places.\n * @param {number} num - The `num` parameter is a number that you want to round to a certain number of\n * decimal places.\n * @param {number} [digit=10] - The `digit` parameter in the `roundFixed` function specifies the number\n * of decimal places to round the number to. By default, it is set to 10 if not provided explicitly.\n * @returns The function `roundFixed` returns a number that is rounded to the specified number of\n * decimal places (default is 10 decimal places).\n */\nexport const roundFixed = (num: number, digit: number = 10) => {\n const multiplier = Math.pow(10, digit);\n return Math.round(num * multiplier) / multiplier;\n};\n\n/**\n * The function `isPrimitiveComparable` checks if a value is a primitive type that can be compared.\n * @param {unknown} value - The `value` parameter in the `isPrimitiveComparable` function is of type\n * `unknown`, which means it can be any type. The function checks if the `value` is a primitive type\n * that can be compared, such as number, bigint, string, or boolean.\n * @returns The function `isPrimitiveComparable` returns a boolean value indicating whether the input\n * `value` is a primitive value that can be compared using standard comparison operators (<, >, <=,\n * >=).\n */\nfunction isPrimitiveComparable(value: unknown): value is ComparablePrimitive {\n const valueType = typeof value;\n if (valueType === 'number') return true;\n // if (valueType === 'number') return !Number.isNaN(value);\n return valueType === 'bigint' || valueType === 'string' || valueType === 'boolean';\n}\n\n/**\n * The function `tryObjectToPrimitive` attempts to convert an object to a comparable primitive value by\n * first checking the `valueOf` method and then the `toString` method.\n * @param {object} obj - The `obj` parameter in the `tryObjectToPrimitive` function is an object that\n * you want to convert to a primitive value. The function attempts to convert the object to a primitive\n * value by first checking if the object has a `valueOf` method. If the `valueOf` method exists, it\n * @returns The function `tryObjectToPrimitive` returns a value of type `ComparablePrimitive` if a\n * primitive comparable value is found within the object, or a string value if the object has a custom\n * `toString` method that does not return `'[object Object]'`. If neither condition is met, the\n * function returns `null`.\n */\nfunction tryObjectToPrimitive(obj: object): ComparablePrimitive | null {\n if (typeof obj.valueOf === 'function') {\n const valueOfResult = obj.valueOf();\n if (valueOfResult !== obj) {\n if (isPrimitiveComparable(valueOfResult)) return valueOfResult;\n if (typeof valueOfResult === 'object' && valueOfResult !== null) return tryObjectToPrimitive(valueOfResult);\n }\n }\n if (typeof obj.toString === 'function') {\n const stringResult = obj.toString();\n if (stringResult !== '[object Object]') return stringResult;\n }\n return null;\n}\n\n/**\n * The function `isComparable` in TypeScript checks if a value is comparable, handling primitive values\n * and objects with optional force comparison.\n * @param {unknown} value - The `value` parameter in the `isComparable` function represents the value\n * that you want to check if it is comparable. It can be of any type (`unknown`), and the function will\n * determine if it is comparable based on certain conditions.\n * @param [isForceObjectComparable=false] - The `isForceObjectComparable` parameter in the\n * `isComparable` function is a boolean flag that determines whether to treat non-primitive values as\n * comparable objects. When set to `true`, it forces the function to consider non-primitive values as\n * comparable objects, regardless of their type.\n * @returns The function `isComparable` returns a boolean value indicating whether the `value` is\n * considered comparable or not.\n */\nexport function isComparable(value: unknown, isForceObjectComparable = false): value is Comparable {\n if (value === null || value === undefined) return false;\n if (isPrimitiveComparable(value)) return true;\n\n if (typeof value !== 'object') return false;\n if (value instanceof Date) return true;\n // if (value instanceof Date) return !Number.isNaN(value.getTime());\n if (isForceObjectComparable) return true;\n const comparableValue = tryObjectToPrimitive(value);\n if (comparableValue === null || comparableValue === undefined) return false;\n return isPrimitiveComparable(comparableValue);\n}\n\n/**\n * Creates a trampoline thunk object.\n *\n * A \"thunk\" is a deferred computation — instead of performing a recursive call immediately,\n * it wraps the next step of the computation in a function. This allows recursive processes\n * to be executed iteratively, preventing stack overflows.\n *\n * @template T - The type of the final computation result.\n * @param computation - A function that, when executed, returns the next trampoline step.\n * @returns A TrampolineThunk object containing the deferred computation.\n */\nexport const makeTrampolineThunk = <T>(computation: () => Trampoline<T>): TrampolineThunk<T> => ({\n isThunk: true, // Marker indicating this is a thunk\n fn: computation // The deferred computation function\n});\n\n/**\n * Type guard to check whether a given value is a TrampolineThunk.\n *\n * This function is used to distinguish between a final computation result (value)\n * and a deferred computation (thunk).\n *\n * @template T - The type of the value being checked.\n * @param value - The value to test.\n * @returns True if the value is a valid TrampolineThunk, false otherwise.\n */\nexport const isTrampolineThunk = <T>(value: Trampoline<T>): value is TrampolineThunk<T> =>\n typeof value === 'object' && // Must be an object\n value !== null && // Must not be null\n 'isThunk' in value && // Must have the 'isThunk' property\n value.isThunk; // The flag must be true\n\n/**\n * Executes a trampoline computation until a final (non-thunk) result is obtained.\n *\n * The trampoline function repeatedly invokes the deferred computations (thunks)\n * in an iterative loop. This avoids deep recursive calls and prevents stack overflow,\n * which is particularly useful for implementing recursion in a stack-safe manner.\n *\n * @template T - The type of the final result.\n * @param initial - The initial Trampoline value or thunk to start execution from.\n * @returns The final result of the computation (a non-thunk value).\n */\nexport function trampoline<T>(initial: Trampoline<T>): T {\n let current = initial; // Start with the initial trampoline value\n while (isTrampolineThunk(current)) {\n // Keep unwrapping while we have thunks\n current = current.fn(); // Execute the deferred function to get the next step\n }\n return current; // Once no thunks remain, return the final result\n}\n\n/**\n * Wraps a recursive function inside a trampoline executor.\n *\n * This function transforms a potentially recursive function (that returns a Trampoline<Result>)\n * into a *stack-safe* function that executes iteratively using the `trampoline` runner.\n *\n * In other words, it allows you to write functions that look recursive,\n * but actually run in constant stack space.\n *\n * @template Args - The tuple type representing the argument list of the original function.\n * @template Result - The final return type after all trampoline steps are resolved.\n *\n * @param fn - A function that performs a single step of computation\n * and returns a Trampoline (either a final value or a deferred thunk).\n *\n * @returns A new function with the same arguments, but which automatically\n * runs the trampoline process and returns the *final result* instead\n * of a Trampoline.\n *\n * @example\n * // Example: Computing factorial in a stack-safe way\n * const factorial = makeTrampoline(function fact(n: number, acc: number = 1): Trampoline<number> {\n * return n === 0\n * ? acc\n * : makeTrampolineThunk(() => fact(n - 1, acc * n));\n * });\n *\n * console.log(factorial(100000)); // Works without stack overflow\n */\nexport function makeTrampoline<Args extends any[], Result>(\n fn: (...args: Args) => Trampoline<Result> // A function that returns a trampoline step\n): (...args: Args) => Result {\n // Return a wrapped function that automatically runs the trampoline execution loop\n return (...args: Args) => trampoline(fn(...args));\n}\n\n/**\n * Executes an asynchronous trampoline computation until a final (non-thunk) result is obtained.\n *\n * This function repeatedly invokes asynchronous deferred computations (thunks)\n * in an iterative loop. Each thunk may return either a Trampoline<T> or a Promise<Trampoline<T>>.\n *\n * It ensures that asynchronous recursive functions can run without growing the call stack,\n * making it suitable for stack-safe async recursion.\n *\n * @template T - The type of the final result.\n * @param initial - The initial Trampoline or Promise of Trampoline to start execution from.\n * @returns A Promise that resolves to the final result (a non-thunk value).\n */\nexport async function asyncTrampoline<T>(initial: Trampoline<T> | Promise<Trampoline<T>>): Promise<T> {\n let current = await initial; // Wait for the initial step to resolve if it's a Promise\n\n // Keep executing thunks until we reach a non-thunk (final) value\n while (isTrampolineThunk(current)) {\n current = await current.fn(); // Execute the thunk function (may be async)\n }\n\n // Once the final value is reached, return it\n return current;\n}\n\n/**\n * Wraps an asynchronous recursive function inside an async trampoline executor.\n *\n * This helper transforms a recursive async function that returns a Trampoline<Result>\n * (or Promise<Trampoline<Result>>) into a *stack-safe* async function that executes\n * iteratively via the `asyncTrampoline` runner.\n *\n * @template Args - The tuple type representing the argument list of the original function.\n * @template Result - The final return type after all async trampoline steps are resolved.\n *\n * @param fn - An async or sync function that performs a single step of computation\n * and returns a Trampoline (either a final value or a deferred thunk).\n *\n * @returns An async function with the same arguments, but which automatically\n * runs the trampoline process and resolves to the *final result*.\n *\n * @example\n * // Example: Async factorial using trampoline\n * const asyncFactorial = makeAsyncTrampoline(async function fact(\n * n: number,\n * acc: number = 1\n * ): Promise<Trampoline<number>> {\n * return n === 0\n * ? acc\n * : makeTrampolineThunk(() => fact(n - 1, acc * n));\n * });\n *\n * asyncFactorial(100000).then(console.log); // Works without stack overflow\n */\nexport function makeAsyncTrampoline<Args extends any[], Result>(\n fn: (...args: Args) => Trampoline<Result> | Promise<Trampoline<Result>>\n): (...args: Args) => Promise<Result> {\n // Return a wrapped async function that runs through the async trampoline loop\n return async (...args: Args): Promise<Result> => {\n return asyncTrampoline(fn(...args));\n };\n}\n","import type { ElementCallback, IterableElementBaseOptions, ReduceElementCallback } from '../../types';\n\n/**\n * Base class that makes a data structure iterable and provides common\n * element-wise utilities (e.g., map/filter/reduce/find).\n *\n * @template E The public element type yielded by the structure.\n * @template R The underlying \"raw\" element type used internally or by converters.\n *\n * @remarks\n * This class implements the JavaScript iteration protocol (via `Symbol.iterator`)\n * and offers array-like helpers with predictable time/space complexity.\n */\nexport abstract class IterableElementBase<E, R> implements Iterable<E> {\n /**\n * Create a new iterable base.\n *\n * @param options Optional behavior overrides. When provided, a `toElementFn`\n * is used to convert a raw element (`R`) into a public element (`E`).\n *\n * @remarks\n * Time O(1), Space O(1).\n */\n protected constructor(options?: IterableElementBaseOptions<E, R>) {\n if (options) {\n const { toElementFn } = options;\n if (typeof toElementFn === 'function') this._toElementFn = toElementFn;\n else if (toElementFn) throw new TypeError('toElementFn must be a function type');\n }\n }\n\n /**\n * The converter used to transform a raw element (`R`) into a public element (`E`).\n *\n * @remarks\n * Time O(1), Space O(1).\n */\n protected _toElementFn?: (rawElement: R) => E;\n\n /**\n * Exposes the current `toElementFn`, if configured.\n *\n * @returns The converter function or `undefined` when not set.\n * @remarks\n * Time O(1), Space O(1).\n */\n get toElementFn(): ((rawElement: R) => E) | undefined {\n return this._toElementFn;\n }\n\n /**\n * Returns an iterator over the structure's elements.\n *\n * @param args Optional iterator arguments forwarded to the internal iterator.\n * @returns An `IterableIterator<E>` that yields the elements in traversal order.\n *\n * @remarks\n * Producing the iterator is O(1); consuming the entire iterator is Time O(n) with O(1) extra space.\n */\n *[Symbol.iterator](...args: unknown[]): IterableIterator<E> {\n yield* this._getIterator(...args);\n }\n\n /**\n * Returns an iterator over the values (alias of the default iterator).\n *\n * @returns An `IterableIterator<E>` over all elements.\n * @remarks\n * Creating the iterator is O(1); full iteration is Time O(n), Space O(1).\n */\n *values(): IterableIterator<E> {\n for (const item of this) yield item;\n }\n\n /**\n * Tests whether all elements satisfy the predicate.\n *\n * @template TReturn\n * @param predicate Function invoked for each element with signature `(value, index, self)`.\n * @param thisArg Optional `this` binding for the predicate.\n * @returns `true` if every element passes; otherwise `false`.\n *\n * @remarks\n * Time O(n) in the worst case; may exit early when the first failure is found. Space O(1).\n */\n every(predicate: ElementCallback<E, R, boolean>, thisArg?: unknown): boolean {\n let index = 0;\n for (const item of this) {\n if (thisArg === undefined) {\n if (!predicate(item, index++, this)) return false;\n } else {\n const fn = predicate as (this: unknown, v: E, i: number, self: this) => boolean;\n if (!fn.call(thisArg, item, index++, this)) return false;\n }\n }\n return true;\n }\n\n /**\n * Tests whether at least one element satisfies the predicate.\n *\n * @param predicate Function invoked for each element with signature `(value, index, self)`.\n * @param thisArg Optional `this` binding for the predicate.\n * @returns `true` if any element passes; otherwise `false`.\n *\n * @remarks\n * Time O(n) in the worst case; may exit early on first success. Space O(1).\n */\n some(predicate: ElementCallback<E, R, boolean>, thisArg?: unknown): boolean {\n let index = 0;\n for (const item of this) {\n if (thisArg === undefined) {\n if (predicate(item, index++, this)) return true;\n } else {\n const fn = predicate as (this: unknown, v: E, i: number, self: this) => boolean;\n if (fn.call(thisArg, item, index++, this)) return true;\n }\n }\n return false;\n }\n\n /**\n * Invokes a callback for each element in iteration order.\n *\n * @param callbackfn Function invoked per element with signature `(value, index, self)`.\n * @param thisArg Optional `this` binding for the callback.\n * @returns `void`.\n *\n * @remarks\n * Time O(n), Space O(1).\n */\n forEach(callbackfn: ElementCallback<E, R, void>, thisArg?: unknown): void {\n let index = 0;\n for (const item of this) {\n if (thisArg === undefined) {\n callbackfn(item, index++, this);\n } else {\n const fn = callbackfn as (this: unknown, v: E, i: number, self: this) => void;\n fn.call(thisArg, item, index++, this);\n }\n }\n }\n\n /**\n * Finds the first element that satisfies the predicate and returns it.\n *\n * @overload\n * Finds the first element of type `S` (a subtype of `E`) that satisfies the predicate and returns it.\n * @template S\n * @param predicate Type-guard predicate: `(value, index, self) => value is S`.\n * @param thisArg Optional `this` binding for the predicate.\n * @returns The matched element typed as `S`, or `undefined` if not found.\n *\n * @overload\n * @param predicate Boolean predicate: `(value, index, self) => boolean`.\n * @param thisArg Optional `this` binding for the predicate.\n * @returns The first matching element as `E`, or `undefined` if not found.\n *\n * @remarks\n * Time O(n) in the worst case; may exit early on the first match. Space O(1).\n */\n find<S extends E>(predicate: ElementCallback<E, R, S>, thisArg?: unknown): S | undefined;\n find(predicate: ElementCallback<E, R, unknown>, thisArg?: unknown): E | undefined;\n\n // Implementation signature\n find(predicate: ElementCallback<E, R, boolean>, thisArg?: unknown): E | undefined {\n let index = 0;\n for (const item of this) {\n if (thisArg === undefined) {\n if (predicate(item, index++, this)) return item;\n } else {\n const fn = predicate as (this: unknown, v: E, i: number, self: this) => boolean;\n if (fn.call(thisArg, item, index++, this)) return item;\n }\n }\n return;\n }\n\n /**\n * Checks whether a strictly-equal element exists in the structure.\n *\n * @param element The element to test with `===` equality.\n * @returns `true` if an equal element is found; otherwise `false`.\n *\n * @remarks\n * Time O(n) in the worst case. Space O(1).\n */\n has(element: E): boolean {\n for (const ele of this) if (ele === element) return true;\n return false;\n }\n\n reduce(callbackfn: ReduceElementCallback<E, R>): E;\n reduce(callbackfn: ReduceElementCallback<E, R>, initialValue: E): E;\n reduce<U>(callbackfn: ReduceElementCallback<E, R, U>, initialValue: U): U;\n\n /**\n * Reduces all elements to a single accumulated value.\n *\n * @overload\n * @param callbackfn Reducer of signature `(acc, value, index, self) => nextAcc`. The first element is used as the initial accumulator.\n * @returns The final accumulated value typed as `E`.\n *\n * @overload\n * @param callbackfn Reducer of signature `(acc, value, index, self) => nextAcc`.\n * @param initialValue The initial accumulator value of type `E`.\n * @returns The final accumulated value typed as `E`.\n *\n * @overload\n * @template U The accumulator type when it differs from `E`.\n * @param callbackfn Reducer of signature `(acc: U, value, index, self) => U`.\n * @param initialValue The initial accumulator value of type `U`.\n * @returns The final accumulated value typed as `U`.\n *\n * @remarks\n * Time O(n), Space O(1). Throws if called on an empty structure without `initialValue`.\n */\n reduce<U>(callbackfn: ReduceElementCallback<E, R, U>, initialValue?: U): U {\n let index = 0;\n const iter = this[Symbol.iterator]();\n let acc: U;\n\n if (arguments.length >= 2) {\n acc = initialValue as U;\n } else {\n const first = iter.next();\n if (first.done) throw new TypeError('Reduce of empty structure with no initial value');\n acc = first.value as unknown as U;\n index = 1;\n }\n\n for (const value of iter as unknown as Iterable<E>) {\n acc = callbackfn(acc, value, index++, this);\n }\n return acc;\n }\n\n /**\n * Materializes the elements into a new array.\n *\n * @returns A shallow array copy of the iteration order.\n * @remarks\n * Time O(n), Space O(n).\n */\n toArray(): E[] {\n return [...this];\n }\n\n /**\n * Returns a representation of the structure suitable for quick visualization.\n * Defaults to an array of elements; subclasses may override to provide richer visuals.\n *\n * @returns A visual representation (array by default).\n * @remarks\n * Time O(n), Space O(n).\n */\n toVisual(): E[] {\n return [...this];\n }\n\n /**\n * Prints `toVisual()` to the console. Intended for quick debugging.\n *\n * @returns `void`.\n * @remarks\n * Time O(n) due to materialization, Space O(n) for the intermediate representation.\n */\n print(): void {\n console.log(this.toVisual());\n }\n\n /**\n * Indicates whether the structure currently contains no elements.\n *\n * @returns `true` if empty; otherwise `false`.\n * @remarks\n * Expected Time O(1), Space O(1) for most implementations.\n */\n abstract isEmpty(): boolean;\n\n /**\n * Removes all elements from the structure.\n *\n * @returns `void`.\n * @remarks\n * Expected Time O(1) or O(n) depending on the implementation; Space O(1).\n */\n abstract clear(): void;\n\n /**\n * Creates a structural copy with the same element values and configuration.\n *\n * @returns A clone of the current instance (same concrete type).\n * @remarks\n * Expected Time O(n) to copy elements; Space O(n).\n */\n abstract clone(): this;\n\n /**\n * Maps each element to a new element and returns a new iterable structure.\n *\n * @template EM The mapped element type.\n * @template RM The mapped raw element type used internally by the target structure.\n * @param callback Function with signature `(value, index, self) => mapped`.\n * @param options Optional options for the returned structure, including its `toElementFn`.\n * @param thisArg Optional `this` binding for the callback.\n * @returns A new `IterableElementBase<EM, RM>` containing mapped elements.\n *\n * @remarks\n * Time O(n), Space O(n).\n */\n abstract map<EM, RM>(\n callback: ElementCallback<E, R, EM>,\n options?: IterableElementBaseOptions<EM, RM>,\n thisArg?: unknown\n ): IterableElementBase<EM, RM>;\n\n /**\n * Maps each element to the same element type and returns the same concrete structure type.\n *\n * @param callback Function with signature `(value, index, self) => mappedValue`.\n * @param thisArg Optional `this` binding for the callback.\n * @returns A new instance of the same concrete type with mapped elements.\n *\n * @remarks\n * Time O(n), Space O(n).\n */\n abstract mapSame(callback: ElementCallback<E, R, E>, thisArg?: unknown): this;\n\n /**\n * Filters elements using the provided predicate and returns the same concrete structure type.\n *\n * @param predicate Function with signature `(value, index, self) => boolean`.\n * @param thisArg Optional `this` binding for the predicate.\n * @returns A new instance of the same concrete type containing only elements that pass the predicate.\n *\n * @remarks\n * Time O(n), Space O(k) where `k` is the number of kept elements.\n */\n abstract filter(predicate: ElementCallback<E, R, boolean>, thisArg?: unknown): this;\n\n /**\n * Internal iterator factory used by the default iterator.\n *\n * @param args Optional iterator arguments.\n * @returns An iterator over elements.\n *\n * @remarks\n * Implementations should yield in O(1) per element with O(1) extra space when possible.\n */\n protected abstract _getIterator(...args: unknown[]): IterableIterator<E>;\n}\n","import type { ElementCallback, LinearBaseOptions, ReduceLinearCallback } from '../../types';\nimport { IterableElementBase } from './iterable-element-base';\n\n/**\n * Singly-linked list node.\n * @template E - Element type.\n * @remarks Time O(1), Space O(1)\n */\nexport class LinkedListNode<E = any> {\n /**\n * Initialize a node.\n * @param value - Element value.\n * @remarks Time O(1), Space O(1)\n */\n constructor(value: E) {\n this._value = value;\n this._next = undefined;\n }\n\n protected _value: E;\n\n /**\n * Element payload getter.\n * @returns Element value.\n * @remarks Time O(1), Space O(1)\n */\n get value(): E {\n return this._value;\n }\n\n /**\n * Element payload setter.\n * @param value - New value.\n * @remarks Time O(1), Space O(1)\n */\n set value(value: E) {\n this._value = value;\n }\n\n protected _next: LinkedListNode<E> | undefined;\n\n /**\n * Next node getter.\n * @returns Next node or `undefined`.\n * @remarks Time O(1), Space O(1)\n */\n get next(): LinkedListNode<E> | undefined {\n return this._next;\n }\n\n /**\n * Next node setter.\n * @param value - Next node or `undefined`.\n * @remarks Time O(1), Space O(1)\n */\n set next(value: LinkedListNode<E> | undefined) {\n this._next = value;\n }\n}\n\n/**\n * Abstract linear container with array-like utilities.\n * @template E - Element type.\n * @template R - Return type for mapped/derived views.\n * @template NODE - Linked node type used by some implementations.\n * @remarks Time O(1), Space O(1)\n */\nexport abstract class LinearBase<\n E,\n R = any,\n NODE extends LinkedListNode<E> = LinkedListNode<E>\n> extends IterableElementBase<E, R> {\n /**\n * Construct a linear container with runtime options.\n * @param options - `{ maxLen?, ... }` bounds/behavior options.\n * @remarks Time O(1), Space O(1)\n */\n protected constructor(options?: LinearBaseOptions<E, R>) {\n super(options);\n if (options) {\n const { maxLen } = options;\n if (typeof maxLen === 'number' && maxLen > 0 && maxLen % 1 === 0) this._maxLen = maxLen;\n }\n }\n\n /**\n * Element count.\n * @returns Number of elements.\n * @remarks Time O(1), Space O(1)\n */\n abstract get length(): number;\n\n protected _maxLen: number = -1;\n\n /**\n * Upper bound for length (if positive), or `-1` when unbounded.\n * @returns Maximum allowed length.\n * @remarks Time O(1), Space O(1)\n */\n get maxLen() {\n return this._maxLen;\n }\n\n /**\n * First index of a value from the left.\n * @param searchElement - Value to match.\n * @param fromIndex - Start position (supports negative index).\n * @returns Index or `-1` if not found.\n * @remarks Time O(n), Space O(1)\n */\n indexOf(searchElement: E, fromIndex: number = 0): number {\n if (this.length === 0) return -1;\n if (fromIndex < 0) fromIndex = this.length + fromIndex;\n if (fromIndex < 0) fromIndex = 0;\n\n for (let i = fromIndex; i < this.length; i++) {\n const element = this.at(i);\n if (element === searchElement) return i;\n }\n\n return -1;\n }\n\n /**\n * Last index of a value from the right.\n * @param searchElement - Value to match.\n * @param fromIndex - Start position (supports negative index).\n * @returns Index or `-1` if not found.\n * @remarks Time O(n), Space O(1)\n */\n lastIndexOf(searchElement: E, fromIndex: number = this.length - 1): number {\n if (this.length === 0) return -1;\n if (fromIndex >= this.length) fromIndex = this.length - 1;\n if (fromIndex < 0) fromIndex = this.length + fromIndex;\n\n for (let i = fromIndex; i >= 0; i--) {\n const element = this.at(i);\n if (element === searchElement) return i;\n }\n\n return -1;\n }\n\n /**\n * Find the first index matching a predicate.\n * @param predicate - `(element, index, self) => boolean`.\n * @param thisArg - Optional `this` for callback.\n * @returns Index or `-1`.\n * @remarks Time O(n), Space O(1)\n */\n findIndex(predicate: ElementCallback<E, R, boolean>, thisArg?: any): number {\n for (let i = 0; i < this.length; i++) {\n const item = this.at(i);\n if (item !== undefined && predicate.call(thisArg, item, i, this)) return i;\n }\n return -1;\n }\n\n /**\n * Concatenate multiple containers of the same species.\n * @param items - Other lists to append.\n * @returns New container with combined elements (`this` type).\n * @remarks Time O(sum(length)), Space O(sum(length))\n */\n concat(...items: this[]): this;\n\n /**\n * Concatenate elements and/or containers.\n * @param items - Elements or other containers.\n * @returns New container with combined elements (`this` type).\n * @remarks Time O(sum(length)), Space O(sum(length))\n */\n concat(...items: (E | this)[]): this {\n const newList = this.clone();\n\n for (const item of items) {\n if (item instanceof LinearBase) {\n newList.pushMany(item);\n } else {\n newList.push(item);\n }\n }\n\n return newList;\n }\n\n /**\n * In-place stable order via array sort semantics.\n * @param compareFn - Comparator `(a, b) => number`.\n * @returns This container.\n * @remarks Time O(n log n), Space O(n) (materializes to array temporarily)\n */\n sort(compareFn?: (a: E, b: E) => number): this {\n const arr = this.toArray();\n arr.sort(compareFn);\n this.clear();\n for (const item of arr) this.push(item);\n return this;\n }\n\n /**\n * Remove and/or insert elements at a position (array-compatible).\n * @param start - Start index (supports negative index).\n * @param deleteCount - How many to remove.\n * @param items - Elements to insert.\n * @returns Removed elements as a new list (`this` type).\n * @remarks Time O(n + m), Space O(min(n, m)) where `m = items.length`\n */\n splice(start: number, deleteCount: number = 0, ...items: E[]): this {\n const removedList = this._createInstance();\n\n start = start < 0 ? this.length + start : start;\n start = Math.max(0, Math.min(start, this.length));\n deleteCount = Math.max(0, Math.min(deleteCount, this.length - start));\n\n for (let i = 0; i < deleteCount; i++) {\n const removed = this.deleteAt(start);\n if (removed !== undefined) {\n removedList.push(removed);\n }\n }\n\n for (let i = 0; i < items.length; i++) {\n this.addAt(start + i, items[i]);\n }\n\n return removedList;\n }\n\n /**\n * Join all elements into a string.\n * @param separator - Separator string.\n * @returns Concatenated string.\n * @remarks Time O(n), Space O(n)\n */\n join(separator: string = ','): string {\n return this.toArray().join(separator);\n }\n\n /**\n * Snapshot elements into a reversed array.\n * @returns New reversed array.\n * @remarks Time O(n), Space O(n)\n */\n toReversedArray(): E[] {\n const array: E[] = [];\n for (let i = this.length - 1; i >= 0; i--) {\n array.push(this.at(i)!);\n }\n return array;\n }\n\n reduceRight(callbackfn: ReduceLinearCallback<E>): E;\n\n reduceRight(callbackfn: ReduceLinearCallback<E>, initialValue: E): E;\n\n /**\n * Right-to-left reduction over elements.\n * @param callbackfn - `(acc, element, index, self) => acc`.\n * @param initialValue - Initial accumulator (optional generic overloads supported).\n * @returns Final accumulator.\n * @remarks Time O(n), Space O(1)\n */\n reduceRight<U>(callbackfn: ReduceLinearCallback<E, U>, initialValue: U): U;\n\n reduceRight<U>(callbackfn: ReduceLinearCallback<E, U>, initialValue?: U): U {\n let accumulator = initialValue ?? (0 as U);\n for (let i = this.length - 1; i >= 0; i--) {\n accumulator = callbackfn(accumulator, this.at(i)!, i, this);\n }\n return accumulator;\n }\n\n /**\n * Create a shallow copy of a subrange.\n * @param start - Inclusive start (supports negative index).\n * @param end - Exclusive end (supports negative index).\n * @returns New list with the range (`this` type).\n * @remarks Time O(n), Space O(n)\n */\n slice(start: number = 0, end: number = this.length): this {\n start = start < 0 ? this.length + start : start;\n end = end < 0 ? this.length + end : end;\n\n const newList = this._createInstance();\n for (let i = start; i < end; i++) {\n newList.push(this.at(i)!);\n }\n return newList;\n }\n\n /**\n * Fill a range with a value.\n * @param value - Value to set.\n * @param start - Inclusive start.\n * @param end - Exclusive end.\n * @returns This list.\n * @remarks Time O(n), Space O(1)\n */\n fill(value: E, start = 0, end = this.length): this {\n start = start < 0 ? this.length + start : start;\n end = end < 0 ? this.length + end : end;\n\n if (start < 0) start = 0;\n if (end > this.length) end = this.length;\n if (start >= end) return this;\n\n for (let i = start; i < end; i++) {\n this.setAt(i, value);\n }\n\n return this;\n }\n\n /**\n * Set the value at an index.\n * @param index - Position (0-based).\n * @param value - New value.\n * @returns `true` if updated.\n * @remarks Time O(1) typical, Space O(1)\n */\n abstract setAt(index: number, value: E): boolean;\n\n /**\n * Deep clone while preserving concrete subtype.\n * @returns New list of the same species (`this` type).\n * @remarks Time O(n), Space O(n)\n */\n abstract override clone(): this;\n\n /**\n * Reverse the order of elements in-place (or equivalent).\n * @returns This list.\n * @remarks Time O(n), Space O(1)\n */\n abstract reverse(): this;\n\n /**\n * Append one element or node to the tail.\n * @param elementOrNode - Element or node.\n * @returns `true` if appended.\n * @remarks Time O(1) amortized typical, Space O(1)\n */\n abstract push(elementOrNode: E | NODE): boolean;\n\n /**\n * Append many elements/nodes at once.\n * @param elements - Iterable of elements or nodes.\n * @returns Array of booleans indicating append success.\n * @remarks Time O(n), Space O(1)\n */\n abstract pushMany(elements: Iterable<E> | Iterable<R> | Iterable<NODE>): boolean[];\n\n /**\n * Remove one element or node if present.\n * @param elementOrNode - Element or node to delete.\n * @returns `true` if removed.\n * @remarks Time O(1)~O(n) depending on implementation, Space O(1)\n */\n abstract delete(elementOrNode: E | NODE | undefined): boolean;\n\n /**\n * Get element at an index.\n * @param index - Position (0-based).\n * @returns Element or `undefined`.\n * @remarks Time O(1)~O(n) depending on implementation, Space O(1)\n */\n abstract at(index: number): E | undefined;\n\n /**\n * Remove element at a position.\n * @param pos - Position (0-based).\n * @returns Removed element or `undefined`.\n * @remarks Time O(1)~O(n) depending on implementation, Space O(1)\n */\n abstract deleteAt(pos: number): E | undefined;\n\n /**\n * Insert an element/node at a position.\n * @param index - Position (0-based).\n * @param newElementOrNode - Element or node to insert.\n * @returns `true` if inserted.\n * @remarks Time O(1)~O(n) depending on implementation, Space O(1)\n */\n abstract addAt(index: number, newElementOrNode: E | NODE): boolean;\n\n /**\n * Create an empty list of the same species.\n * @param options - Runtime options to carry.\n * @returns Empty list (`this` type).\n * @remarks Time O(1), Space O(1)\n */\n protected abstract _createInstance(options?: LinearBaseOptions<E, R>): this;\n\n /**\n * Reverse-direction iterator over elements.\n * @returns Iterator of elements from tail to head.\n * @remarks Time O(n), Space O(1)\n */\n protected abstract _getReverseIterator(...args: any[]): IterableIterator<E>;\n}\n\n/**\n * Linked-list specialized linear container.\n * @template E - Element type.\n * @template R - Return type for mapped/derived views.\n * @template NODE - Linked node type.\n * @remarks Time O(1), Space O(1)\n */\nexport abstract class LinearLinkedBase<\n E,\n R = any,\n NODE extends LinkedListNode<E> = LinkedListNode<E>\n> extends LinearBase<E, R, NODE> {\n protected constructor(options?: LinearBaseOptions<E, R>) {\n super(options);\n if (options) {\n const { maxLen } = options;\n if (typeof maxLen === 'number' && maxLen > 0 && maxLen % 1 === 0) this._maxLen = maxLen;\n }\n }\n\n /**\n * Linked-list optimized `indexOf` (forwards scan).\n * @param searchElement - Value to match.\n * @param fromIndex - Start position.\n * @returns Index or `-1`.\n * @remarks Time O(n), Space O(1)\n */\n override indexOf(searchElement: E, fromIndex: number = 0): number {\n const iterator = this._getIterator();\n let current = iterator.next();\n\n let index = 0;\n while (index < fromIndex) {\n current = iterator.next();\n index++;\n }\n\n while (!current.done) {\n if (current.value === searchElement) return index;\n current = iterator.next();\n index++;\n }\n\n return -1;\n }\n\n /**\n * Linked-list optimized `lastIndexOf` (reverse scan).\n * @param searchElement - Value to match.\n * @param fromIndex - Start position.\n * @returns Index or `-1`.\n * @remarks Time O(n), Space O(1)\n */\n override lastIndexOf(searchElement: E, fromIndex: number = this.length - 1): number {\n const iterator = this._getReverseIterator();\n let current = iterator.next();\n\n let index = this.length - 1;\n while (index > fromIndex) {\n current = iterator.next();\n index--;\n }\n\n while (!current.done) {\n if (current.value === searchElement) return index;\n current = iterator.next();\n index--;\n }\n\n return -1;\n }\n\n /**\n * Concatenate lists/elements preserving order.\n * @param items - Elements or `LinearBase` instances.\n * @returns New list with combined elements (`this` type).\n * @remarks Time O(sum(length)), Space O(sum(length))\n */\n override concat(...items: LinearBase<E, R>[]): this;\n\n override concat(...items: (E | LinearBase<E, R>)[]): this {\n const newList = this.clone();\n\n for (const item of items) {\n if (item instanceof LinearBase) {\n newList.pushMany(item);\n } else {\n newList.push(item);\n }\n }\n\n return newList;\n }\n\n /**\n * Slice via forward iteration (no random access required).\n * @param start - Inclusive start (supports negative index).\n * @param end - Exclusive end (supports negative index).\n * @returns New list (`this` type).\n * @remarks Time O(n), Space O(n)\n */\n override slice(start: number = 0, end: number = this.length): this {\n start = start < 0 ? this.length + start : start;\n end = end < 0 ? this.length + end : end;\n\n const newList = this._createInstance();\n const iterator = this._getIterator();\n let current = iterator.next();\n let c = 0;\n while (c < start) {\n current = iterator.next();\n c++;\n }\n for (let i = start; i < end; i++) {\n newList.push(current.value);\n current = iterator.next();\n }\n\n return newList;\n }\n\n /**\n * Splice by walking node iterators from the start index.\n * @param start - Start index.\n * @param deleteCount - How many elements to remove.\n * @param items - Elements to insert after the splice point.\n * @returns Removed elements as a new list (`this` type).\n * @remarks Time O(n + m), Space O(min(n, m)) where `m = items.length`\n */\n override splice(start: number, deleteCount: number = 0, ...items: E[]): this {\n const removedList = this._createInstance();\n\n start = start < 0 ? this.length + start : start;\n start = Math.max(0, Math.min(start, this.length));\n deleteCount = Math.max(0, deleteCount);\n\n let currentIndex = 0;\n let currentNode: NODE | undefined = undefined;\n let previousNode: NODE | undefined = undefined;\n\n const iterator = this._getNodeIterator();\n for (const node of iterator) {\n if (currentIndex === start) {\n currentNode = node;\n break;\n }\n previousNode = node;\n currentIndex++;\n }\n\n for (let i = 0; i < deleteCount && currentNode; i++) {\n removedList.push(currentNode.value);\n const nextNode = currentNode.next;\n this.delete(currentNode);\n currentNode = nextNode as NODE;\n }\n\n for (let i = 0; i < items.length; i++) {\n if (previousNode) {\n this.addAfter(previousNode, items[i]);\n previousNode = previousNode.next as NODE;\n } else {\n this.addAt(0, items[i]);\n previousNode = this._getNodeIterator().next().value;\n }\n }\n\n return removedList;\n }\n\n override reduceRight(callbackfn: ReduceLinearCallback<E>): E;\n\n override reduceRight(callbackfn: ReduceLinearCallback<E>, initialValue: E): E;\n\n /**\n * Right-to-left reduction using reverse iterator.\n * @param callbackfn - `(acc, element, index, self) => acc`.\n * @param initialValue - Initial accumulator.\n * @returns Final accumulator.\n * @remarks Time O(n), Space O(1)\n */\n override reduceRight<U>(callbackfn: ReduceLinearCallback<E, U>, initialValue: U): U;\n\n override reduceRight<U>(callbackfn: ReduceLinearCallback<E, U>, initialValue?: U): U {\n let accumulator = initialValue ?? (0 as U);\n let index = this.length - 1;\n for (const item of this._getReverseIterator()) {\n accumulator = callbackfn(accumulator, item, index--, this);\n }\n return accumulator;\n }\n\n /**\n * Delete by element or node in a linked list.\n * @param elementOrNode - Element or node.\n * @returns `true` if removed.\n * @remarks Time O(1)~O(n) depending on availability of links, Space O(1)\n */\n abstract override delete(elementOrNode: E | NODE | undefined): boolean;\n\n /**\n * Insert new element/node before an existing node.\n * @param existingElementOrNode - Reference element/node.\n * @param newElementOrNode - Element/node to insert.\n * @returns `true` if inserted.\n * @remarks Time O(1)~O(n) depending on reference access, Space O(1)\n */\n abstract addBefore(existingElementOrNode: E | NODE, newElementOrNode: E | NODE): boolean;\n\n /**\n * Insert new element/node after an existing node.\n * @param existingElementOrNode - Reference element/node.\n * @param newElementOrNode - Element/node to insert.\n * @returns `true` if inserted.\n * @remarks Time O(1)~O(n) depending on reference access, Space O(1)\n */\n abstract addAfter(existingElementOrNode: E | NODE, newElementOrNode: E | NODE): boolean;\n\n /**\n * Node at index (for random-access emulation).\n * @param index - Position (0-based).\n * @returns Node or `undefined`.\n * @remarks Time O(n), Space O(1)\n */\n abstract getNodeAt(index: number): NODE | undefined;\n\n /**\n * Iterate linked nodes from head to tail.\n * @returns Iterator over nodes.\n * @remarks Time O(n), Space O(1)\n */\n protected abstract _getNodeIterator(...args: any[]): IterableIterator<NODE>;\n\n /**\n * Get previous node of a given node.\n * @param node - Current node.\n * @returns Previous node or `undefined`.\n * @remarks Time O(1)~O(n) depending on list variant (singly vs doubly), Space O(1)\n */\n protected abstract _getPrevNode(node: NODE): NODE | undefined;\n}\n","/**\n * data-structure-typed\n *\n * @author Pablo Zeng\n * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>\n * @license MIT License\n */\n\nimport type { ElementCallback, LinearBaseOptions, QueueOptions } from '../../types';\nimport { SinglyLinkedList } from '../linked-list';\nimport { LinearBase } from '../base/linear-base';\n\n/**\n * Array-backed queue with amortized O(1) enqueue/dequeue via an offset pointer and optional auto-compaction.\n * @remarks Time O(1), Space O(1)\n * @template E\n * @template R\n * 1. First In, First Out (FIFO): The core feature of a queue is its first in, first out nature. The element added to the queue first will be the one to be removed first.\n * 2. Operations: The main operations include enqueue (adding an element to the end of the queue) and dequeue (removing and returning the element at the front of the queue). Typically, there is also a peek operation (looking at the front element without removing it).\n * 3. Uses: Queues are commonly used to manage a series of tasks or elements that need to be processed in order. For example, managing task queues in a multi-threaded environment, or in algorithms for data structures like trees and graphs for breadth-first search.\n * 4. Task Scheduling: Managing the order of task execution in operating systems or applications.\n * 5. Data Buffering: Acting as a buffer for data packets in network communication.\n * 6. Breadth-First Search (BFS): In traversal algorithms for graphs and trees, queues store elements that are to be visited.\n * 7. Real-time Queuing: Like queuing systems in banks or supermarkets.\n * @example\n * // Sliding Window using Queue\n * const nums = [2, 3, 4, 1, 5];\n * const k = 2;\n * const queue = new Queue<number>();\n *\n * let maxSum = 0;\n * let currentSum = 0;\n *\n * nums.forEach(num => {\n * queue.push(num);\n * currentSum += num;\n *\n * if (queue.length > k) {\n * currentSum -= queue.shift()!;\n * }\n *\n * if (queue.length === k) {\n * maxSum = Math.max(maxSum, currentSum);\n * }\n * });\n *\n * console.log(maxSum); // 7\n * @example\n * // Breadth-First Search (BFS) using Queue\n * const graph: { [key in number]: number[] } = {\n * 1: [2, 3],\n * 2: [4, 5],\n * 3: [],\n * 4: [],\n * 5: []\n * };\n *\n * const queue = new Queue<number>();\n * const visited: number[] = [];\n *\n * queue.push(1);\n *\n * while (!queue.isEmpty()) {\n * const node = queue.shift()!;\n * if (!visited.includes(node)) {\n * visited.push(node);\n * graph[node].forEach(neighbor => queue.push(neighbor));\n * }\n * }\n *\n * console.log(visited); // [1, 2, 3, 4, 5]\n */\nexport class Queue<E = any, R = any> extends LinearBase<E, R> {\n /**\n * Create a Queue and optionally bulk-insert elements.\n * @remarks Time O(N), Space O(N)\n * @param [elements] - Iterable of elements (or raw records if toElementFn is set).\n * @param [options] - Options such as toElementFn, maxLen, and autoCompactRatio.\n * @returns New Queue instance.\n */\n\n constructor(elements: Iterable<E> | Iterable<R> = [], options?: QueueOptions<E, R>) {\n super(options);\n if (options) {\n const { autoCompactRatio = 0.5 } = options;\n this._autoCompactRatio = autoCompactRatio;\n }\n this.pushMany(elements);\n }\n\n protected _elements: E[] = [];\n\n /**\n * Get the underlying array buffer.\n * @remarks Time O(1), Space O(1)\n * @returns Backing array of elements.\n */\n\n get elements(): E[] {\n return this._elements;\n }\n\n protected _offset = 0;\n\n /**\n * Get the current start offset into the array.\n * @remarks Time O(1), Space O(1)\n * @returns Zero-based offset.\n */\n\n get offset(): number {\n return this._offset;\n }\n\n protected _autoCompactRatio = 0.5;\n\n /**\n * Get the compaction threshold (offset/size).\n * @remarks Time O(1), Space O(1)\n * @returns Auto-compaction ratio in (0,1].\n */\n\n get autoCompactRatio(): number {\n return this._autoCompactRatio;\n }\n\n /**\n * Set the compaction threshold.\n * @remarks Time O(1), Space O(1)\n * @param value - New ratio; compacts when offset/size exceeds this value.\n * @returns void\n */\n\n set autoCompactRatio(value: number) {\n this._autoCompactRatio = value;\n }\n\n /**\n * Get the number of elements currently in the queue.\n * @remarks Time O(1), Space O(1)\n * @returns Current length.\n */\n\n get length(): number {\n return this.elements.length - this._offset;\n }\n\n /**\n * Get the first element (front) without removing it.\n * @remarks Time O(1), Space O(1)\n * @returns Front element or undefined.\n */\n\n get first(): E | undefined {\n return this.length > 0 ? this.elements[this._offset] : undefined;\n }\n\n /**\n * Get the last element (back) without removing it.\n * @remarks Time O(1), Space O(1)\n * @returns Back element or undefined.\n */\n\n get last(): E | undefined {\n return this.length > 0 ? this.elements[this.elements.length - 1] : undefined;\n }\n\n /**\n * Create a queue from an array of elements.\n * @remarks Time O(N), Space O(N)\n * @template E\n * @param elements - Array of elements to enqueue in order.\n * @returns A new queue populated from the array.\n */\n\n static fromArray<E>(elements: E[]): Queue<E> {\n return new Queue(elements);\n }\n\n /**\n * Check whether the queue is empty.\n * @remarks Time O(1), Space O(1)\n * @returns True if length is 0.\n */\n\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Enqueue one element at the back.\n * @remarks Time O(1), Space O(1)\n * @param element - Element to enqueue.\n * @returns True on success.\n */\n\n push(element: E): boolean {\n this.elements.push(element);\n if (this._maxLen > 0 && this.length > this._maxLen) this.shift();\n return true;\n }\n\n /**\n * Enqueue many elements from an iterable.\n * @remarks Time O(N), Space O(1)\n * @param elements - Iterable of elements (or raw records if toElementFn is set).\n * @returns Array of per-element success flags.\n */\n\n pushMany(elements: Iterable<E> | Iterable<R>): boolean[] {\n const ans: boolean[] = [];\n for (const el of elements) {\n if (this.toElementFn) ans.push(this.push(this.toElementFn(el as R)));\n else ans.push(this.push(el as E));\n }\n return ans;\n }\n\n /**\n * Dequeue one element from the front (amortized via offset).\n * @remarks Time O(1) amortized, Space O(1)\n * @returns Removed element or undefined.\n */\n\n shift(): E | undefined {\n if (this.length === 0) return undefined;\n const first = this.first;\n this._offset += 1;\n if (this.elements.length > 0 && this.offset / this.elements.length > this.autoCompactRatio) this.compact();\n return first;\n }\n\n /**\n * Delete the first occurrence of a specific element.\n * @remarks Time O(N), Space O(1)\n * @param element - Element to remove (strict equality via Object.is).\n * @returns True if an element was removed.\n */\n\n delete(element: E): boolean {\n for (let i = this._offset; i < this.elements.length; i++) {\n if (Object.is(this.elements[i], element)) {\n this.elements.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get the element at a given logical index.\n * @remarks Time O(1), Space O(1)\n * @param index - Zero-based index from the front.\n * @returns Element or undefined.\n */\n\n at(index: number): E | undefined {\n if (index < 0 || index >= this.length) return undefined;\n return this._elements[this._offset + index];\n }\n\n /**\n * Delete the element at a given index.\n * @remarks Time O(N), Space O(1)\n * @param index - Zero-based index from the front.\n * @returns Removed element or undefined.\n */\n\n deleteAt(index: number): E | undefined {\n if (index < 0 || index >= this.length) return undefined;\n const gi = this._offset + index;\n const [deleted] = this.elements.splice(gi, 1);\n return deleted;\n }\n\n /**\n * Insert a new element at a given index.\n * @remarks Time O(N), Space O(1)\n * @param index - Zero-based index from the front.\n * @param newElement - Element to insert.\n * @returns True if inserted.\n */\n\n addAt(index: number, newElement: E): boolean {\n if (index < 0 || index > this.length) return false;\n this._elements.splice(this._offset + index, 0, newElement);\n return true;\n }\n\n /**\n * Replace the element at a given index.\n * @remarks Time O(1), Space O(1)\n * @param index - Zero-based index from the front.\n * @param newElement - New element to set.\n * @returns True if updated.\n */\n\n setAt(index: number, newElement: E): boolean {\n if (index < 0 || index >= this.length) return false;\n this._elements[this._offset + index] = newElement;\n return true;\n }\n\n /**\n * Reverse the queue in-place by compacting then reversing.\n * @remarks Time O(N), Space O(N)\n * @returns This queue.\n */\n\n reverse(): this {\n this._elements = this.elements.slice(this._offset).reverse();\n this._offset = 0;\n return this;\n }\n\n /**\n * Remove all elements and reset offset.\n * @remarks Time O(1), Space O(1)\n * @returns void\n */\n\n clear(): void {\n this._elements = [];\n this._offset = 0;\n }\n\n /**\n * Compact storage by discarding consumed head elements.\n * @remarks Time O(N), Space O(N)\n * @returns True when compaction performed.\n */\n\n compact(): boolean {\n this._elements = this.elements.slice(this._offset);\n this._offset = 0;\n return true;\n }\n\n /**\n * Remove and/or insert elements at a position (array-like).\n * @remarks Time O(N + M), Space O(M)\n * @param start - Start index (clamped to [0, length]).\n * @param [deleteCount] - Number of elements to remove (default 0).\n * @param [items] - Elements to insert after `start`.\n * @returns A new queue containing the removed elements (typed as `this`).\n */\n\n override splice(start: number, deleteCount: number = 0, ...items: E[]): this {\n start = Math.max(0, Math.min(start, this.length));\n deleteCount = Math.max(0, Math.min(deleteCount, this.length - start));\n\n const gi = this._offset + start;\n const removedArray = this._elements.splice(gi, deleteCount, ...items);\n\n if (this.elements.length > 0 && this.offset / this.elements.length > this.autoCompactRatio) this.compact();\n\n const removed = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });\n removed._setAutoCompactRatio(this._autoCompactRatio);\n removed.pushMany(removedArray);\n\n return removed as unknown as this;\n }\n\n /**\n * Deep clone this queue and its parameters.\n * @remarks Time O(N), Space O(N)\n * @returns A new queue with the same content and options.\n */\n\n clone(): this {\n const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });\n out._setAutoCompactRatio(this._autoCompactRatio);\n for (let i = this._offset; i < this.elements.length; i++) out.push(this.elements[i]);\n return out;\n }\n\n /**\n * Filter elements into a new queue of the same class.\n * @remarks Time O(N), Space O(N)\n * @param predicate - Predicate (element, index, queue) → boolean to keep element.\n * @param [thisArg] - Value for `this` inside the predicate.\n * @returns A new queue with kept elements.\n */\n\n filter(predicate: ElementCallback<E, R, boolean>, thisArg?: unknown): this {\n const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });\n out._setAutoCompactRatio(this._autoCompactRatio);\n let index = 0;\n for (const v of this) {\n if (predicate.call(thisArg, v, index, this)) out.push(v);\n index++;\n }\n return out;\n }\n\n /**\n * Map each element to a new element in a possibly different-typed queue.\n * @remarks Time O(N), Space O(N)\n * @template EM\n * @template RM\n * @param callback - Mapping function (element, index, queue) → newElement.\n * @param [options] - Options for the output queue (e.g., toElementFn, maxLen, autoCompactRatio).\n * @param [thisArg] - Value for `this` inside the callback.\n * @returns A new Queue with mapped elements.\n */\n\n map<EM, RM>(callback: ElementCallback<E, R, EM>, options?: QueueOptions<EM, RM>, thisArg?: unknown): Queue<EM, RM> {\n const out = new (this.constructor as new (\n elements?: Iterable<EM> | Iterable<RM>,\n options?: QueueOptions<EM, RM>\n ) => Queue<EM, RM>)([], {\n toElementFn: options?.toElementFn,\n maxLen: options?.maxLen ?? this._maxLen,\n autoCompactRatio: options?.autoCompactRatio ?? this._autoCompactRatio\n });\n let index = 0;\n for (const v of this)\n out.push(thisArg === undefined ? callback(v, index++, this) : callback.call(thisArg, v, index++, this));\n return out;\n }\n\n /**\n * Map each element to a new value of the same type.\n * @remarks Time O(N), Space O(N)\n * @param callback - Mapping function (element, index, queue) → element.\n * @param [thisArg] - Value for `this` inside the callback.\n * @returns A new queue with mapped elements (same element type).\n */\n\n mapSame(callback: ElementCallback<E, R, E>, thisArg?: unknown): this {\n const Ctor = this.constructor as new (\n elements?: Iterable<E> | Iterable<R>,\n options?: QueueOptions<E, R>\n ) => Queue<E, R>;\n const out = new Ctor([], {\n toElementFn: this.toElementFn,\n maxLen: this._maxLen,\n autoCompactRatio: this._autoCompactRatio\n });\n out._setAutoCompactRatio?.(this._autoCompactRatio);\n let index = 0;\n for (const v of this) {\n const mv = thisArg === undefined ? callback(v, index++, this) : callback.call(thisArg, v, index++, this);\n out.push(mv);\n }\n return out as this;\n }\n\n /**\n * (Protected) Set the internal auto-compaction ratio.\n * @remarks Time O(1), Space O(1)\n * @param value - New ratio to assign.\n * @returns void\n */\n\n protected _setAutoCompactRatio(value: number): void {\n this._autoCompactRatio = value;\n }\n\n /**\n * (Protected) Iterate elements from front to back.\n * @remarks Time O(N), Space O(1)\n * @returns Iterator of E.\n */\n\n protected *_getIterator(): IterableIterator<E> {\n for (let i = this._offset; i < this.elements.length; i++) yield this.elements[i];\n }\n\n /**\n * (Protected) Iterate elements from back to front.\n * @remarks Time O(N), Space O(1)\n * @returns Iterator of E.\n */\n\n protected *_getReverseIterator(): IterableIterator<E> {\n for (let i = this.length - 1; i >= 0; i--) {\n const cur = this.at(i);\n if (cur !== undefined) yield cur;\n }\n }\n\n /**\n * (Protected) Create an empty instance of the same concrete class.\n * @remarks Time O(1), Space O(1)\n * @param [options] - Options forwarded to the constructor.\n * @returns An empty like-kind queue instance.\n */\n\n protected override _createInstance(options?: LinearBaseOptions<E, R>): this {\n const Ctor = this.constructor as new (elements?: Iterable<E> | Iterable<R>, options?: QueueOptions<E, R>) => this;\n return new Ctor([], options as QueueOptions<E, R> | undefined);\n }\n\n /**\n * (Protected) Create a like-kind queue and seed it from an iterable.\n * @remarks Time O(N), Space O(N)\n * @template EM\n * @template RM\n * @param [elements] - Iterable used to seed the new queue.\n * @param [options] - Options forwarded to the constructor.\n * @returns A like-kind Queue instance.\n */\n\n protected _createLike<EM = E, RM = R>(\n elements: Iterable<EM> | Iterable<RM> = [],\n options?: QueueOptions<EM, RM>\n ): Queue<EM, RM> {\n const Ctor = this.constructor as new (\n elements?: Iterable<EM> | Iterable<RM>,\n options?: QueueOptions<EM, RM>\n ) => Queue<EM, RM>;\n return new Ctor(elements, options);\n }\n}\n\n/**\n * Queue implemented over a singly linked list; preserves head/tail operations with linear scans for queries.\n * @remarks Time O(1), Space O(1)\n * @template E\n * @template R\n * @example examples will be generated by unit test\n */\nexport class LinkedListQueue<E = any, R = any> extends SinglyLinkedList<E, R> {\n /**\n * Deep clone this linked-list-based queue.\n * @remarks Time O(N), Space O(N)\n * @returns A new queue with the same sequence of elements.\n */\n\n override clone(): this {\n const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });\n for (const v of this) out.push(v);\n return out;\n }\n}\n","import type { EntryCallback, ReduceEntryCallback } from '../../types';\n\n/**\n * Iterable view over key-value entries.\n * @template K - Key type.\n * @template V - Value type.\n * @remarks Time O(1), Space O(1)\n */\nexport abstract class IterableEntryBase<K = any, V = any> {\n /**\n * Total number of entries.\n * @returns Entry count.\n * @remarks Time O(1), Space O(1)\n */\n abstract get size(): number;\n\n /**\n * Default iterator yielding `[key, value]` entries.\n * @returns Iterator of `[K, V]`.\n * @remarks Time O(n) to iterate, Space O(1)\n */\n *[Symbol.iterator](...args: any[]): IterableIterator<[K, V]> {\n yield* this._getIterator(...args);\n }\n\n /**\n * Iterate over `[key, value]` pairs (may yield `undefined` values).\n * @returns Iterator of `[K, V | undefined]`.\n * @remarks Time O(n), Space O(1)\n */\n *entries(): IterableIterator<[K, V | undefined]> {\n for (const item of this) {\n yield item;\n }\n }\n\n /**\n * Iterate over keys only.\n * @returns Iterator of keys.\n * @remarks Time O(n), Space O(1)\n */\n *keys(): IterableIterator<K> {\n for (const item of this) {\n yield item[0];\n }\n }\n\n /**\n * Iterate over values only.\n * @returns Iterator of values.\n * @remarks Time O(n), Space O(1)\n */\n *values(): IterableIterator<V> {\n for (const item of this) {\n yield item[1];\n }\n }\n\n /**\n * Test whether all entries satisfy the predicate.\n * @param predicate - `(key, value, index, self) => boolean`.\n * @param thisArg - Optional `this` for callback.\n * @returns `true` if all pass; otherwise `false`.\n * @remarks Time O(n), Space O(1)\n */\n every(predicate: EntryCallback<K, V, boolean>, thisArg?: any): boolean {\n let index = 0;\n for (const item of this) {\n if (!predicate.call(thisArg, item[0], item[1], index++, this)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Test whether any entry satisfies the predicate.\n * @param predicate - `(key, value, index, self) => boolean`.\n * @param thisArg - Optional `this` for callback.\n * @returns `true` if any passes; otherwise `false`.\n * @remarks Time O(n), Space O(1)\n */\n some(predicate: EntryCallback<K, V, boolean>, thisArg?: any): boolean {\n let index = 0;\n for (const item of this) {\n if (predicate.call(thisArg, item[0], item[1], index++, this)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Visit each entry, left-to-right.\n * @param callbackfn - `(key, value, index, self) => void`.\n * @param thisArg - Optional `this` for callback.\n * @remarks Time O(n), Space O(1)\n */\n forEach(callbackfn: EntryCallback<K, V, void>, thisArg?: any): void {\n let index = 0;\n for (const item of this) {\n const [key, value] = item;\n callbackfn.call(thisArg, key, value, index++, this);\n }\n }\n\n /**\n * Find the first entry that matches a predicate.\n * @param callbackfn - `(key, value, index, self) => boolean`.\n * @param thisArg - Optional `this` for callback.\n * @returns Matching `[key, value]` or `undefined`.\n * @remarks Time O(n), Space O(1)\n */\n find(callbackfn: EntryCallback<K, V, boolean>, thisArg?: any): [K, V] | undefined {\n let index = 0;\n for (const item of this) {\n const [key, value] = item;\n if (callbackfn.call(thisArg, key, value, index++, this)) return item;\n }\n return;\n }\n\n /**\n * Whether the given key exists.\n * @param key - Key to test.\n * @returns `true` if found; otherwise `false`.\n * @remarks Time O(n) generic, Space O(1)\n */\n has(key: K): boolean {\n for (const item of this) {\n const [itemKey] = item;\n if (itemKey === key) return true;\n }\n return false;\n }\n\n /**\n * Whether there exists an entry with the given value.\n * @param value - Value to test.\n * @returns `true` if found; otherwise `false`.\n * @remarks Time O(n), Space O(1)\n */\n hasValue(value: V): boolean {\n for (const [, elementValue] of this) {\n if (elementValue === value) return true;\n }\n return false;\n }\n\n /**\n * Get the value under a key.\n * @param key - Key to look up.\n * @returns Value or `undefined`.\n * @remarks Time O(n) generic, Space O(1)\n */\n get(key: K): V | undefined {\n for (const item of this) {\n const [itemKey, value] = item;\n if (itemKey === key) return value;\n }\n return;\n }\n\n /**\n * Reduce entries into a single accumulator.\n * @param callbackfn - `(acc, value, key, index, self) => acc`.\n * @param initialValue - Initial accumulator.\n * @returns Final accumulator.\n * @remarks Time O(n), Space O(1)\n */\n reduce<U>(callbackfn: ReduceEntryCallback<K, V, U>, initialValue: U): U {\n let accumulator = initialValue;\n let index = 0;\n for (const item of this) {\n const [key, value] = item;\n accumulator = callbackfn(accumulator, value, key, index++, this);\n }\n return accumulator;\n }\n\n /**\n * Visualize the iterable as an array of `[key, value]` pairs (or a custom string).\n * @returns Array of entries (default) or a string.\n * @remarks Time O(n), Space O(n)\n */\n toVisual(): [K, V][] | string {\n return [...this];\n }\n\n /**\n * Print a human-friendly representation to the console.\n * @remarks Time O(n), Space O(n)\n */\n print(): void {\n console.log(this.toVisual());\n }\n\n /**\n * Whether there are no entries.\n * @returns `true` if empty; `false` otherwise.\n * @remarks Time O(1) typical, Space O(1)\n */\n abstract isEmpty(): boolean;\n\n /**\n * Remove all entries.\n * @remarks Time O(n) typical, Space O(1)\n */\n abstract clear(): void;\n\n /**\n * Deep clone preserving the concrete subtype.\n * @returns A new instance of the same concrete class (`this` type).\n * @remarks Time O(n) typical, Space O(n)\n */\n abstract clone(): this;\n\n /**\n * Map entries using an implementation-specific strategy.\n * @remarks Time O(n), Space O(n)\n */\n abstract map(...args: any[]): any;\n\n /**\n * Filter entries and return the same-species structure.\n * @returns A new instance of the same concrete class (`this` type).\n * @remarks Time O(n), Space O(n)\n */\n abstract filter(...args: any[]): this;\n\n /**\n * Underlying iterator for the default iteration protocol.\n * @returns Iterator of `[K, V]`.\n * @remarks Time O(n), Space O(1)\n */\n protected abstract _getIterator(...args: any[]): IterableIterator<[K, V]>;\n}\n","import { isComparable } from '../utils';\n\nexport enum DFSOperation {\n VISIT = 0,\n PROCESS = 1\n}\n\nexport class Range<K> {\n constructor(\n public low: K,\n public high: K,\n public includeLow: boolean = true,\n public includeHigh: boolean = true\n ) {\n if (!(isComparable(low) && isComparable(high))) throw new RangeError('low or high is not comparable');\n if (low > high) throw new RangeError('low must be less than or equal to high');\n }\n\n // Determine whether a key is within the range\n isInRange(key: K, comparator: (a: K, b: K) => number): boolean {\n const lowCheck = this.includeLow ? comparator(key, this.low) >= 0 : comparator(key, this.low) > 0;\n const highCheck = this.includeHigh ? comparator(key, this.high) <= 0 : comparator(key, this.high) < 0;\n return lowCheck && highCheck;\n }\n}\n","/**\n * data-structure-typed\n *\n * @author Pablo Zeng\n * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>\n * @license MIT License\n */\n\nimport type {\n BinaryTreeDeleteResult,\n BinaryTreeOptions,\n BinaryTreePrintOptions,\n BTNEntry,\n DFSOrderPattern,\n DFSStackItem,\n EntryCallback,\n FamilyPosition,\n IterationType,\n NodeCallback,\n NodeDisplayLayout,\n NodePredicate,\n OptNodeOrNull,\n RBTNColor,\n ToEntryFn,\n Trampoline\n} from '../../types';\nimport { IBinaryTree } from '../../interfaces';\nimport { isComparable, makeTrampoline, makeTrampolineThunk } from '../../utils';\nimport { Queue } from '../queue';\nimport { IterableEntryBase } from '../base';\nimport { DFSOperation, Range } from '../../common';\n\n/**\n * @template K - The type of the key.\n * @template V - The type of the value.\n */\nexport class BinaryTreeNode<K = any, V = any> {\n key: K;\n value?: V;\n parent?: BinaryTreeNode<K, V> = undefined;\n\n /**\n * Creates an instance of BinaryTreeNode.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key of the node.\n * @param [value] - The value associated with the key.\n */\n constructor(key: K, value?: V) {\n this.key = key;\n this.value = value;\n }\n\n _left?: BinaryTreeNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the left child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The left child.\n */\n get left(): BinaryTreeNode<K, V> | null | undefined {\n return this._left;\n }\n\n /**\n * Sets the left child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the left child.\n */\n set left(v: BinaryTreeNode<K, V> | null | undefined) {\n if (v) {\n v.parent = this as unknown as BinaryTreeNode<K, V>;\n }\n this._left = v;\n }\n\n _right?: BinaryTreeNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the right child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The right child.\n */\n get right(): BinaryTreeNode<K, V> | null | undefined {\n return this._right;\n }\n\n /**\n * Sets the right child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the right child.\n */\n set right(v: BinaryTreeNode<K, V> | null | undefined) {\n if (v) {\n v.parent = this;\n }\n this._right = v;\n }\n\n _height: number = 0;\n\n /**\n * Gets the height of the node (used in self-balancing trees).\n * @remarks Time O(1), Space O(1)\n *\n * @returns The height.\n */\n get height(): number {\n return this._height;\n }\n\n /**\n * Sets the height of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @param value - The new height.\n */\n set height(value: number) {\n this._height = value;\n }\n\n _color: RBTNColor = 'BLACK';\n\n /**\n * Gets the color of the node (used in Red-Black trees).\n * @remarks Time O(1), Space O(1)\n *\n * @returns The node's color.\n */\n get color(): RBTNColor {\n return this._color;\n }\n\n /**\n * Sets the color of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @param value - The new color.\n */\n set color(value: RBTNColor) {\n this._color = value;\n }\n\n _count: number = 1;\n\n /**\n * Gets the count of nodes in the subtree rooted at this node (used in order-statistic trees).\n * @remarks Time O(1), Space O(1)\n *\n * @returns The subtree node count.\n */\n get count(): number {\n return this._count;\n }\n\n /**\n * Sets the count of nodes in the subtree.\n * @remarks Time O(1), Space O(1)\n *\n * @param value - The new count.\n */\n set count(value: number) {\n this._count = value;\n }\n\n /**\n * Gets the position of the node relative to its parent.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The family position (e.g., 'ROOT', 'LEFT', 'RIGHT').\n */\n get familyPosition(): FamilyPosition {\n if (!this.parent) {\n return this.left || this.right ? 'ROOT' : 'ISOLATED';\n }\n\n if (this.parent.left === this) {\n return this.left || this.right ? 'ROOT_LEFT' : 'LEFT';\n } else if (this.parent.right === this) {\n return this.left || this.right ? 'ROOT_RIGHT' : 'RIGHT';\n }\n\n return 'MAL_NODE';\n }\n}\n\n/**\n * A general Binary Tree implementation.\n *\n * @remarks\n * This class implements a basic Binary Tree, not a Binary Search Tree.\n * The `add` operation inserts nodes level-by-level (BFS) into the first available slot.\n *\n * @template K - The type of the key.\n * @template V - The type of the value.\n * @template R - The type of the raw data object (if using `toEntryFn`).\n * 1. Two Children Maximum: Each node has at most two children.\n * 2. Left and Right Children: Nodes have distinct left and right children.\n * 3. Depth and Height: Depth is the number of edges from the root to a node; height is the maximum depth in the tree.\n * 4. Subtrees: Each child of a node forms the root of a subtree.\n * 5. Leaf Nodes: Nodes without children are leaves.\n * @example\n * // determine loan approval using a decision tree\n * // Decision tree structure\n * const loanDecisionTree = new BinaryTree<string>(\n * ['stableIncome', 'goodCredit', 'Rejected', 'Approved', 'Rejected'],\n * { isDuplicate: true }\n * );\n *\n * function determineLoanApproval(\n * node?: BinaryTreeNode<string> | null,\n * conditions?: { [key: string]: boolean }\n * ): string {\n * if (!node) throw new Error('Invalid node');\n *\n * // If it's a leaf node, return the decision result\n * if (!node.left && !node.right) return node.key;\n *\n * // Check if a valid condition exists for the current node's key\n * return conditions?.[node.key]\n * ? determineLoanApproval(node.left, conditions)\n * : determineLoanApproval(node.right, conditions);\n * }\n *\n * // Test case 1: Stable income and good credit score\n * console.log(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: true })); // 'Approved'\n *\n * // Test case 2: Stable income but poor credit score\n * console.log(determineLoanApproval(loanDecisionTree.root, { stableIncome: true, goodCredit: false })); // 'Rejected'\n *\n * // Test case 3: No stable income\n * console.log(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: true })); // 'Rejected'\n *\n * // Test case 4: No stable income and poor credit score\n * console.log(determineLoanApproval(loanDecisionTree.root, { stableIncome: false, goodCredit: false })); // 'Rejected'\n * @example\n * // evaluate the arithmetic expression represented by the binary tree\n * const expressionTree = new BinaryTree<number | string>(['+', 3, '*', null, null, 5, '-', null, null, 2, 8]);\n *\n * function evaluate(node?: BinaryTreeNode<number | string> | null): number {\n * if (!node) return 0;\n *\n * if (typeof node.key === 'number') return node.key;\n *\n * const leftValue = evaluate(node.left); // Evaluate the left subtree\n * const rightValue = evaluate(node.right); // Evaluate the right subtree\n *\n * // Perform the operation based on the current node's operator\n * switch (node.key) {\n * case '+':\n * return leftValue + rightValue;\n * case '-':\n * return leftValue - rightValue;\n * case '*':\n * return leftValue * rightValue;\n * case '/':\n * return rightValue !== 0 ? leftValue / rightValue : 0; // Handle division by zero\n * default:\n * throw new Error(`Unsupported operator: ${node.key}`);\n * }\n * }\n *\n * console.log(evaluate(expressionTree.root)); // -27\n */\nexport class BinaryTree<K = any, V = any, R = any>\n extends IterableEntryBase<K, V | undefined>\n implements IBinaryTree<K, V, R>\n{\n iterationType: IterationType = 'ITERATIVE';\n\n /**\n * Creates an instance of BinaryTree.\n * @remarks Time O(N * M), where N is the number of items in `keysNodesEntriesOrRaws` and M is the tree size at insertion time (due to O(M) `add` operation). Space O(N) for storing the nodes.\n *\n * @param [keysNodesEntriesOrRaws=[]] - An iterable of items to add.\n * @param [options] - Configuration options for the tree.\n */\n constructor(\n keysNodesEntriesOrRaws: Iterable<\n K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n > = [],\n options?: BinaryTreeOptions<K, V, R>\n ) {\n super();\n if (options) {\n const { iterationType, toEntryFn, isMapMode, isDuplicate } = options;\n if (iterationType) this.iterationType = iterationType;\n if (isMapMode !== undefined) this._isMapMode = isMapMode;\n if (isDuplicate !== undefined) this._isDuplicate = isDuplicate;\n if (typeof toEntryFn === 'function') this._toEntryFn = toEntryFn;\n else if (toEntryFn) throw TypeError('toEntryFn must be a function type');\n }\n\n if (keysNodesEntriesOrRaws) this.addMany(keysNodesEntriesOrRaws);\n }\n\n protected _isMapMode = true;\n\n /**\n * Gets whether the tree is in Map mode.\n * @remarks In Map mode (default), values are stored in an external Map, and nodes only hold keys. If false, values are stored directly on the nodes. Time O(1)\n *\n * @returns True if in Map mode, false otherwise.\n */\n get isMapMode() {\n return this._isMapMode;\n }\n\n protected _isDuplicate = false;\n\n /**\n * Gets whether the tree allows duplicate keys.\n * @remarks Time O(1)\n *\n * @returns True if duplicates are allowed, false otherwise.\n */\n get isDuplicate() {\n return this._isDuplicate;\n }\n\n protected _store = new Map<K, V | undefined>();\n\n /**\n * Gets the external value store (used in Map mode).\n * @remarks Time O(1)\n *\n * @returns The map storing key-value pairs.\n */\n get store() {\n return this._store;\n }\n\n protected _root?: BinaryTreeNode<K, V> | null | undefined;\n\n /**\n * Gets the root node of the tree.\n * @remarks Time O(1)\n *\n * @returns The root node.\n */\n get root(): BinaryTreeNode<K, V> | null | undefined {\n return this._root;\n }\n\n protected _size: number = 0;\n\n /**\n * Gets the number of nodes in the tree.\n * @remarks Time O(1)\n *\n * @returns The size of the tree.\n */\n get size(): number {\n return this._size;\n }\n\n protected _NIL: BinaryTreeNode<K, V> = new BinaryTreeNode<K, V>(NaN as K) as unknown as BinaryTreeNode<K, V>;\n\n /**\n * Gets the sentinel NIL node (used in self-balancing trees like Red-Black Tree).\n * @remarks Time O(1)\n *\n * @returns The NIL node.\n */\n get NIL(): BinaryTreeNode<K, V> {\n return this._NIL;\n }\n\n protected _toEntryFn?: ToEntryFn<K, V, R>;\n\n /**\n * Gets the function used to convert raw data objects (R) into [key, value] entries.\n * @remarks Time O(1)\n *\n * @returns The conversion function.\n */\n get toEntryFn() {\n return this._toEntryFn;\n }\n\n /**\n * (Protected) Creates a new node.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key for the new node.\n * @param [value] - The value for the new node (used if not in Map mode).\n * @returns The newly created node.\n */\n createNode(key: K, value?: V): BinaryTreeNode<K, V> {\n return new BinaryTreeNode<K, V>(key, this._isMapMode ? undefined : value);\n }\n\n /**\n * Creates a new, empty tree of the same type and configuration.\n * @remarks Time O(1) (excluding options cloning), Space O(1)\n *\n * @param [options] - Optional overrides for the new tree's options.\n * @returns A new, empty tree instance.\n */\n createTree(options?: Partial<BinaryTreeOptions<K, V, R>>): this {\n return this._createInstance<K, V, R>(options);\n }\n\n /**\n * Ensures the input is a node. If it's a key or entry, it searches for the node.\n * @remarks Time O(1) if a node is passed. O(N) if a key or entry is passed (due to `getNode` performing a full search). Space O(1) if iterative search, O(H) if recursive (where H is height, O(N) worst-case).\n *\n * @param keyNodeOrEntry - The item to resolve to a node.\n * @param [iterationType=this.iterationType] - The traversal method to use if searching.\n * @returns The resolved node, or null/undefined if not found or input is null/undefined.\n */\n ensureNode(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType: IterationType = this.iterationType\n ): BinaryTreeNode<K, V> | null | undefined {\n if (keyNodeOrEntry === null) return null;\n if (keyNodeOrEntry === undefined) return;\n if (keyNodeOrEntry === this._NIL) return;\n\n if (this.isNode(keyNodeOrEntry)) return keyNodeOrEntry;\n\n if (this.isEntry(keyNodeOrEntry)) {\n const key = keyNodeOrEntry[0];\n if (key === null) return null;\n if (key === undefined) return;\n return this.getNode(key, this._root, iterationType);\n }\n\n return this.getNode(keyNodeOrEntry, this._root, iterationType);\n }\n\n /**\n * Checks if the given item is a `BinaryTreeNode` instance.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's a node, false otherwise.\n */\n isNode(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is BinaryTreeNode<K, V> {\n return keyNodeOrEntry instanceof BinaryTreeNode;\n }\n\n /**\n * Checks if the given item is a raw data object (R) that needs conversion via `toEntryFn`.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeEntryOrRaw - The item to check.\n * @returns True if it's a raw object, false otherwise.\n */\n isRaw(\n keyNodeEntryOrRaw: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n ): keyNodeEntryOrRaw is R {\n return this._toEntryFn !== undefined && typeof keyNodeEntryOrRaw === 'object';\n }\n\n /**\n * Checks if the given item is a \"real\" node (i.e., not null, undefined, or NIL).\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's a real node, false otherwise.\n */\n isRealNode(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is BinaryTreeNode<K, V> {\n if (keyNodeOrEntry === this._NIL || keyNodeOrEntry === null || keyNodeOrEntry === undefined) return false;\n return this.isNode(keyNodeOrEntry);\n }\n\n /**\n * Checks if the given item is either a \"real\" node or null.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's a real node or null, false otherwise.\n */\n isRealNodeOrNull(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is BinaryTreeNode<K, V> | null {\n return keyNodeOrEntry === null || this.isRealNode(keyNodeOrEntry);\n }\n\n /**\n * Checks if the given item is the sentinel NIL node.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's the NIL node, false otherwise.\n */\n isNIL(keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined): boolean {\n return keyNodeOrEntry === this._NIL;\n }\n\n /**\n * Checks if the given item is a `Range` object.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeEntryOrPredicate - The item to check.\n * @returns True if it's a Range, false otherwise.\n */\n isRange(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V>>\n | Range<K>\n ): keyNodeEntryOrPredicate is Range<K> {\n return keyNodeEntryOrPredicate instanceof Range;\n }\n\n /**\n * Checks if a node is a leaf (has no real children).\n * @remarks Time O(N) if a key/entry is passed (due to `ensureNode`). O(1) if a node is passed. Space O(1) or O(H) (from `ensureNode`).\n *\n * @param keyNodeOrEntry - The node to check.\n * @returns True if the node is a leaf, false otherwise.\n */\n isLeaf(keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined): boolean {\n keyNodeOrEntry = this.ensureNode(keyNodeOrEntry);\n if (keyNodeOrEntry === undefined) return false;\n if (keyNodeOrEntry === null) return true; // A null spot is considered a leaf\n return !this.isRealNode(keyNodeOrEntry.left) && !this.isRealNode(keyNodeOrEntry.right);\n }\n\n /**\n * Checks if the given item is a [key, value] entry pair.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's an entry, false otherwise.\n */\n isEntry(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is BTNEntry<K, V> {\n return Array.isArray(keyNodeOrEntry) && keyNodeOrEntry.length === 2;\n }\n\n /**\n * Checks if the given key is valid (comparable or null).\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key to validate.\n * @returns True if the key is valid, false otherwise.\n */\n isValidKey(key: any): key is K {\n if (key === null) return true;\n return isComparable(key);\n }\n\n /**\n * Adds a new node to the tree.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). This implementation adds the node at the first available position in a level-order (BFS) traversal. This is NOT a Binary Search Tree insertion. Time O(N), where N is the number of nodes. It must traverse level-by-level to find an empty slot. Space O(N) in the worst case for the BFS queue (e.g., a full last level).\n *\n * @param keyNodeOrEntry - The key, node, or entry to add.\n * @param [value] - The value, if providing just a key.\n * @returns True if the addition was successful, false otherwise.\n */\n add(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n value?: V\n ): boolean {\n const [newNode, newValue] = this._keyValueNodeOrEntryToNodeAndValue(keyNodeOrEntry, value);\n if (newNode === undefined) return false;\n\n if (!this._root) {\n this._setRoot(newNode);\n if (this._isMapMode) this._setValue(newNode?.key, newValue);\n this._size = 1;\n return true;\n }\n\n const queue = new Queue<BinaryTreeNode<K, V>>([this._root]);\n let potentialParent: BinaryTreeNode<K, V> | undefined;\n while (queue.length > 0) {\n const cur = queue.shift();\n\n if (!cur) continue;\n\n if (!this._isDuplicate) {\n if (newNode !== null && cur.key === newNode.key) {\n this._replaceNode(cur, newNode);\n if (this._isMapMode) this._setValue(cur.key, newValue);\n return true; // Replaced existing node\n }\n }\n\n if (potentialParent === undefined && (cur.left === undefined || cur.right === undefined)) {\n potentialParent = cur;\n }\n\n if (cur.left !== null) {\n if (cur.left) queue.push(cur.left);\n }\n if (cur.right !== null) {\n if (cur.right) queue.push(cur.right);\n }\n }\n\n if (potentialParent) {\n if (potentialParent.left === undefined) {\n potentialParent.left = newNode;\n } else if (potentialParent.right === undefined) {\n potentialParent.right = newNode;\n }\n if (this._isMapMode) this._setValue(newNode?.key, newValue);\n this._size++;\n return true;\n }\n\n return false; // Should not happen if tree is not full?\n }\n\n /**\n * Adds multiple items to the tree.\n * @remarks Time O(N * M), where N is the number of items to add and M is the size of the tree at insertion (due to O(M) `add` operation). Space O(M) (from `add`) + O(N) (for the `inserted` array).\n *\n * @param keysNodesEntriesOrRaws - An iterable of items to add.\n * @param [values] - An optional parallel iterable of values.\n * @returns An array of booleans indicating the success of each individual `add` operation.\n */\n addMany(\n keysNodesEntriesOrRaws: Iterable<\n K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n >,\n values?: Iterable<V | undefined>\n ): boolean[] {\n const inserted: boolean[] = [];\n\n let valuesIterator: Iterator<V | undefined> | undefined;\n if (values) {\n valuesIterator = values[Symbol.iterator]();\n }\n\n for (let keyNodeEntryOrRaw of keysNodesEntriesOrRaws) {\n let value: V | undefined | null = undefined;\n\n if (valuesIterator) {\n const valueResult = valuesIterator.next();\n if (!valueResult.done) {\n value = valueResult.value;\n }\n }\n if (this.isRaw(keyNodeEntryOrRaw)) keyNodeEntryOrRaw = this._toEntryFn!(keyNodeEntryOrRaw);\n inserted.push(this.add(keyNodeEntryOrRaw, value));\n }\n\n return inserted;\n }\n\n /**\n * Merges another tree into this one by adding all its nodes.\n * @remarks Time O(N * M), same as `addMany`, where N is the size of `anotherTree` and M is the size of this tree. Space O(M) (from `add`).\n *\n * @param anotherTree - The tree to merge.\n */\n merge(anotherTree: BinaryTree<K, V, R>) {\n this.addMany(anotherTree, []);\n }\n\n /**\n * Clears the tree and refills it with new items.\n * @remarks Time O(N) (for `clear`) + O(N * M) (for `addMany`) = O(N * M). Space O(M) (from `addMany`).\n *\n * @param keysNodesEntriesOrRaws - An iterable of items to add.\n * @param [values] - An optional parallel iterable of values.\n */\n refill(\n keysNodesEntriesOrRaws: Iterable<\n K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n >,\n values?: Iterable<V | undefined>\n ): void {\n this.clear();\n this.addMany(keysNodesEntriesOrRaws, values);\n }\n\n /**\n * Deletes a node from the tree.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). This implementation finds the node, and if it has two children, swaps it with the rightmost node of its left subtree (in-order predecessor) before deleting. Time O(N) in the worst case. O(N) to find the node (`getNode`) and O(H) (which is O(N) worst-case) to find the rightmost node. Space O(1) (if `getNode` is iterative, which it is).\n *\n * @param keyNodeOrEntry - The node to delete.\n * @returns An array containing deletion results (for compatibility with self-balancing trees).\n */\n delete(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): BinaryTreeDeleteResult<BinaryTreeNode<K, V>>[] {\n const deletedResult: BinaryTreeDeleteResult<BinaryTreeNode<K, V>>[] = [];\n if (!this._root) return deletedResult;\n\n const curr = this.getNode(keyNodeOrEntry);\n if (!curr) return deletedResult;\n\n const parent: BinaryTreeNode<K, V> | undefined = curr?.parent;\n let needBalanced: BinaryTreeNode<K, V> | undefined;\n let orgCurrent: BinaryTreeNode<K, V> | undefined = curr;\n\n if (!curr.left && !curr.right && !parent) {\n // Deleting the root with no children\n this._setRoot(undefined);\n } else if (curr.left) {\n // Node has a left child (or two children)\n // Find the rightmost node in the left subtree\n const leftSubTreeRightMost = this.getRightMost(node => node, curr.left);\n if (leftSubTreeRightMost) {\n const parentOfLeftSubTreeMax = leftSubTreeRightMost.parent;\n // Swap properties\n orgCurrent = this._swapProperties(curr, leftSubTreeRightMost);\n // `orgCurrent` is now the node to be physically deleted (which was the rightmost)\n if (parentOfLeftSubTreeMax) {\n // Unlink the rightmost node\n if (parentOfLeftSubTreeMax.right === leftSubTreeRightMost)\n parentOfLeftSubTreeMax.right = leftSubTreeRightMost.left;\n else parentOfLeftSubTreeMax.left = leftSubTreeRightMost.left;\n needBalanced = parentOfLeftSubTreeMax;\n }\n }\n } else if (parent) {\n // Node has no left child, but has a parent\n // Promote the right child (which could be null)\n const { familyPosition: fp } = curr;\n if (fp === 'LEFT' || fp === 'ROOT_LEFT') {\n parent.left = curr.right;\n } else if (fp === 'RIGHT' || fp === 'ROOT_RIGHT') {\n parent.right = curr.right;\n }\n needBalanced = parent;\n } else {\n // Deleting the root, which has no left child\n // Promote the right child as the new root\n this._setRoot(curr.right);\n curr.right = undefined;\n }\n\n this._size = this._size - 1;\n\n deletedResult.push({ deleted: orgCurrent, needBalanced });\n if (this._isMapMode && orgCurrent) this._store.delete(orgCurrent.key);\n return deletedResult;\n }\n\n /**\n * Searches the tree for nodes matching a predicate.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). Performs a full DFS (pre-order) scan of the tree. Time O(N), as it may visit every node. Space O(H) for the call stack (recursive) or explicit stack (iterative), where H is the tree height (O(N) worst-case).\n *\n * @template C - The type of the callback function.\n * @param keyNodeEntryOrPredicate - The key, node, entry, or predicate function to search for.\n * @param [onlyOne=false] - If true, stops after finding the first match.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on matching nodes.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - Whether to use 'RECURSIVE' or 'ITERATIVE' search.\n * @returns An array of results from the callback function for each matching node.\n */\n search<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V> | null>,\n onlyOne = false,\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n if (keyNodeEntryOrPredicate === undefined) return [];\n if (keyNodeEntryOrPredicate === null) return [];\n startNode = this.ensureNode(startNode);\n if (!startNode) return [];\n const predicate = this._ensurePredicate(keyNodeEntryOrPredicate);\n\n const ans: ReturnType<C>[] = [];\n\n if (iterationType === 'RECURSIVE') {\n const dfs = (cur: BinaryTreeNode<K, V>) => {\n if (predicate(cur)) {\n ans.push(callback(cur));\n if (onlyOne) return;\n }\n if (!this.isRealNode(cur.left) && !this.isRealNode(cur.right)) return;\n if (this.isRealNode(cur.left)) dfs(cur.left);\n if (this.isRealNode(cur.right)) dfs(cur.right);\n };\n\n dfs(startNode);\n } else {\n const stack = [startNode];\n\n while (stack.length > 0) {\n const cur = stack.pop();\n if (this.isRealNode(cur)) {\n if (predicate(cur)) {\n ans.push(callback(cur));\n if (onlyOne) return ans;\n }\n if (this.isRealNode(cur.left)) stack.push(cur.left);\n if (this.isRealNode(cur.right)) stack.push(cur.right);\n }\n }\n }\n\n return ans;\n }\n\n /**\n * Gets all nodes matching a predicate.\n * @remarks Time O(N) (via `search`). Space O(H) or O(N) (via `search`).\n *\n * @param keyNodeEntryOrPredicate - The key, node, entry, or predicate function to search for.\n * @param [onlyOne=false] - If true, stops after finding the first match.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of matching nodes.\n */\n getNodes(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V>>,\n onlyOne?: boolean,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType\n ): BinaryTreeNode<K, V>[];\n\n getNodes(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V> | null>,\n onlyOne = false,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): (BinaryTreeNode<K, V> | null)[] {\n return this.search(keyNodeEntryOrPredicate, onlyOne, node => node, startNode, iterationType);\n }\n\n /**\n * Gets the first node matching a predicate.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). Time O(N) in the worst case (via `search`). Space O(H) or O(N) (via `search`).\n *\n * @param keyNodeEntryOrPredicate - The key, node, entry, or predicate function to search for.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The first matching node, or undefined if not found.\n */\n getNode(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V> | null>,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): BinaryTreeNode<K, V> | null | undefined {\n return this.search(keyNodeEntryOrPredicate, true, node => node, startNode, iterationType)[0];\n }\n\n /**\n * Gets the value associated with a key.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). Time O(1) if in Map mode. O(N) if not in Map mode (uses `getNode`). Space O(1) if in Map mode. O(H) or O(N) otherwise.\n *\n * @param keyNodeEntryOrPredicate - The key, node, or entry to get the value for.\n * @param [startNode=this._root] - The node to start searching from (if not in Map mode).\n * @param [iterationType=this.iterationType] - The traversal method (if not in Map mode).\n * @returns The associated value, or undefined.\n */\n override get(\n keyNodeEntryOrPredicate: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): V | undefined {\n if (this._isMapMode) {\n const key = this._extractKey(keyNodeEntryOrPredicate);\n if (key === null || key === undefined) return;\n return this._store.get(key);\n }\n return this.getNode(keyNodeEntryOrPredicate, startNode, iterationType)?.value;\n }\n\n /**\n * Checks if a node matching the predicate exists in the tree.\n * @remarks Time O(log N), For BST, Red-Black Tree, and AVL Tree subclasses, the worst-case time is O(log N). Time O(N) in the worst case (via `search`). Space O(H) or O(N) (via `search`).\n *\n * @param [keyNodeEntryOrPredicate] - The key, node, entry, or predicate to check for.\n * @param [startNode] - The node to start the search from.\n * @param [iterationType] - The traversal method.\n * @returns True if a matching node exists, false otherwise.\n */\n override has(\n keyNodeEntryOrPredicate?:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V>>,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType\n ): boolean;\n\n override has(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V> | null>,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): boolean {\n return this.search(keyNodeEntryOrPredicate, true, node => node, startNode, iterationType).length > 0;\n }\n\n /**\n * Clears the tree of all nodes and values.\n * @remarks Time O(N) if in Map mode (due to `_store.clear()`), O(1) otherwise. Space O(1)\n */\n clear() {\n this._clearNodes();\n if (this._isMapMode) this._clearValues();\n }\n\n /**\n * Checks if the tree is empty.\n * @remarks Time O(1), Space O(1)\n *\n * @returns True if the tree has no nodes, false otherwise.\n */\n isEmpty(): boolean {\n return this._size === 0;\n }\n\n /**\n * Checks if the tree is perfectly balanced.\n * @remarks A tree is perfectly balanced if the difference between min and max height is at most 1. Time O(N), as it requires two full traversals (`getMinHeight` and `getHeight`). Space O(H) or O(N) (from height calculation).\n *\n * @param [startNode=this._root] - The node to start checking from.\n * @returns True if perfectly balanced, false otherwise.\n */\n isPerfectlyBalanced(\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root\n ): boolean {\n return this.getMinHeight(startNode) + 1 >= this.getHeight(startNode);\n }\n\n /**\n * Checks if the tree is a valid Binary Search Tree (BST).\n * @remarks Time O(N), as it must visit every node. Space O(H) for the call stack (recursive) or explicit stack (iterative), where H is the tree height (O(N) worst-case).\n *\n * @param [startNode=this._root] - The node to start checking from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns True if it's a valid BST, false otherwise.\n */\n isBST(\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): boolean {\n const startNodeSired = this.ensureNode(startNode);\n if (!startNodeSired) return true;\n\n if (iterationType === 'RECURSIVE') {\n const dfs = (cur: BinaryTreeNode<K, V> | null | undefined, min: number, max: number): boolean => {\n if (!this.isRealNode(cur)) return true;\n const numKey = Number(cur.key);\n if (numKey <= min || numKey >= max) return false;\n return dfs(cur.left, min, numKey) && dfs(cur.right, numKey, max);\n };\n\n const isStandardBST = dfs(startNodeSired, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);\n const isInverseBST = dfs(startNodeSired, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER); // Check for reverse BST\n return isStandardBST || isInverseBST;\n } else {\n // Iterative in-order traversal check\n const checkBST = (checkMax = false) => {\n const stack: BinaryTreeNode<K, V>[] = [];\n let prev = checkMax ? Number.MAX_SAFE_INTEGER : Number.MIN_SAFE_INTEGER;\n let curr: BinaryTreeNode<K, V> | null | undefined = startNodeSired;\n while (this.isRealNode(curr) || stack.length > 0) {\n while (this.isRealNode(curr)) {\n stack.push(curr);\n curr = curr.left;\n }\n curr = stack.pop()!;\n const numKey = Number(curr.key);\n if (!this.isRealNode(curr) || (!checkMax && prev >= numKey) || (checkMax && prev <= numKey)) return false;\n prev = numKey;\n curr = curr.right;\n }\n return true;\n };\n const isStandardBST = checkBST(false);\n const isInverseBST = checkBST(true);\n return isStandardBST || isInverseBST;\n }\n }\n\n /**\n * Gets the depth of a node (distance from `startNode`).\n * @remarks Time O(H), where H is the depth of the `dist` node relative to `startNode`. O(N) worst-case. Space O(1).\n *\n * @param dist - The node to find the depth of.\n * @param [startNode=this._root] - The node to measure depth from (defaults to root).\n * @returns The depth (0 if `dist` is `startNode`).\n */\n getDepth(\n dist: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root\n ): number {\n let distEnsured = this.ensureNode(dist);\n const beginRootEnsured = this.ensureNode(startNode);\n let depth = 0;\n while (distEnsured?.parent) {\n if (distEnsured === beginRootEnsured) {\n return depth;\n }\n depth++;\n distEnsured = distEnsured.parent;\n }\n return depth;\n }\n\n /**\n * Gets the maximum height of the tree (longest path from startNode to a leaf).\n * @remarks Time O(N), as it must visit every node. Space O(H) for recursive stack (O(N) worst-case) or O(N) for iterative stack (storing node + depth).\n *\n * @param [startNode=this._root] - The node to start measuring from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The height ( -1 for an empty tree, 0 for a single-node tree).\n */\n getHeight(\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): number {\n startNode = this.ensureNode(startNode);\n if (!this.isRealNode(startNode)) return -1;\n\n if (iterationType === 'RECURSIVE') {\n const _getMaxHeight = (cur: BinaryTreeNode<K, V> | null | undefined): number => {\n if (!this.isRealNode(cur)) return -1;\n const leftHeight = _getMaxHeight(cur.left);\n const rightHeight = _getMaxHeight(cur.right);\n return Math.max(leftHeight, rightHeight) + 1;\n };\n\n return _getMaxHeight(startNode);\n } else {\n // Iterative (using DFS)\n const stack: { node: BinaryTreeNode<K, V>; depth: number }[] = [{ node: startNode, depth: 0 }];\n let maxHeight = 0;\n\n while (stack.length > 0) {\n const { node, depth } = stack.pop()!;\n\n if (this.isRealNode(node.left)) stack.push({ node: node.left, depth: depth + 1 });\n if (this.isRealNode(node.right)) stack.push({ node: node.right, depth: depth + 1 });\n\n maxHeight = Math.max(maxHeight, depth);\n }\n\n return maxHeight;\n }\n }\n\n /**\n * Gets the minimum height of the tree (shortest path from startNode to a leaf).\n * @remarks Time O(N), as it must visit every node. Space O(H) for recursive stack (O(N) worst-case) or O(N) for iterative (due to `depths` Map).\n *\n * @param [startNode=this._root] - The node to start measuring from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The minimum height (-1 for empty, 0 for single node).\n */\n getMinHeight(\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): number {\n startNode = this.ensureNode(startNode);\n if (!startNode) return -1;\n\n if (iterationType === 'RECURSIVE') {\n const _getMinHeight = (cur: BinaryTreeNode<K, V> | null | undefined): number => {\n if (!this.isRealNode(cur)) return 0;\n if (!this.isRealNode(cur.left) && !this.isRealNode(cur.right)) return 0; // Leaf node\n const leftMinHeight = _getMinHeight(cur.left);\n const rightMinHeight = _getMinHeight(cur.right);\n return Math.min(leftMinHeight, rightMinHeight) + 1;\n };\n\n return _getMinHeight(startNode);\n } else {\n // Iterative (using post-order DFS)\n const stack: BinaryTreeNode<K, V>[] = [];\n let node: BinaryTreeNode<K, V> | null | undefined = startNode,\n last: BinaryTreeNode<K, V> | null | undefined = null;\n const depths: Map<BinaryTreeNode<K, V>, number> = new Map();\n\n while (stack.length > 0 || node) {\n if (this.isRealNode(node)) {\n stack.push(node);\n node = node.left;\n } else {\n node = stack[stack.length - 1];\n if (!this.isRealNode(node.right) || last === node.right) {\n node = stack.pop();\n if (this.isRealNode(node)) {\n const leftMinHeight = this.isRealNode(node.left) ? depths.get(node.left)! : -1;\n const rightMinHeight = this.isRealNode(node.right) ? depths.get(node.right)! : -1;\n depths.set(node, 1 + Math.min(leftMinHeight, rightMinHeight));\n last = node;\n node = null;\n }\n } else node = node.right;\n }\n }\n\n return depths.get(startNode)!;\n }\n }\n\n /**\n * Gets the path from a given node up to the root.\n * @remarks Time O(H), where H is the depth of the `beginNode`. O(N) worst-case. Space O(H) for the result array.\n *\n * @template C - The type of the callback function.\n * @param beginNode - The node to start the path from.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on each node in the path.\n * @param [isReverse=false] - If true, returns the path from root-to-node.\n * @returns An array of callback results.\n */\n getPathToRoot<C extends NodeCallback<BinaryTreeNode<K, V> | undefined>>(\n beginNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n isReverse = false\n ): ReturnType<C>[] {\n const result: ReturnType<C>[] = [];\n let beginNodeEnsured = this.ensureNode(beginNode);\n\n if (!beginNodeEnsured) return result;\n\n while (beginNodeEnsured.parent) {\n result.push(callback(beginNodeEnsured));\n beginNodeEnsured = beginNodeEnsured.parent;\n }\n result.push(callback(beginNodeEnsured)); // Add the root\n return isReverse ? result.reverse() : result;\n }\n\n /**\n * Finds the leftmost node in a subtree (the node with the smallest key in a BST).\n * @remarks Time O(H), where H is the height of the left spine. O(N) worst-case. Space O(H) for recursive/trampoline stack.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on the leftmost node.\n * @param [startNode=this._root] - The subtree root to search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The callback result for the leftmost node.\n */\n getLeftMost<C extends NodeCallback<BinaryTreeNode<K, V> | undefined>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C> {\n if (this.isNIL(startNode)) return callback(undefined);\n const ensuredStartNode = this.ensureNode(startNode);\n\n if (!this.isRealNode(ensuredStartNode)) return callback(undefined);\n if (iterationType === 'RECURSIVE') {\n const dfs = (cur: BinaryTreeNode<K, V>): BinaryTreeNode<K, V> => {\n const { left } = cur;\n if (!this.isRealNode(left)) return cur;\n return dfs(left);\n };\n\n return callback(dfs(ensuredStartNode));\n } else {\n // Iterative (trampolined to prevent stack overflow, though 'ITERATIVE' usually means a loop)\n const dfs = makeTrampoline((cur: BinaryTreeNode<K, V>): Trampoline<BinaryTreeNode<K, V>> => {\n const { left } = cur;\n if (!this.isRealNode(left)) return cur;\n return makeTrampolineThunk(() => dfs(left));\n });\n\n return callback(dfs(ensuredStartNode));\n }\n }\n\n /**\n * Finds the rightmost node in a subtree (the node with the largest key in a BST).\n * @remarks Time O(H), where H is the height of the right spine. O(N) worst-case. Space O(H) for recursive/trampoline stack.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on the rightmost node.\n * @param [startNode=this._root] - The subtree root to search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The callback result for the rightmost node.\n */\n getRightMost<C extends NodeCallback<BinaryTreeNode<K, V> | undefined>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C> {\n if (this.isNIL(startNode)) return callback(undefined);\n startNode = this.ensureNode(startNode);\n if (!startNode) return callback(undefined);\n\n if (iterationType === 'RECURSIVE') {\n const dfs = (cur: BinaryTreeNode<K, V>): BinaryTreeNode<K, V> => {\n const { right } = cur;\n if (!this.isRealNode(right)) return cur;\n return dfs(right);\n };\n\n return callback(dfs(startNode));\n } else {\n const dfs = makeTrampoline((cur: BinaryTreeNode<K, V>): Trampoline<BinaryTreeNode<K, V>> => {\n const { right } = cur;\n if (!this.isRealNode(right)) return cur;\n return makeTrampolineThunk(() => dfs(right));\n });\n\n return callback(dfs(startNode));\n }\n }\n\n /**\n * Gets the Morris traversal predecessor (rightmost node in the left subtree, or node itself).\n * @remarks This is primarily a helper for Morris traversal. Time O(H), where H is the height of the left subtree. O(N) worst-case. Space O(1).\n *\n * @param node - The node to find the predecessor for.\n * @returns The Morris predecessor.\n */\n getPredecessor(node: BinaryTreeNode<K, V>): BinaryTreeNode<K, V> {\n if (this.isRealNode(node.left)) {\n let predecessor: BinaryTreeNode<K, V> | null | undefined = node.left;\n while (!this.isRealNode(predecessor) || (this.isRealNode(predecessor.right) && predecessor.right !== node)) {\n if (this.isRealNode(predecessor)) {\n predecessor = predecessor.right;\n }\n }\n return predecessor;\n } else {\n return node;\n }\n }\n\n /**\n * Gets the in-order successor of a node in a BST.\n * @remarks Time O(H), where H is the tree height. O(N) worst-case. Space O(H) (due to `getLeftMost` stack).\n *\n * @param [x] - The node to find the successor of.\n * @returns The successor node, or null/undefined if none exists.\n */\n getSuccessor(x?: K | BinaryTreeNode<K, V> | null): BinaryTreeNode<K, V> | null | undefined {\n x = this.ensureNode(x);\n if (!this.isRealNode(x)) return undefined;\n\n if (this.isRealNode(x.right)) {\n return this.getLeftMost(node => node, x.right);\n }\n\n let y: BinaryTreeNode<K, V> | null | undefined = x.parent;\n while (this.isRealNode(y) && x === y.right) {\n x = y;\n y = y.parent;\n }\n return y;\n }\n\n dfs<C extends NodeCallback<BinaryTreeNode<K, V>>>(\n callback?: C,\n pattern?: DFSOrderPattern,\n onlyOne?: boolean,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType\n ): ReturnType<C>[];\n\n dfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback?: C,\n pattern?: DFSOrderPattern,\n onlyOne?: boolean,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: boolean\n ): ReturnType<C>[];\n\n /**\n * Performs a Depth-First Search (DFS) traversal.\n * @remarks Time O(N), visits every node. Space O(H) for the call/explicit stack. O(N) worst-case.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [pattern='IN'] - The traversal order ('IN', 'PRE', 'POST').\n * @param [onlyOne=false] - If true, stops after the first callback.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @param [includeNull=false] - If true, includes null nodes in the traversal.\n * @returns An array of callback results.\n */\n dfs<C extends NodeCallback<BinaryTreeNode<K, V> | undefined>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n pattern: DFSOrderPattern = 'IN',\n onlyOne: boolean = false,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType,\n includeNull = false\n ): ReturnType<C>[] {\n startNode = this.ensureNode(startNode);\n if (!startNode) return [];\n return this._dfs(callback, pattern, onlyOne, startNode, iterationType, includeNull);\n }\n\n bfs<C extends NodeCallback<BinaryTreeNode<K, V>>>(\n callback?: C,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: false\n ): ReturnType<C>[];\n\n bfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback?: C,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: true\n ): ReturnType<C>[];\n\n /**\n * Performs a Breadth-First Search (BFS) or Level-Order traversal.\n * @remarks Time O(N), visits every node. Space O(N) in the worst case for the queue (e.g., a full last level).\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method ('RECURSIVE' BFS is less common but supported here).\n * @param [includeNull=false] - If true, includes null nodes in the traversal.\n * @returns An array of callback results.\n */\n bfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType,\n includeNull = false\n ): ReturnType<C>[] {\n startNode = this.ensureNode(startNode);\n if (!startNode) return [];\n\n const ans: ReturnType<NodeCallback<BinaryTreeNode<K, V> | null>>[] = [];\n\n if (iterationType === 'RECURSIVE') {\n // This is a \"recursive\" BFS, which is atypical. It uses a queue but calls itself.\n const queue: Queue<OptNodeOrNull<BinaryTreeNode<K, V>>> = new Queue<OptNodeOrNull<BinaryTreeNode<K, V>>>([\n startNode\n ]);\n\n const dfs = (level: number) => {\n if (queue.length === 0) return;\n\n const current = queue.shift()!;\n ans.push(callback(current));\n\n if (includeNull) {\n if (current && this.isRealNodeOrNull(current.left)) queue.push(current.left);\n if (current && this.isRealNodeOrNull(current.right)) queue.push(current.right);\n } else {\n if (this.isRealNode(current.left)) queue.push(current.left);\n if (this.isRealNode(current.right)) queue.push(current.right);\n }\n\n dfs(level + 1);\n };\n\n dfs(0);\n } else {\n // Standard iterative BFS\n const queue = new Queue<OptNodeOrNull<BinaryTreeNode<K, V>>>([startNode]);\n while (queue.length > 0) {\n const levelSize = queue.length; // Not strictly needed here, but good for level-by-level\n for (let i = 0; i < levelSize; i++) {\n const current = queue.shift()!;\n ans.push(callback(current));\n\n if (includeNull) {\n if (current && this.isRealNodeOrNull(current.left)) queue.push(current.left);\n if (current && this.isRealNodeOrNull(current.right)) queue.push(current.right);\n } else {\n if (this.isRealNode(current.left)) queue.push(current.left);\n if (this.isRealNode(current.right)) queue.push(current.right);\n }\n }\n }\n }\n return ans;\n }\n\n /**\n * Finds all leaf nodes in the tree.\n * @remarks Time O(N), visits every node. Space O(H) for recursive stack or O(N) for iterative queue.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each leaf node.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of callback results.\n */\n leaves<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n startNode = this.ensureNode(startNode);\n const leaves: ReturnType<NodeCallback<BinaryTreeNode<K, V> | null>>[] = [];\n\n if (!this.isRealNode(startNode)) return [];\n\n if (iterationType === 'RECURSIVE') {\n // DFS-based\n const dfs = (cur: BinaryTreeNode<K, V>) => {\n if (this.isLeaf(cur)) {\n leaves.push(callback(cur));\n }\n if (!this.isRealNode(cur.left) && !this.isRealNode(cur.right)) return;\n if (this.isRealNode(cur.left)) dfs(cur.left);\n if (this.isRealNode(cur.right)) dfs(cur.right);\n };\n\n dfs(startNode);\n } else {\n // BFS-based\n const queue = new Queue([startNode]);\n\n while (queue.length > 0) {\n const cur = queue.shift();\n if (this.isRealNode(cur)) {\n if (this.isLeaf(cur)) {\n leaves.push(callback(cur));\n }\n if (this.isRealNode(cur.left)) queue.push(cur.left);\n if (this.isRealNode(cur.right)) queue.push(cur.right);\n }\n }\n }\n\n return leaves;\n }\n\n listLevels<C extends NodeCallback<BinaryTreeNode<K, V>>>(\n callback?: C,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: false\n ): ReturnType<C>[][];\n\n listLevels<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback?: C,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: true\n ): ReturnType<C>[][];\n\n /**\n * Returns a 2D array of nodes, grouped by level.\n * @remarks Time O(N), visits every node. Space O(N) for the result array and the queue/stack.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @param [includeNull=false] - If true, includes null nodes.\n * @returns A 2D array of callback results.\n */\n listLevels<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType,\n includeNull = false\n ): ReturnType<C>[][] {\n startNode = this.ensureNode(startNode);\n const levelsNodes: ReturnType<C>[][] = [];\n\n if (!startNode) return levelsNodes;\n\n if (iterationType === 'RECURSIVE') {\n // Pre-order DFS based level listing\n const _recursive = (node: BinaryTreeNode<K, V> | null, level: number) => {\n if (!levelsNodes[level]) levelsNodes[level] = [];\n levelsNodes[level].push(callback(node));\n if (includeNull) {\n if (node && this.isRealNodeOrNull(node.left)) _recursive(node.left, level + 1);\n if (node && this.isRealNodeOrNull(node.right)) _recursive(node.right, level + 1);\n } else {\n if (node && node.left) _recursive(node.left, level + 1);\n if (node && node.right) _recursive(node.right, level + 1);\n }\n };\n\n _recursive(startNode, 0);\n } else {\n // Iterative DFS based level listing\n const stack: [BinaryTreeNode<K, V> | null, number][] = [[startNode, 0]];\n\n while (stack.length > 0) {\n const head = stack.pop()!;\n const [node, level] = head;\n\n if (!levelsNodes[level]) levelsNodes[level] = [];\n levelsNodes[level].push(callback(node));\n\n if (includeNull) {\n if (node && this.isRealNodeOrNull(node.right)) stack.push([node.right, level + 1]);\n if (node && this.isRealNodeOrNull(node.left)) stack.push([node.left, level + 1]);\n } else {\n if (node && node.right) stack.push([node.right, level + 1]);\n if (node && node.left) stack.push([node.left, level + 1]);\n }\n }\n }\n\n return levelsNodes;\n }\n\n morris<C extends NodeCallback<BinaryTreeNode<K, V>>>(\n callback?: C,\n pattern?: DFSOrderPattern,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): ReturnType<C>[];\n\n /**\n * Performs a Morris (threaded) traversal.\n * @remarks This traversal uses O(1) extra space (excluding the result array) by temporarily modifying the tree's right child pointers. Time O(N), as each node is visited a constant number of times. Space O(1) (excluding the `ans` array).\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [pattern='IN'] - The traversal order ('IN', 'PRE', 'POST').\n * @param [startNode=this._root] - The node to start from.\n * @returns An array of callback results.\n */\n morris<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n pattern: DFSOrderPattern = 'IN',\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root\n ): ReturnType<C>[] {\n startNode = this.ensureNode(startNode);\n\n if (!startNode) return [];\n const ans: ReturnType<NodeCallback<BinaryTreeNode<K, V> | null>>[] = [];\n\n let cur: BinaryTreeNode<K, V> | null | undefined = startNode;\n\n // Helper to reverse a linked list (formed by right pointers)\n const _reverseEdge = (node: BinaryTreeNode<K, V> | null | undefined) => {\n let pre: BinaryTreeNode<K, V> | null | undefined = null;\n let next: BinaryTreeNode<K, V> | null | undefined = null;\n while (node) {\n next = node.right;\n node.right = pre;\n pre = node;\n node = next;\n }\n return pre;\n };\n\n // Helper to print the reversed edge (for post-order)\n const _printEdge = (node: BinaryTreeNode<K, V> | null | undefined) => {\n const tail: BinaryTreeNode<K, V> | null | undefined = _reverseEdge(node);\n let cur: BinaryTreeNode<K, V> | null | undefined = tail;\n\n while (cur) {\n ans.push(callback(cur));\n cur = cur.right;\n }\n\n _reverseEdge(tail); // Restore the edge\n };\n\n switch (pattern) {\n case 'IN':\n while (cur) {\n if (cur.left) {\n const predecessor = this.getPredecessor(cur);\n if (!predecessor.right) {\n // Create thread\n predecessor.right = cur;\n cur = cur.left;\n continue;\n } else {\n // Remove thread\n predecessor.right = null;\n }\n }\n ans.push(callback(cur));\n cur = cur.right;\n }\n break;\n case 'PRE':\n while (cur) {\n if (cur.left) {\n const predecessor = this.getPredecessor(cur);\n if (!predecessor.right) {\n // Create thread and visit\n predecessor.right = cur;\n ans.push(callback(cur));\n cur = cur.left;\n continue;\n } else {\n // Remove thread\n predecessor.right = null;\n }\n } else {\n ans.push(callback(cur));\n }\n cur = cur.right;\n }\n break;\n case 'POST':\n while (cur) {\n if (cur.left) {\n const predecessor = this.getPredecessor(cur);\n if (predecessor.right === null) {\n // Create thread\n predecessor.right = cur;\n cur = cur.left;\n continue;\n } else {\n // Remove thread and print right spine of left child\n predecessor.right = null;\n _printEdge(cur.left);\n }\n }\n cur = cur.right;\n }\n _printEdge(startNode); // Print the right spine of the root\n break;\n }\n return ans;\n }\n\n /**\n * Clones the tree.\n * @remarks Time O(N * M), where N is the number of nodes and M is the tree size during insertion (due to `bfs` + `add`, and `add` is O(M)). Space O(N) for the new tree and the BFS queue.\n *\n * @returns A new, cloned instance of the tree.\n */\n clone(): this {\n const out = this._createInstance<K, V, R>();\n this._clone(out);\n return out;\n }\n\n /**\n * Creates a new tree containing only the entries that satisfy the predicate.\n * @remarks Time O(N * M), where N is nodes in this tree, and M is size of the new tree during insertion (O(N) iteration + O(M) `add` for each item). Space O(N) for the new tree.\n *\n * @param predicate - A function to test each [key, value] pair.\n * @param [thisArg] - `this` context for the predicate.\n * @returns A new, filtered tree.\n */\n filter(predicate: EntryCallback<K, V | undefined, boolean>, thisArg?: unknown): this {\n const out = this._createInstance<K, V, R>();\n let i = 0;\n for (const [k, v] of this) if (predicate.call(thisArg, k, v, i++, this)) out.add([k, v]);\n return out;\n }\n\n /**\n * Creates a new tree by mapping each [key, value] pair to a new entry.\n * @remarks Time O(N * M), where N is nodes in this tree, and M is size of the new tree during insertion. Space O(N) for the new tree.\n *\n * @template MK - New key type.\n * @template MV - New value type.\n * @template MR - New raw type.\n * @param cb - A function to map each [key, value] pair.\n * @param [options] - Options for the new tree.\n * @param [thisArg] - `this` context for the callback.\n * @returns A new, mapped tree.\n */\n map<MK = K, MV = V, MR = any>(\n cb: EntryCallback<K, V | undefined, [MK, MV]>,\n options?: Partial<BinaryTreeOptions<MK, MV, MR>>,\n thisArg?: unknown\n ): BinaryTree<MK, MV, MR> {\n const out = this._createLike<MK, MV, MR>([], options);\n let i = 0;\n for (const [k, v] of this) out.add(cb.call(thisArg, k, v, i++, this));\n return out;\n }\n\n /**\n * Generates a string representation of the tree for visualization.\n * @remarks Time O(N), visits every node. Space O(N*H) or O(N^2) in the worst case, as the string width can grow significantly.\n *\n * @param [startNode=this._root] - The node to start printing from.\n * @param [options] - Options to control the output (e.g., show nulls).\n * @returns The string representation of the tree.\n */\n override toVisual(\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n options?: BinaryTreePrintOptions\n ): string {\n const opts = { isShowUndefined: false, isShowNull: true, isShowRedBlackNIL: false, ...options };\n startNode = this.ensureNode(startNode);\n let output = '';\n if (!startNode) return output;\n\n if (opts.isShowUndefined) output += `U for undefined\\n`;\n if (opts.isShowNull) output += `N for null\\n`;\n if (opts.isShowRedBlackNIL) output += `S for Sentinel Node(NIL)\\n`;\n\n const display = (root: BinaryTreeNode<K, V> | null | undefined): void => {\n const [lines] = this._displayAux(root, opts);\n let paragraph = '';\n for (const line of lines) {\n paragraph += line + '\\n';\n }\n output += paragraph;\n };\n\n display(startNode);\n return output;\n }\n\n /**\n * Prints a visual representation of the tree to the console.\n * @remarks Time O(N) (via `toVisual`). Space O(N*H) or O(N^2) (via `toVisual`).\n *\n * @param [options] - Options to control the output.\n * @param [startNode=this._root] - The node to start printing from.\n */\n override print(\n options?: BinaryTreePrintOptions,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root\n ) {\n console.log(this.toVisual(startNode, options));\n }\n\n protected _dfs<C extends NodeCallback<BinaryTreeNode<K, V>>>(\n callback: C,\n pattern?: DFSOrderPattern,\n onlyOne?: boolean,\n startNode?: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType?: IterationType,\n includeNull?: boolean,\n shouldVisitLeft?: (node: BinaryTreeNode<K, V> | null | undefined) => boolean,\n shouldVisitRight?: (node: BinaryTreeNode<K, V> | null | undefined) => boolean,\n shouldVisitRoot?: (node: BinaryTreeNode<K, V> | null | undefined) => boolean,\n shouldProcessRoot?: (node: BinaryTreeNode<K, V> | null | undefined) => boolean\n ): ReturnType<C>[];\n\n /**\n * (Protected) Core DFS implementation.\n * @remarks Time O(N), visits every node satisfying predicates. Space O(H) for call/explicit stack. O(N) worst-case.\n *\n * @template C - Callback type.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on nodes.\n * @param [pattern='IN'] - Traversal order.\n * @param [onlyOne=false] - Stop after first match.\n * @param [startNode=this._root] - Starting node.\n * @param [iterationType=this.iterationType] - Traversal method.\n * @param [includeNull=false] - Include nulls.\n * @param [shouldVisitLeft] - Predicate to traverse left.\n * @param [shouldVisitRight] - Predicate to traverse right.\n * @param [shouldVisitRoot] - Predicate to visit root.\n * @param [shouldProcessRoot] - Predicate to process root.\n * @returns Array of callback results.\n */\n protected _dfs<C extends NodeCallback<BinaryTreeNode<K, V> | null>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n pattern: DFSOrderPattern = 'IN',\n onlyOne: boolean = false,\n startNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType,\n includeNull = false,\n shouldVisitLeft: (node: BinaryTreeNode<K, V> | null | undefined) => boolean = node => !!node,\n shouldVisitRight: (node: BinaryTreeNode<K, V> | null | undefined) => boolean = node => !!node,\n shouldVisitRoot: (node: BinaryTreeNode<K, V> | null | undefined) => boolean = node => {\n if (includeNull) return this.isRealNodeOrNull(node);\n return this.isRealNode(node);\n },\n shouldProcessRoot: (node: BinaryTreeNode<K, V> | null | undefined) => boolean = node => this.isRealNodeOrNull(node)\n ): ReturnType<C>[] {\n startNode = this.ensureNode(startNode);\n if (!startNode) return [];\n const ans: ReturnType<C>[] = [];\n\n if (iterationType === 'RECURSIVE') {\n const dfs = (node: BinaryTreeNode<K, V> | null) => {\n if (!shouldVisitRoot(node)) return;\n\n const visitLeft = () => {\n if (shouldVisitLeft(node) && node?.left !== undefined) dfs(node?.left);\n };\n const visitRight = () => {\n if (shouldVisitRight(node) && node?.right !== undefined) dfs(node?.right);\n };\n\n switch (pattern) {\n case 'IN':\n visitLeft();\n if (shouldProcessRoot(node)) {\n ans.push(callback(node));\n if (onlyOne) return;\n }\n visitRight();\n break;\n case 'PRE':\n if (shouldProcessRoot(node)) {\n ans.push(callback(node));\n if (onlyOne) return;\n }\n visitLeft();\n visitRight();\n break;\n case 'POST':\n visitLeft();\n visitRight();\n if (shouldProcessRoot(node)) {\n ans.push(callback(node));\n if (onlyOne) return;\n }\n break;\n }\n };\n\n dfs(startNode);\n } else {\n // Iterative\n const stack: DFSStackItem<BinaryTreeNode<K, V>>[] = [{ opt: DFSOperation.VISIT, node: startNode }];\n\n const pushLeft = (cur: DFSStackItem<BinaryTreeNode<K, V>>) => {\n if (shouldVisitLeft(cur.node)) stack.push({ opt: DFSOperation.VISIT, node: cur.node?.left });\n };\n const pushRight = (cur: DFSStackItem<BinaryTreeNode<K, V>>) => {\n if (shouldVisitRight(cur.node)) stack.push({ opt: DFSOperation.VISIT, node: cur.node?.right });\n };\n const pushRoot = (cur: DFSStackItem<BinaryTreeNode<K, V>>) => {\n if (shouldVisitRoot(cur.node)) stack.push({ opt: DFSOperation.PROCESS, node: cur.node });\n };\n\n while (stack.length > 0) {\n const cur = stack.pop();\n if (cur === undefined) continue;\n if (!shouldVisitRoot(cur.node)) continue;\n if (cur.opt === DFSOperation.PROCESS) {\n if (shouldProcessRoot(cur.node) && cur.node !== undefined) {\n ans.push(callback(cur.node));\n if (onlyOne) return ans;\n }\n } else {\n // VISIT\n switch (pattern) {\n case 'IN':\n pushRight(cur);\n pushRoot(cur);\n pushLeft(cur);\n break;\n case 'PRE':\n pushRight(cur);\n pushLeft(cur);\n pushRoot(cur);\n break;\n case 'POST':\n pushRoot(cur);\n pushRight(cur);\n pushLeft(cur);\n break;\n }\n }\n }\n }\n\n return ans;\n }\n\n /**\n * (Protected) Gets the iterator for the tree (default in-order).\n * @remarks Time O(N) for full iteration. O(H) to get the first element. Space O(H) for the iterative stack. O(H) for recursive stack.\n *\n * @param [node=this._root] - The node to start iteration from.\n * @returns An iterator for [key, value] pairs.\n */\n protected *_getIterator(node = this._root): IterableIterator<[K, V | undefined]> {\n if (!node) return;\n\n if (this.iterationType === 'ITERATIVE') {\n const stack: (BinaryTreeNode<K, V> | null | undefined)[] = [];\n let current: BinaryTreeNode<K, V> | null | undefined = node;\n\n while (current || stack.length > 0) {\n // Go to the leftmost node\n while (this.isRealNode(current)) {\n stack.push(current);\n current = current.left;\n }\n\n // Visit the node\n current = stack.pop();\n\n if (this.isRealNode(current)) {\n if (this._isMapMode) yield [current.key, this._store.get(current.key)];\n else yield [current.key, current.value];\n // Move to the right subtree\n current = current.right;\n }\n }\n } else {\n // Recursive in-order traversal\n if (node.left && this.isRealNode(node)) {\n yield* this[Symbol.iterator](node.left);\n }\n\n if (this._isMapMode) yield [node.key, this._store.get(node.key)];\n else yield [node.key, node.value];\n\n if (node.right && this.isRealNode(node)) {\n yield* this[Symbol.iterator](node.right);\n }\n }\n }\n\n /**\n * (Protected) Default callback function, returns the node's key.\n * @remarks Time O(1)\n *\n * @param node - The node.\n * @returns The node's key or undefined.\n */\n protected _DEFAULT_NODE_CALLBACK = (node: BinaryTreeNode<K, V> | null | undefined) => (node ? node.key : undefined);\n\n /**\n * (Protected) Snapshots the current tree's configuration options.\n * @remarks Time O(1)\n *\n * @template TK, TV, TR - Generic types for the options.\n * @returns The options object.\n */\n protected _snapshotOptions<TK = K, TV = V, TR = R>(): BinaryTreeOptions<TK, TV, TR> {\n return {\n iterationType: this.iterationType,\n toEntryFn: this.toEntryFn as unknown as BinaryTreeOptions<TK, TV, TR>['toEntryFn'],\n isMapMode: this.isMapMode,\n isDuplicate: this.isDuplicate\n };\n }\n\n /**\n * (Protected) Creates a new, empty instance of the same tree constructor.\n * @remarks Time O(1)\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [options] - Options for the new tree.\n * @returns A new, empty tree.\n */\n protected _createInstance<TK = K, TV = V, TR = R>(options?: Partial<BinaryTreeOptions<TK, TV, TR>>): this {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BinaryTreeNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BinaryTreeOptions<TK, TV, TR>\n ) => BinaryTree<TK, TV, TR>;\n return new Ctor([], { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) }) as unknown as this;\n }\n\n /**\n * (Protected) Creates a new instance of the same tree constructor, potentially with different generic types.\n * @remarks Time O(N) (or as per constructor) due to processing the iterable.\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [iter=[]] - An iterable to populate the new tree.\n * @param [options] - Options for the new tree.\n * @returns A new tree.\n */\n protected _createLike<TK = K, TV = V, TR = R>(\n iter: Iterable<TK | BinaryTreeNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR> = [],\n options?: Partial<BinaryTreeOptions<TK, TV, TR>>\n ): BinaryTree<TK, TV, TR> {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BinaryTreeNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BinaryTreeOptions<TK, TV, TR>\n ) => BinaryTree<TK, TV, TR>;\n return new Ctor(iter, { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) }) as unknown as BinaryTree<\n TK,\n TV,\n TR\n >;\n }\n\n /**\n * (Protected) Converts a key, node, or entry into a standardized [node, value] tuple.\n * @remarks Time O(1)\n *\n * @param keyNodeOrEntry - The input item.\n * @param [value] - An optional value (used if input is just a key).\n * @returns A tuple of [node, value].\n */\n protected _keyValueNodeOrEntryToNodeAndValue(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n value?: V\n ): [BinaryTreeNode<K, V> | null | undefined, V | undefined] {\n if (keyNodeOrEntry === undefined) return [undefined, undefined];\n if (keyNodeOrEntry === null) return [null, undefined];\n\n if (this.isNode(keyNodeOrEntry)) return [keyNodeOrEntry, value];\n\n if (this.isEntry(keyNodeOrEntry)) {\n const [key, entryValue] = keyNodeOrEntry;\n if (key === undefined) return [undefined, undefined];\n else if (key === null) return [null, undefined];\n const finalValue = value ?? entryValue;\n return [this.createNode(key, finalValue), finalValue];\n }\n\n return [this.createNode(keyNodeOrEntry, value), value];\n }\n\n /**\n * (Protected) Helper for cloning. Performs a BFS and adds all nodes to the new tree.\n * @remarks Time O(N * M) (O(N) BFS + O(M) `add` for each node).\n *\n * @param cloned - The new, empty tree instance to populate.\n */\n protected _clone(cloned: BinaryTree<K, V, R>) {\n // Use BFS with nulls to preserve the tree structure\n this.bfs(\n node => {\n if (node === null) cloned.add(null);\n else {\n if (this._isMapMode) cloned.add([node.key, this._store.get(node.key)]);\n else cloned.add([node.key, node.value]);\n }\n },\n this._root,\n this.iterationType,\n true // Include nulls\n );\n if (this._isMapMode) cloned._store = this._store;\n }\n\n /**\n * (Protected) Recursive helper for `toVisual`.\n * @remarks Time O(N), Space O(N*H) or O(N^2)\n *\n * @param node - The current node.\n * @param options - Print options.\n * @returns Layout information for this subtree.\n */\n protected _displayAux(\n node: BinaryTreeNode<K, V> | null | undefined,\n options: BinaryTreePrintOptions\n ): NodeDisplayLayout {\n const { isShowNull, isShowUndefined, isShowRedBlackNIL } = options;\n const emptyDisplayLayout = <NodeDisplayLayout>[['─'], 1, 0, 0]; // Represents an empty spot\n\n if (node === null && !isShowNull) {\n return emptyDisplayLayout;\n } else if (node === undefined && !isShowUndefined) {\n return emptyDisplayLayout;\n } else if (this.isNIL(node) && !isShowRedBlackNIL) {\n return emptyDisplayLayout;\n } else if (node !== null && node !== undefined) {\n // Real node\n const key = node.key,\n line = this.isNIL(node) ? 'S' : String(key),\n width = line.length;\n\n return _buildNodeDisplay(\n line,\n width,\n this._displayAux(node.left, options),\n this._displayAux(node.right, options)\n );\n } else {\n // Null or Undefined\n const line = node === undefined ? 'U' : 'N',\n width = line.length;\n\n // Treat as a leaf\n return _buildNodeDisplay(line, width, [[''], 1, 0, 0], [[''], 1, 0, 0]);\n }\n\n /**\n * (Inner) Builds the display lines for a node.\n * @remarks Time/Space: Proportional to the width and height of the subtrees.\n */\n function _buildNodeDisplay(line: string, width: number, left: NodeDisplayLayout, right: NodeDisplayLayout) {\n const [leftLines, leftWidth, leftHeight, leftMiddle] = left;\n const [rightLines, rightWidth, rightHeight, rightMiddle] = right;\n const firstLine =\n ' '.repeat(Math.max(0, leftMiddle + 1)) +\n '_'.repeat(Math.max(0, leftWidth - leftMiddle - 1)) +\n line +\n '_'.repeat(Math.max(0, rightMiddle)) +\n ' '.repeat(Math.max(0, rightWidth - rightMiddle));\n\n const secondLine =\n (leftHeight > 0\n ? ' '.repeat(leftMiddle) + '/' + ' '.repeat(leftWidth - leftMiddle - 1)\n : ' '.repeat(leftWidth)) +\n ' '.repeat(width) +\n (rightHeight > 0\n ? ' '.repeat(rightMiddle) + '\\\\' + ' '.repeat(rightWidth - rightMiddle - 1)\n : ' '.repeat(rightWidth));\n\n const mergedLines = [firstLine, secondLine];\n\n for (let i = 0; i < Math.max(leftHeight, rightHeight); i++) {\n const leftLine = i < leftHeight ? leftLines[i] : ' '.repeat(leftWidth);\n const rightLine = i < rightHeight ? rightLines[i] : ' '.repeat(rightWidth);\n mergedLines.push(leftLine + ' '.repeat(width) + rightLine);\n }\n\n return <NodeDisplayLayout>[\n mergedLines,\n leftWidth + width + rightWidth,\n Math.max(leftHeight, rightHeight) + 2,\n leftWidth + Math.floor(width / 2)\n ];\n }\n }\n\n /**\n * (Protected) Swaps the key/value properties of two nodes.\n * @remarks Time O(1)\n *\n * @param srcNode - The source node.\n * @param destNode - The destination node.\n * @returns The `destNode` (now holding `srcNode`'s properties).\n */\n protected _swapProperties(\n srcNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n destNode: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): BinaryTreeNode<K, V> | undefined {\n srcNode = this.ensureNode(srcNode);\n destNode = this.ensureNode(destNode);\n\n if (srcNode && destNode) {\n const { key, value } = destNode;\n const tempNode = this.createNode(key, value); // Use a temp node to hold dest properties\n\n if (tempNode) {\n // Copy src to dest\n destNode.key = srcNode.key;\n if (!this._isMapMode) destNode.value = srcNode.value;\n\n // Copy temp (original dest) to src\n srcNode.key = tempNode.key;\n if (!this._isMapMode) srcNode.value = tempNode.value;\n }\n\n return destNode;\n }\n return undefined;\n }\n\n /**\n * (Protected) Replaces a node in the tree with a new node, maintaining children and parent links.\n * @remarks Time O(1)\n *\n * @param oldNode - The node to be replaced.\n * @param newNode - The node to insert.\n * @returns The `newNode`.\n */\n protected _replaceNode(oldNode: BinaryTreeNode<K, V>, newNode: BinaryTreeNode<K, V>): BinaryTreeNode<K, V> {\n if (oldNode.parent) {\n if (oldNode.parent.left === oldNode) {\n oldNode.parent.left = newNode;\n } else if (oldNode.parent.right === oldNode) {\n oldNode.parent.right = newNode;\n }\n }\n newNode.left = oldNode.left;\n newNode.right = oldNode.right;\n newNode.parent = oldNode.parent;\n if (this._root === oldNode) {\n this._setRoot(newNode);\n }\n\n return newNode;\n }\n\n /**\n * (Protected) Sets the root node and clears its parent reference.\n * @remarks Time O(1)\n *\n * @param v - The node to set as root.\n */\n protected _setRoot(v: BinaryTreeNode<K, V> | null | undefined) {\n if (v) {\n v.parent = undefined;\n }\n this._root = v;\n }\n\n /**\n * (Protected) Converts a key, node, entry, or predicate into a standardized predicate function.\n * @remarks Time O(1)\n *\n * @param keyNodeEntryOrPredicate - The item to convert.\n * @returns A predicate function.\n */\n protected _ensurePredicate(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V>>\n ): NodePredicate<BinaryTreeNode<K, V>>;\n\n protected _ensurePredicate(\n keyNodeEntryOrPredicate:\n | K\n | BinaryTreeNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BinaryTreeNode<K, V> | null>\n ): NodePredicate<BinaryTreeNode<K, V> | null> {\n if (keyNodeEntryOrPredicate === null || keyNodeEntryOrPredicate === undefined)\n return (node: BinaryTreeNode<K, V> | null | undefined) => (node ? false : false);\n\n if (this._isPredicate(keyNodeEntryOrPredicate)) return keyNodeEntryOrPredicate;\n\n if (this.isRealNode(keyNodeEntryOrPredicate))\n return (node: BinaryTreeNode<K, V> | null) => node === keyNodeEntryOrPredicate;\n\n if (this.isEntry(keyNodeEntryOrPredicate)) {\n const [key] = keyNodeEntryOrPredicate;\n return (node: BinaryTreeNode<K, V> | null) => {\n if (!node) return false;\n return node.key === key;\n };\n }\n\n // Assume it's a key\n return (node: BinaryTreeNode<K, V> | null) => {\n if (!node) return false;\n return node.key === keyNodeEntryOrPredicate;\n };\n }\n\n /**\n * (Protected) Checks if an item is a predicate function.\n * @remarks Time O(1)\n *\n * @param p - The item to check.\n * @returns True if it's a function.\n */\n protected _isPredicate(p: any): p is NodePredicate<BinaryTreeNode<K, V>> {\n return typeof p === 'function';\n }\n\n /**\n * (Protected) Extracts the key from a key, node, or entry.\n * @remarks Time O(1)\n *\n * @param keyNodeOrEntry - The item.\n * @returns The extracted key.\n */\n protected _extractKey(\n keyNodeOrEntry: K | BinaryTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): K | null | undefined {\n if (keyNodeOrEntry === null) return null;\n if (keyNodeOrEntry === undefined) return;\n if (keyNodeOrEntry === this._NIL) return;\n if (this.isNode(keyNodeOrEntry)) return keyNodeOrEntry.key;\n\n if (this.isEntry(keyNodeOrEntry)) return keyNodeOrEntry[0];\n\n return keyNodeOrEntry;\n }\n\n /**\n * (Protected) Sets a value in the external store (Map mode).\n * @remarks Time O(1) (average for Map.set).\n *\n * @param key - The key.\n * @param value - The value.\n * @returns True if successful.\n */\n protected _setValue(key: K | null | undefined, value: V | undefined) {\n if (key === null || key === undefined) return false;\n if (value === undefined) return false; // Or allow setting undefined?\n return this._store.set(key, value);\n }\n\n /**\n * (Protected) Clears all nodes from the tree.\n * @remarks Time O(1)\n */\n protected _clearNodes() {\n this._setRoot(undefined);\n this._size = 0;\n }\n\n /**\n * (Protected) Clears all values from the external store.\n * @remarks Time O(N)\n */\n protected _clearValues() {\n this._store.clear();\n }\n}\n","/**\n * data-structure-typed\n *\n * @author Pablo Zeng\n * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>\n * @license MIT License\n */\n\nimport type {\n BinaryTreeOptions,\n BSTNOptKeyOrNode,\n BSTOptions,\n BTNRep,\n Comparable,\n Comparator,\n CP,\n DFSOrderPattern,\n EntryCallback,\n IterationType,\n NodeCallback,\n NodePredicate,\n OptNode\n} from '../../types';\nimport { BinaryTree, BinaryTreeNode } from './binary-tree';\nimport { IBinaryTree } from '../../interfaces';\nimport { Queue } from '../queue';\nimport { isComparable } from '../../utils';\nimport { Range } from '../../common';\n\n/**\n * Represents a Node in a Binary Search Tree.\n *\n * @template K - The type of the key.\n * @template V - The type of the value.\n */\nexport class BSTNode<K = any, V = any> extends BinaryTreeNode<K, V> {\n override parent?: BSTNode<K, V> = undefined;\n\n /**\n * Creates an instance of BSTNode.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key of the node.\n * @param [value] - The value associated with the key.\n */\n constructor(key: K, value?: V) {\n super(key, value);\n }\n\n override _left?: BSTNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the left child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The left child.\n */\n override get left(): BSTNode<K, V> | null | undefined {\n return this._left;\n }\n\n /**\n * Sets the left child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the left child.\n */\n override set left(v: BSTNode<K, V> | null | undefined) {\n if (v) v.parent = this;\n this._left = v;\n }\n\n override _right?: BSTNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the right child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The right child.\n */\n override get right(): BSTNode<K, V> | null | undefined {\n return this._right;\n }\n\n /**\n * Sets the right child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the right child.\n */\n override set right(v: BSTNode<K, V> | null | undefined) {\n if (v) v.parent = this;\n this._right = v;\n }\n}\n\n/**\n * Represents a Binary Search Tree (BST).\n * Keys are ordered, allowing for faster search operations compared to a standard Binary Tree.\n * @template K - The type of the key.\n * @template V - The type of the value.\n * @template R - The type of the raw data object (if using `toEntryFn`).\n *\n * 1. Node Order: Each node's left child has a lesser value, and the right child has a greater value.\n * 2. Unique Keys: No duplicate keys in a standard BST.\n * 3. Efficient Search: Enables quick search, minimum, and maximum operations.\n * 4. Inorder Traversal: Yields nodes in ascending order.\n * 5. Logarithmic Operations: Ideal operations like insertion, deletion, and searching are O(log n) time-efficient.\n * 6. Balance Variability: Can become unbalanced; special types maintain balance.\n * 7. No Auto-Balancing: Standard BSTs don't automatically balance themselves.\n * @example\n * // Merge 3 sorted datasets\n * const dataset1 = new BST<number, string>([\n * [1, 'A'],\n * [7, 'G']\n * ]);\n * const dataset2 = [\n * [2, 'B'],\n * [6, 'F']\n * ];\n * const dataset3 = new BST<number, string>([\n * [3, 'C'],\n * [5, 'E'],\n * [4, 'D']\n * ]);\n *\n * // Merge datasets into a single BinarySearchTree\n * const merged = new BST<number, string>(dataset1);\n * merged.addMany(dataset2);\n * merged.merge(dataset3);\n *\n * // Verify merged dataset is in sorted order\n * console.log([...merged.values()]); // ['A', 'B', 'C', 'D', 'E', 'F', 'G']\n * @example\n * // Find elements in a range\n * const bst = new BST<number>([10, 5, 15, 3, 7, 12, 18]);\n * console.log(bst.search(new Range(5, 10))); // [5, 7, 10]\n * console.log(bst.rangeSearch([4, 12], node => node.key.toString())); // ['5', '7', '10', '12']\n * console.log(bst.search(new Range(4, 12, true, false))); // [5, 7, 10]\n * console.log(bst.rangeSearch([15, 20])); // [15, 18]\n * console.log(bst.search(new Range(15, 20, false))); // [18]\n * @example\n * // Find lowest common ancestor\n * const bst = new BST<number>([20, 10, 30, 5, 15, 25, 35, 3, 7, 12, 18]);\n *\n * // LCA helper function\n * const findLCA = (num1: number, num2: number): number | undefined => {\n * const path1 = bst.getPathToRoot(num1);\n * const path2 = bst.getPathToRoot(num2);\n * // Find the first common ancestor\n * return findFirstCommon(path1, path2);\n * };\n *\n * function findFirstCommon(arr1: number[], arr2: number[]): number | undefined {\n * for (const num of arr1) {\n * if (arr2.indexOf(num) !== -1) {\n * return num;\n * }\n * }\n * return undefined;\n * }\n *\n * // Assertions\n * console.log(findLCA(3, 10)); // 7\n * console.log(findLCA(5, 35)); // 15\n * console.log(findLCA(20, 30)); // 25\n */\nexport class BST<K = any, V = any, R = any> extends BinaryTree<K, V, R> implements IBinaryTree<K, V, R> {\n /**\n * Creates an instance of BST.\n * @remarks Time O(N log N) or O(N^2) depending on `isBalanceAdd` in `addMany` and input order. Space O(N).\n *\n * @param [keysNodesEntriesOrRaws=[]] - An iterable of items to add.\n * @param [options] - Configuration options for the BST, including comparator.\n */\n constructor(\n keysNodesEntriesOrRaws: Iterable<\n K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n > = [],\n options?: BSTOptions<K, V, R>\n ) {\n super([], options);\n\n if (options) {\n const { specifyComparable, isReverse } = options;\n if (typeof specifyComparable === 'function') this._specifyComparable = specifyComparable;\n if (isReverse !== undefined) this._isReverse = isReverse;\n }\n if (keysNodesEntriesOrRaws) this.addMany(keysNodesEntriesOrRaws);\n }\n\n protected override _root?: BSTNode<K, V> = undefined;\n\n /**\n * Gets the root node of the tree.\n * @remarks Time O(1)\n *\n * @returns The root node.\n */\n override get root(): OptNode<BSTNode<K, V>> {\n return this._root;\n }\n\n protected _isReverse: boolean = false;\n\n /**\n * Gets whether the tree's comparison logic is reversed.\n * @remarks Time O(1)\n *\n * @returns True if the tree is reversed (e.g., a max-heap logic).\n */\n get isReverse(): boolean {\n return this._isReverse;\n }\n\n /**\n * The default comparator function.\n * @remarks Time O(1) (or O(C) if `specifyComparable` is used, C is complexity of that function).\n */\n protected _comparator: Comparator<K> = (a: K, b: K): number => {\n if (isComparable(a) && isComparable(b)) {\n if (a > b) return 1;\n if (a < b) return -1;\n return 0;\n }\n if (this._specifyComparable) {\n const va = this._specifyComparable(a);\n const vb = this._specifyComparable(b);\n if (va > vb) return 1;\n if (va < vb) return -1;\n return 0;\n }\n if (typeof a === 'object' || typeof b === 'object') {\n throw TypeError(\n `When comparing object types, a custom specifyComparable must be defined in the constructor's options.`\n );\n }\n return 0;\n };\n\n /**\n * Gets the comparator function used by the tree.\n * @remarks Time O(1)\n *\n * @returns The comparator function.\n */\n get comparator(): Comparator<K> {\n return this._comparator;\n }\n\n protected _specifyComparable?: (key: K) => Comparable;\n\n /**\n * Gets the function used to extract a comparable value from a complex key.\n * @remarks Time O(1)\n *\n * @returns The key-to-comparable conversion function.\n */\n get specifyComparable(): ((key: K) => Comparable) | undefined {\n return this._specifyComparable;\n }\n\n /**\n * (Protected) Creates a new BST node.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key for the new node.\n * @param [value] - The value for the new node (used if not in Map mode).\n * @returns The newly created BSTNode.\n */\n override createNode(key: K, value?: V): BSTNode<K, V> {\n return new BSTNode<K, V>(key, this._isMapMode ? undefined : value);\n }\n\n /**\n * Ensures the input is a node. If it's a key or entry, it searches for the node.\n * @remarks Time O(log N) (height of the tree), O(N) worst-case.\n *\n * @param keyNodeOrEntry - The item to resolve to a node.\n * @param [iterationType=this.iterationType] - The traversal method to use if searching.\n * @returns The resolved node, or undefined if not found.\n */\n override ensureNode(\n keyNodeOrEntry: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n iterationType: IterationType = this.iterationType\n ): OptNode<BSTNode<K, V>> {\n return super.ensureNode(keyNodeOrEntry, iterationType) ?? undefined;\n }\n\n /**\n * Checks if the given item is a `BSTNode` instance.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's a BSTNode, false otherwise.\n */\n override isNode(\n keyNodeOrEntry: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is BSTNode<K, V> {\n return keyNodeOrEntry instanceof BSTNode;\n }\n\n /**\n * Checks if the given key is valid (comparable).\n * @remarks Time O(1)\n *\n * @param key - The key to validate.\n * @returns True if the key is valid, false otherwise.\n */\n override isValidKey(key: any): key is K {\n return isComparable(key, this._specifyComparable !== undefined);\n }\n\n /**\n * Performs a Depth-First Search (DFS) traversal.\n * @remarks Time O(N), visits every node. Space O(log N) for the call/explicit stack. O(N) worst-case.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [pattern='IN'] - The traversal order ('IN', 'PRE', 'POST').\n * @param [onlyOne=false] - If true, stops after the first callback.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of callback results.\n */\n override dfs<C extends NodeCallback<BSTNode<K, V>>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n pattern: DFSOrderPattern = 'IN',\n onlyOne: boolean = false,\n startNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n return super.dfs(callback, pattern, onlyOne, startNode, iterationType);\n }\n\n /**\n * Performs a Breadth-First Search (BFS) or Level-Order traversal.\n * @remarks Time O(N), visits every node. Space O(N) in the worst case for the queue.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of callback results.\n */\n override bfs<C extends NodeCallback<BSTNode<K, V>>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n return super.bfs(callback, startNode, iterationType, false);\n }\n\n /**\n * Returns a 2D array of nodes, grouped by level.\n * @remarks Time O(N), visits every node. Space O(N) for the result array and the queue/stack.\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on each node.\n * @param [startNode=this._root] - The node to start from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns A 2D array of callback results.\n */\n override listLevels<C extends NodeCallback<BSTNode<K, V>>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[][] {\n return super.listLevels(callback, startNode, iterationType, false);\n }\n\n /**\n * Gets the first node matching a predicate.\n * @remarks Time O(log N) if searching by key, O(N) if searching by predicate. Space O(log N) or O(N).\n *\n * @param keyNodeEntryOrPredicate - The key, node, entry, or predicate function to search for.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns The first matching node, or undefined if not found.\n */\n override getNode(\n keyNodeEntryOrPredicate:\n | K\n | BSTNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BSTNode<K, V>>,\n startNode: BSTNOptKeyOrNode<K, BSTNode<K, V>> = this._root,\n iterationType: IterationType = this.iterationType\n ): OptNode<BSTNode<K, V>> {\n return this.getNodes(keyNodeEntryOrPredicate, true, startNode, iterationType)[0] ?? undefined;\n }\n\n /**\n * Searches the tree for nodes matching a predicate, key, or range.\n * @remarks This is an optimized search for a BST. If searching by key or range, it prunes branches.\n * Time O(H + M) for key/range search (H=height, M=matches). O(N) for predicate search.\n * Space O(log N) for the stack.\n *\n * @template C - The type of the callback function.\n * @param keyNodeEntryOrPredicate - The key, node, entry, predicate, or range to search for.\n * @param [onlyOne=false] - If true, stops after finding the first match.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on matching nodes.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - Whether to use 'RECURSIVE' or 'ITERATIVE' search.\n * @returns An array of results from the callback function for each matching node.\n */\n override search<C extends NodeCallback<BSTNode<K, V>>>(\n keyNodeEntryOrPredicate:\n | K\n | BSTNode<K, V>\n | [K | null | undefined, V | undefined]\n | null\n | undefined\n | NodePredicate<BSTNode<K, V>>\n | Range<K>,\n onlyOne = false,\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n if (keyNodeEntryOrPredicate === undefined) return [];\n if (keyNodeEntryOrPredicate === null) return [];\n startNode = this.ensureNode(startNode);\n if (!startNode) return [];\n\n let predicate: NodePredicate<BSTNode<K, V>>;\n const isRange = this.isRange(keyNodeEntryOrPredicate);\n\n if (isRange) {\n predicate = node => {\n if (!node) return false;\n return (keyNodeEntryOrPredicate as Range<K>).isInRange(node.key, this._comparator);\n };\n } else {\n predicate = this._ensurePredicate(keyNodeEntryOrPredicate);\n }\n\n // Optimization: Pruning logic\n const shouldVisitLeft = (cur: BSTNode<K, V> | null | undefined) => {\n if (!cur) return false;\n if (!this.isRealNode(cur.left)) return false;\n if (isRange) {\n // Range search: Only go left if the current key is >= the lower bound\n const range = keyNodeEntryOrPredicate as Range<K>;\n const leftS = this.isReverse ? range.high : range.low;\n const leftI = this.isReverse ? range.includeHigh : range.includeLow;\n return (leftI && this._compare(cur.key, leftS) >= 0) || (!leftI && this._compare(cur.key, leftS) > 0);\n }\n if (!isRange && !this._isPredicate(keyNodeEntryOrPredicate)) {\n // Key search: Only go left if current key > target key\n const benchmarkKey = this._extractKey(keyNodeEntryOrPredicate);\n return benchmarkKey !== null && benchmarkKey !== undefined && this._compare(cur.key, benchmarkKey) > 0;\n }\n return true; // Predicate search: must visit all\n };\n\n const shouldVisitRight = (cur: BSTNode<K, V> | null | undefined) => {\n if (!cur) return false;\n if (!this.isRealNode(cur.right)) return false;\n if (isRange) {\n // Range search: Only go right if current key <= upper bound\n const range = keyNodeEntryOrPredicate as Range<K>;\n const rightS = this.isReverse ? range.low : range.high;\n const rightI = this.isReverse ? range.includeLow : range.includeHigh;\n return (rightI && this._compare(cur.key, rightS) <= 0) || (!rightI && this._compare(cur.key, rightS) < 0);\n }\n if (!isRange && !this._isPredicate(keyNodeEntryOrPredicate)) {\n // Key search: Only go right if current key < target key\n const benchmarkKey = this._extractKey(keyNodeEntryOrPredicate);\n return benchmarkKey !== null && benchmarkKey !== undefined && this._compare(cur.key, benchmarkKey) < 0;\n }\n return true; // Predicate search: must visit all\n };\n\n return super._dfs(\n callback,\n 'IN', // In-order is efficient for range/key search\n onlyOne,\n startNode,\n iterationType,\n false,\n shouldVisitLeft,\n shouldVisitRight,\n () => true, // shouldVisitRoot (always visit)\n cur => !!cur && predicate(cur) // shouldProcessRoot (only process if predicate matches)\n );\n }\n\n /**\n * Performs an optimized search for nodes within a given key range.\n * @remarks Time O(H + M), where H is tree height and M is the number of matches.\n *\n * @template C - The type of the callback function.\n * @param range - A `Range` object or a `[low, high]` tuple.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - A function to call on matching nodes.\n * @param [startNode=this._root] - The node to start the search from.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of callback results.\n */\n rangeSearch<C extends NodeCallback<BSTNode<K, V>>>(\n range: Range<K> | [K, K],\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n startNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ) {\n const searchRange: Range<K> = range instanceof Range ? range : new Range(range[0], range[1]);\n return this.search(searchRange, false, callback, startNode, iterationType);\n }\n\n /**\n * Adds a new node to the BST based on key comparison.\n * @remarks Time O(log N), where H is tree height. O(N) worst-case (unbalanced tree), O(log N) average. Space O(1).\n *\n * @param keyNodeOrEntry - The key, node, or entry to add.\n * @param [value] - The value, if providing just a key.\n * @returns True if the addition was successful, false otherwise.\n */\n override add(\n keyNodeOrEntry: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n value?: V\n ): boolean {\n const [newNode, newValue] = this._keyValueNodeOrEntryToNodeAndValue(keyNodeOrEntry, value);\n if (newNode === undefined) return false;\n\n if (this._root === undefined) {\n this._setRoot(newNode);\n if (this._isMapMode) this._setValue(newNode?.key, newValue);\n this._size++;\n return true;\n }\n\n let current = this._root;\n while (current !== undefined) {\n if (this._compare(current.key, newNode.key) === 0) {\n // Key exists, replace node\n this._replaceNode(current, newNode);\n if (this._isMapMode) this._setValue(current.key, newValue);\n return true;\n } else if (this._compare(current.key, newNode.key) > 0) {\n // Go left\n if (current.left === undefined) {\n current.left = newNode;\n if (this._isMapMode) this._setValue(newNode?.key, newValue);\n this._size++;\n return true;\n }\n if (current.left !== null) current = current.left;\n } else {\n // Go right\n if (current.right === undefined) {\n current.right = newNode;\n if (this._isMapMode) this._setValue(newNode?.key, newValue);\n this._size++;\n return true;\n }\n if (current.right !== null) current = current.right;\n }\n }\n return false;\n }\n\n /**\n * Adds multiple items to the tree.\n * @remarks If `isBalanceAdd` is true, sorts the input and builds a balanced tree. Time O(N log N) (due to sort and balanced add).\n * If false, adds items one by one. Time O(N * H), which is O(N^2) worst-case.\n * Space O(N) for sorting and recursion/iteration stack.\n *\n * @param keysNodesEntriesOrRaws - An iterable of items to add.\n * @param [values] - An optional parallel iterable of values.\n * @param [isBalanceAdd=true] - If true, builds a balanced tree from the items.\n * @param [iterationType=this.iterationType] - The traversal method for balanced add (recursive or iterative).\n * @returns An array of booleans indicating the success of each individual `add` operation.\n */\n override addMany(\n keysNodesEntriesOrRaws: Iterable<R | BTNRep<K, V, BSTNode<K, V>>>,\n values?: Iterable<V | undefined>,\n isBalanceAdd = true,\n iterationType: IterationType = this.iterationType\n ): boolean[] {\n const inserted: boolean[] = [];\n const valuesIterator: Iterator<V | undefined> | undefined = values?.[Symbol.iterator]();\n\n if (!isBalanceAdd) {\n // Standard O(N*H) insertion\n for (let kve of keysNodesEntriesOrRaws) {\n const val = valuesIterator?.next().value;\n if (this.isRaw(kve)) kve = this._toEntryFn!(kve);\n inserted.push(this.add(kve, val));\n }\n return inserted;\n }\n\n // Balanced O(N log N) insertion\n const realBTNExemplars: {\n key: R | K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined;\n value: V | undefined;\n orgIndex: number;\n }[] = [];\n\n let i = 0;\n for (const kve of keysNodesEntriesOrRaws) {\n realBTNExemplars.push({ key: kve, value: valuesIterator?.next().value, orgIndex: i++ });\n }\n\n // Sort items by key\n const sorted = realBTNExemplars.sort(({ key: a }, { key: b }) => {\n let keyA: K | undefined | null, keyB: K | undefined | null;\n if (this.isRaw(a)) keyA = this._toEntryFn!(a)[0];\n else if (this.isEntry(a)) keyA = a[0];\n else if (this.isRealNode(a)) keyA = a.key;\n else keyA = a as K;\n\n if (this.isRaw(b)) keyB = this._toEntryFn!(b)[0];\n else if (this.isEntry(b)) keyB = b[0];\n else if (this.isRealNode(b)) keyB = b.key;\n else keyB = b as K;\n\n if (keyA != null && keyB != null) return this._compare(keyA, keyB);\n return 0;\n });\n\n // Recursive balanced build\n const _dfs = (arr: typeof realBTNExemplars) => {\n if (arr.length === 0) return;\n const mid = Math.floor((arr.length - 1) / 2);\n const { key, value, orgIndex } = arr[mid];\n if (this.isRaw(key)) {\n const entry = this._toEntryFn!(key);\n inserted[orgIndex] = this.add(entry);\n } else {\n inserted[orgIndex] = this.add(key, value);\n }\n _dfs(arr.slice(0, mid));\n _dfs(arr.slice(mid + 1));\n };\n\n // Iterative balanced build\n const _iterate = () => {\n const n = sorted.length;\n const stack: Array<[number, number]> = [[0, n - 1]];\n while (stack.length > 0) {\n const popped = stack.pop();\n if (!popped) continue;\n const [l, r] = popped;\n if (l > r) continue;\n const m = l + Math.floor((r - l) / 2);\n const { key, value, orgIndex } = sorted[m];\n if (this.isRaw(key)) {\n const entry = this._toEntryFn!(key);\n inserted[orgIndex] = this.add(entry);\n } else {\n inserted[orgIndex] = this.add(key, value);\n }\n stack.push([m + 1, r]);\n stack.push([l, m - 1]);\n }\n };\n\n if (iterationType === 'RECURSIVE') _dfs(sorted);\n else _iterate();\n\n return inserted;\n }\n\n /**\n * Traverses the tree and returns nodes that are lesser or greater than a target node.\n * @remarks Time O(N), as it performs a full traversal. Space O(log N) or O(N).\n *\n * @template C - The type of the callback function.\n * @param [callback=this._DEFAULT_NODE_CALLBACK] - Function to call on matching nodes.\n * @param [lesserOrGreater=-1] - -1 for lesser, 1 for greater, 0 for equal.\n * @param [targetNode=this._root] - The node to compare against.\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns An array of callback results.\n */\n lesserOrGreaterTraverse<C extends NodeCallback<BSTNode<K, V>>>(\n callback: C = this._DEFAULT_NODE_CALLBACK as C,\n lesserOrGreater: CP = -1,\n targetNode: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined = this._root,\n iterationType: IterationType = this.iterationType\n ): ReturnType<C>[] {\n const targetNodeEnsured = this.ensureNode(targetNode);\n const ans: ReturnType<NodeCallback<BSTNode<K, V>>>[] = [];\n if (!this._root || !targetNodeEnsured) return ans;\n\n const targetKey = targetNodeEnsured.key;\n\n if (iterationType === 'RECURSIVE') {\n const dfs = (cur: BSTNode<K, V>) => {\n const compared = this._compare(cur.key, targetKey);\n if (Math.sign(compared) == lesserOrGreater) ans.push(callback(cur));\n\n if (this.isRealNode(cur.left)) dfs(cur.left);\n if (this.isRealNode(cur.right)) dfs(cur.right);\n };\n dfs(this._root);\n return ans;\n } else {\n const queue = new Queue<BSTNode<K, V>>([this._root]);\n while (queue.length > 0) {\n const cur = queue.shift();\n if (this.isRealNode(cur)) {\n const compared = this._compare(cur.key, targetKey);\n if (Math.sign(compared) == lesserOrGreater) ans.push(callback(cur));\n if (this.isRealNode(cur.left)) queue.push(cur.left);\n if (this.isRealNode(cur.right)) queue.push(cur.right);\n }\n }\n return ans;\n }\n }\n\n /**\n * Rebuilds the tree to be perfectly balanced.\n * @remarks Time O(N) (O(N) for DFS, O(N) for sorted build). Space O(N) for node array and recursion stack.\n *\n * @param [iterationType=this.iterationType] - The traversal method for the initial node export.\n * @returns True if successful, false if the tree was empty.\n */\n perfectlyBalance(iterationType: IterationType = this.iterationType): boolean {\n const nodes = this.dfs(node => node, 'IN', false, this._root, iterationType);\n const n = nodes.length;\n this._clearNodes();\n if (n === 0) return false;\n\n // Build balanced tree from sorted array\n const build = (l: number, r: number, parent?: BSTNode<K, V>): BSTNode<K, V> | undefined => {\n if (l > r) return undefined;\n const m = l + ((r - l) >> 1);\n const root = nodes[m]! as BSTNode<K, V>;\n const leftChild = build(l, m - 1, root);\n const rightChild = build(m + 1, r, root);\n root.left = leftChild;\n root.right = rightChild;\n root.parent = parent;\n return root;\n };\n\n const newRoot = build(0, n - 1, undefined);\n this._setRoot(newRoot);\n this._size = n;\n return true;\n }\n\n /**\n * Checks if the tree meets the AVL balance condition (height difference <= 1).\n * @remarks Time O(N), as it must visit every node to compute height. Space O(log N) for recursion or O(N) for iterative map.\n *\n * @param [iterationType=this.iterationType] - The traversal method.\n * @returns True if the tree is AVL balanced, false otherwise.\n */\n isAVLBalanced(iterationType: IterationType = this.iterationType): boolean {\n if (!this._root) return true;\n let balanced = true;\n\n if (iterationType === 'RECURSIVE') {\n // Recursive height check\n const _height = (cur: BSTNode<K, V> | null | undefined): number => {\n if (!cur) return 0;\n const leftHeight = _height(cur.left);\n const rightHeight = _height(cur.right);\n if (Math.abs(leftHeight - rightHeight) > 1) balanced = false;\n return Math.max(leftHeight, rightHeight) + 1;\n };\n _height(this._root);\n } else {\n // Iterative post-order height check\n const stack: BSTNode<K, V>[] = [];\n let node: OptNode<BSTNode<K, V>> = this._root,\n last: OptNode<BSTNode<K, V>> = undefined;\n const depths: Map<BSTNode<K, V>, number> = new Map();\n\n while (stack.length > 0 || node) {\n if (node) {\n stack.push(node);\n if (node.left !== null) node = node.left;\n } else {\n node = stack[stack.length - 1];\n if (!node.right || last === node.right) {\n node = stack.pop();\n if (node) {\n const left = node.left ? depths.get(node.left)! : -1;\n const right = node.right ? depths.get(node.right)! : -1;\n if (Math.abs(left - right) > 1) return false;\n depths.set(node, 1 + Math.max(left, right));\n last = node;\n node = undefined;\n }\n } else node = node.right;\n }\n }\n }\n return balanced;\n }\n\n /**\n * Creates a new BST by mapping each [key, value] pair to a new entry.\n * @remarks Time O(N * H), where N is nodes in this tree, and H is height of the new tree during insertion.\n * Space O(N) for the new tree.\n *\n * @template MK - New key type.\n * @template MV - New value type.\n * @template MR - New raw type.\n * @param callback - A function to map each [key, value] pair.\n * @param [options] - Options for the new BST.\n * @param [thisArg] - `this` context for the callback.\n * @returns A new, mapped BST.\n */\n override map<MK = K, MV = V, MR = any>(\n callback: EntryCallback<K, V | undefined, [MK, MV]>,\n options?: Partial<BinaryTreeOptions<MK, MV, MR>>,\n thisArg?: unknown\n ): BST<MK, MV, MR> {\n const out = this._createLike<MK, MV, MR>([], options);\n let index = 0;\n // Iterates in-order\n for (const [key, value] of this) {\n out.add(callback.call(thisArg, key, value, index++, this));\n }\n return out;\n }\n\n /**\n * Deletes the first node found that satisfies the predicate.\n * @remarks Performs an in-order traversal. Time O(N) worst-case (O(log N) to find + O(log N) to delete). Space O(log N) for stack.\n *\n * @param predicate - A function to test each [key, value] pair.\n * @returns True if a node was deleted, false otherwise.\n */\n deleteWhere(predicate: (key: K, value: V | undefined, index: number, tree: this) => boolean): boolean {\n const stack: Array<BSTNode<K, V> | null | undefined> = [];\n let cur = this._root as BSTNode<K, V> | null | undefined;\n let index = 0;\n\n // In-order traversal to find the node\n while (stack.length > 0 || cur !== undefined) {\n while (cur !== undefined && cur !== null) {\n stack.push(cur);\n cur = cur.left as BSTNode<K, V> | null | undefined;\n }\n const node = stack.pop() as BSTNode<K, V> | undefined;\n if (!node) break;\n\n const key = node.key as K;\n const val = node.value as V | undefined;\n if (predicate(key, val, index++, this)) {\n return this._deleteByKey(key); // Found, now delete\n }\n cur = node.right as BSTNode<K, V> | null | undefined;\n }\n return false;\n }\n\n /**\n * (Protected) Creates a new, empty instance of the same BST constructor.\n * @remarks Time O(1)\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [options] - Options for the new BST.\n * @returns A new, empty BST.\n */\n protected override _createInstance<TK = K, TV = V, TR = R>(options?: Partial<BSTOptions<TK, TV, TR>>): this {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BSTOptions<TK, TV, TR>\n ) => BST<TK, TV, TR>;\n return new Ctor([], { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) }) as unknown as this;\n }\n\n /**\n * (Protected) Creates a new instance of the same BST constructor, potentially with different generic types.\n * @remarks Time O(N log N) or O(N^2) (from constructor) due to processing the iterable.\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [iter=[]] - An iterable to populate the new BST.\n * @param [options] - Options for the new BST.\n * @returns A new BST.\n */\n protected override _createLike<TK = K, TV = V, TR = R>(\n iter: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR> = [],\n options?: Partial<BSTOptions<TK, TV, TR>>\n ): BST<TK, TV, TR> {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BSTOptions<TK, TV, TR>\n ) => BST<TK, TV, TR>;\n return new Ctor(iter, { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) });\n }\n\n /**\n * (Protected) Snapshots the current BST's configuration options.\n * @remarks Time O(1)\n *\n * @template TK, TV, TR - Generic types for the options.\n * @returns The options object.\n */\n protected override _snapshotOptions<TK = K, TV = V, TR = R>(): BSTOptions<TK, TV, TR> {\n return {\n ...super._snapshotOptions<TK, TV, TR>(),\n specifyComparable: this.specifyComparable as BSTOptions<TK, TV, TR>['specifyComparable'],\n isReverse: this.isReverse as BSTOptions<TK, TV, TR>['isReverse']\n };\n }\n\n /**\n * (Protected) Converts a key, node, or entry into a standardized [node, value] tuple.\n * @remarks Time O(1)\n *\n * @param keyNodeOrEntry - The input item.\n * @param [value] - An optional value (used if input is just a key).\n * @returns A tuple of [node, value].\n */\n protected override _keyValueNodeOrEntryToNodeAndValue(\n keyNodeOrEntry: K | BSTNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n value?: V\n ): [OptNode<BSTNode<K, V>>, V | undefined] {\n const [node, entryValue] = super._keyValueNodeOrEntryToNodeAndValue(keyNodeOrEntry, value);\n if (node === null) return [undefined, undefined]; // BST handles null differently (as undefined)\n return [node, value ?? entryValue];\n }\n\n /**\n * (Protected) Sets the root node and clears its parent reference.\n * @remarks Time O(1)\n *\n * @param v - The node to set as root.\n */\n protected override _setRoot(v: OptNode<BSTNode<K, V>>) {\n if (v) v.parent = undefined;\n this._root = v;\n }\n\n /**\n * (Protected) Compares two keys using the tree's comparator and reverse setting.\n * @remarks Time O(1) (or O(C) if `specifyComparable` is used).\n *\n * @param a - The first key.\n * @param b - The second key.\n * @returns A number (1, -1, or 0) representing the comparison.\n */\n protected _compare(a: K, b: K) {\n return this._isReverse ? -this._comparator(a, b) : this._comparator(a, b);\n }\n\n /**\n * (Private) Deletes a node by its key.\n * @remarks Standard BST deletion algorithm. Time O(log N), O(N) worst-case. Space O(1).\n *\n * @param key - The key of the node to delete.\n * @returns True if the node was found and deleted, false otherwise.\n */\n private _deleteByKey(key: K): boolean {\n let node = this._root as BSTNode<K, V> | undefined;\n\n // 1. Find the node\n while (node) {\n const cmp = this._compare(node.key, key);\n if (cmp === 0) break;\n node = cmp > 0 ? (node.left as BSTNode<K, V> | undefined) : (node.right as BSTNode<K, V> | undefined);\n }\n if (!node) return false; // Not found\n\n // Helper to replace node `u` with node `v`\n const transplant = (u: BSTNode<K, V> | undefined, v: BSTNode<K, V> | undefined) => {\n const p = u?.parent as BSTNode<K, V> | undefined;\n if (!p) {\n this._setRoot(v);\n } else if (p.left === u) {\n p.left = v;\n } else {\n p.right = v;\n }\n if (v) v.parent = p;\n };\n\n // Helper to find the minimum node in a subtree\n const minNode = (x: BSTNode<K, V> | undefined): BSTNode<K, V> | undefined => {\n if (!x) return undefined;\n while (x.left !== undefined && x.left !== null) x = x.left as BSTNode<K, V>;\n return x;\n };\n\n // 2. Perform deletion\n if (node.left === undefined) {\n // Case 1: No left child\n transplant(node, node.right as BSTNode<K, V> | undefined);\n } else if (node.right === undefined) {\n // Case 2: No right child\n transplant(node, node.left as BSTNode<K, V> | undefined);\n } else {\n // Case 3: Two children\n const succ = minNode(node.right as BSTNode<K, V> | undefined)!; // Find successor\n if (succ.parent !== node) {\n transplant(succ, succ.right as BSTNode<K, V> | undefined);\n succ.right = node.right as BSTNode<K, V> | undefined;\n if (succ.right) (succ.right as BSTNode<K, V>).parent = succ;\n }\n transplant(node, succ);\n succ.left = node.left as BSTNode<K, V> | undefined;\n if (succ.left) (succ.left as BSTNode<K, V>).parent = succ;\n }\n\n this._size = Math.max(0, ((this as any)._size ?? 0) - 1);\n return true;\n }\n}\n","/**\n * data-structure-typed\n *\n * @author Pablo Zeng\n * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>\n * @license MIT License\n */\n\nimport { BST, BSTNode } from './bst';\nimport type {\n AVLTreeOptions,\n BinaryTreeDeleteResult,\n BinaryTreeOptions,\n BSTNOptKeyOrNode,\n EntryCallback,\n IterationType\n} from '../../types';\nimport { BSTOptions } from '../../types';\nimport { IBinaryTree } from '../../interfaces';\n\n/**\n * Represents a Node in an AVL (Adelson-Velsky and Landis) Tree.\n * It extends a BSTNode and ensures the 'height' property is maintained.\n *\n * @template K - The type of the key.\n * @template V - The type of the value.\n */\nexport class AVLTreeNode<K = any, V = any> extends BSTNode<K, V> {\n override parent?: AVLTreeNode<K, V> = undefined;\n\n /**\n * Creates an instance of AVLTreeNode.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key of the node.\n * @param [value] - The value associated with the key.\n */\n constructor(key: K, value?: V) {\n super(key, value);\n }\n\n override _left?: AVLTreeNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the left child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The left child.\n */\n override get left(): AVLTreeNode<K, V> | null | undefined {\n return this._left;\n }\n\n /**\n * Sets the left child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the left child.\n */\n override set left(v: AVLTreeNode<K, V> | null | undefined) {\n if (v) {\n v.parent = this;\n }\n this._left = v;\n }\n\n override _right?: AVLTreeNode<K, V> | null | undefined = undefined;\n\n /**\n * Gets the right child of the node.\n * @remarks Time O(1), Space O(1)\n *\n * @returns The right child.\n */\n override get right(): AVLTreeNode<K, V> | null | undefined {\n return this._right;\n }\n\n /**\n * Sets the right child of the node and updates its parent reference.\n * @remarks Time O(1), Space O(1)\n *\n * @param v - The node to set as the right child.\n */\n override set right(v: AVLTreeNode<K, V> | null | undefined) {\n if (v) {\n v.parent = this;\n }\n this._right = v;\n }\n}\n\n/**\n * Represents a self-balancing AVL (Adelson-Velsky and Landis) Tree.\n * This tree extends BST and performs rotations on add/delete to maintain balance.\n *\n * @template K - The type of the key.\n * @template V - The type of the value.\n * @template R - The type of the raw data object (if using `toEntryFn`).\n *\n * 1. Height-Balanced: Each node's left and right subtrees differ in height by no more than one.\n * 2. Automatic Rebalancing: AVL trees rebalance themselves automatically during insertions and deletions.\n * 3. Rotations for Balancing: Utilizes rotations (single or double) to maintain balance after updates.\n * 4. Order Preservation: Maintains the binary search tree property where left child values are less than the parent, and right child values are greater.\n * 5. Efficient Lookups: Offers O(log n) search time, where 'n' is the number of nodes, due to its balanced nature.\n * 6. Complex Insertions and Deletions: Due to rebalancing, these operations are more complex than in a regular BST.\n * 7. Path Length: The path length from the root to any leaf is longer compared to an unbalanced BST, but shorter than a linear chain of nodes.@example\n * // Find elements in a range\n * // In interval queries, AVL trees, with their strictly balanced structure and lower height, offer better query efficiency, making them ideal for frequent and high-performance interval queries. In contrast, Red-Black trees, with lower update costs, are more suitable for scenarios involving frequent insertions and deletions where the requirements for interval queries are less demanding.\n * type Datum = { timestamp: Date; temperature: number };\n * // Fixed dataset of CPU temperature readings\n * const cpuData: Datum[] = [\n * { timestamp: new Date('2024-12-02T00:00:00'), temperature: 55.1 },\n * { timestamp: new Date('2024-12-02T00:01:00'), temperature: 56.3 },\n * { timestamp: new Date('2024-12-02T00:02:00'), temperature: 54.8 },\n * { timestamp: new Date('2024-12-02T00:03:00'), temperature: 57.2 },\n * { timestamp: new Date('2024-12-02T00:04:00'), temperature: 58.0 },\n * { timestamp: new Date('2024-12-02T00:05:00'), temperature: 59.4 },\n * { timestamp: new Date('2024-12-02T00:06:00'), temperature: 60.1 },\n * { timestamp: new Date('2024-12-02T00:07:00'), temperature: 61.3 },\n * { timestamp: new Date('2024-12-02T00:08:00'), temperature: 62.0 },\n * { timestamp: new Date('2024-12-02T00:09:00'), temperature: 63.5 },\n * { timestamp: new Date('2024-12-02T00:10:00'), temperature: 64.0 },\n * { timestamp: new Date('2024-12-02T00:11:00'), temperature: 62.8 },\n * { timestamp: new Date('2024-12-02T00:12:00'), temperature: 61.5 },\n * { timestamp: new Date('2024-12-02T00:13:00'), temperature: 60.2 },\n * { timestamp: new Date('2024-12-02T00:14:00'), temperature: 59.8 },\n * { timestamp: new Date('2024-12-02T00:15:00'), temperature: 58.6 },\n * { timestamp: new Date('2024-12-02T00:16:00'), temperature: 57.4 },\n * { timestamp: new Date('2024-12-02T00:17:00'), temperature: 56.2 },\n * { timestamp: new Date('2024-12-02T00:18:00'), temperature: 55.7 },\n * { timestamp: new Date('2024-12-02T00:19:00'), temperature: 54.5 },\n * { timestamp: new Date('2024-12-02T00:20:00'), temperature: 53.2 },\n * { timestamp: new Date('2024-12-02T00:21:00'), temperature: 52.8 },\n * { timestamp: new Date('2024-12-02T00:22:00'), temperature: 51.9 },\n * { timestamp: new Date('2024-12-02T00:23:00'), temperature: 50.5 },\n * { timestamp: new Date('2024-12-02T00:24:00'), temperature: 49.8 },\n * { timestamp: new Date('2024-12-02T00:25:00'), temperature: 48.7 },\n * { timestamp: new Date('2024-12-02T00:26:00'), temperature: 47.5 },\n * { timestamp: new Date('2024-12-02T00:27:00'), temperature: 46.3 },\n * { timestamp: new Date('2024-12-02T00:28:00'), temperature: 45.9 },\n * { timestamp: new Date('2024-12-02T00:29:00'), temperature: 45.0 }\n * ];\n *\n * // Create an AVL tree to store CPU temperature data\n * const cpuTemperatureTree = new AVLTree<Date, number, Datum>(cpuData, {\n * toEntryFn: ({ timestamp, temperature }) => [timestamp, temperature]\n * });\n *\n * // Query a specific time range (e.g., from 00:05 to 00:15)\n * const rangeStart = new Date('2024-12-02T00:05:00');\n * const rangeEnd = new Date('2024-12-02T00:15:00');\n * const rangeResults = cpuTemperatureTree.rangeSearch([rangeStart, rangeEnd], node => ({\n * minute: node ? node.key.getMinutes() : 0,\n * temperature: cpuTemperatureTree.get(node ? node.key : undefined)\n * }));\n *\n * console.log(rangeResults); // [\n * // { minute: 5, temperature: 59.4 },\n * // { minute: 6, temperature: 60.1 },\n * // { minute: 7, temperature: 61.3 },\n * // { minute: 8, temperature: 62 },\n * // { minute: 9, temperature: 63.5 },\n * // { minute: 10, temperature: 64 },\n * // { minute: 11, temperature: 62.8 },\n * // { minute: 12, temperature: 61.5 },\n * // { minute: 13, temperature: 60.2 },\n * // { minute: 14, temperature: 59.8 },\n * // { minute: 15, temperature: 58.6 }\n * // ]\n */\nexport class AVLTree<K = any, V = any, R = any> extends BST<K, V, R> implements IBinaryTree<K, V, R> {\n /**\n * Creates an instance of AVLTree.\n * @remarks Time O(N log N) (from `addMany` with balanced add). Space O(N).\n *\n * @param [keysNodesEntriesOrRaws=[]] - An iterable of items to add.\n * @param [options] - Configuration options for the AVL tree.\n */\n constructor(\n keysNodesEntriesOrRaws: Iterable<\n K | AVLTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined | R\n > = [],\n options?: AVLTreeOptions<K, V, R>\n ) {\n super([], options);\n // Note: super.addMany is called, which in BST defaults to balanced add.\n if (keysNodesEntriesOrRaws) super.addMany(keysNodesEntriesOrRaws);\n }\n\n /**\n * (Protected) Creates a new AVL tree node.\n * @remarks Time O(1), Space O(1)\n *\n * @param key - The key for the new node.\n * @param [value] - The value for the new node.\n * @returns The newly created AVLTreeNode.\n */\n override createNode(key: K, value?: V): AVLTreeNode<K, V> {\n return new AVLTreeNode<K, V>(key, this._isMapMode ? undefined : value) as AVLTreeNode<K, V>;\n }\n\n /**\n * Checks if the given item is an `AVLTreeNode` instance.\n * @remarks Time O(1), Space O(1)\n *\n * @param keyNodeOrEntry - The item to check.\n * @returns True if it's an AVLTreeNode, false otherwise.\n */\n override isNode(\n keyNodeOrEntry: K | AVLTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): keyNodeOrEntry is AVLTreeNode<K, V> {\n return keyNodeOrEntry instanceof AVLTreeNode;\n }\n\n /**\n * Adds a new node to the AVL tree and balances the tree path.\n * @remarks Time O(log N) (O(H) for BST add + O(H) for `_balancePath`). Space O(H) for path/recursion.\n *\n * @param keyNodeOrEntry - The key, node, or entry to add.\n * @param [value] - The value, if providing just a key.\n * @returns True if the addition was successful, false otherwise.\n */\n override add(\n keyNodeOrEntry: K | AVLTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined,\n value?: V\n ): boolean {\n if (keyNodeOrEntry === null) return false;\n const inserted = super.add(keyNodeOrEntry, value);\n // If insertion was successful, balance the path from the new node up to the root.\n if (inserted) this._balancePath(keyNodeOrEntry);\n return inserted;\n }\n\n /**\n * Deletes a node from the AVL tree and re-balances the tree.\n * @remarks Time O(log N) (O(H) for BST delete + O(H) for `_balancePath`). Space O(H) for path/recursion.\n *\n * @param keyNodeOrEntry - The node to delete.\n * @returns An array containing deletion results.\n */\n override delete(\n keyNodeOrEntry: K | AVLTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined\n ): BinaryTreeDeleteResult<AVLTreeNode<K, V>>[] {\n const deletedResults = super.delete(keyNodeOrEntry);\n // After deletion, balance the path from the parent of the *physically deleted* node.\n for (const { needBalanced } of deletedResults) {\n if (needBalanced) {\n this._balancePath(needBalanced);\n }\n }\n return deletedResults;\n }\n\n /**\n * Rebuilds the tree to be perfectly balanced.\n * @remarks AVL trees are already height-balanced, but this makes them *perfectly* balanced (minimal height and all leaves at N or N-1).\n * Time O(N) (O(N) for DFS, O(N) for sorted build). Space O(N) for node array and recursion stack.\n *\n * @param [iterationType=this.iterationType] - The traversal method for the initial node export.\n * @returns True if successful, false if the tree was empty.\n */\n override perfectlyBalance(iterationType: IterationType = this.iterationType): boolean {\n const nodes = this.dfs(node => node, 'IN', false, this._root, iterationType);\n const n = nodes.length;\n if (n === 0) return false;\n\n this._clearNodes();\n\n // Build balanced tree from sorted array\n const build = (l: number, r: number, parent?: AVLTreeNode<K, V>): AVLTreeNode<K, V> | undefined => {\n if (l > r) return undefined;\n const m = l + ((r - l) >> 1);\n const root = nodes[m]!;\n root.left = build(l, m - 1, root);\n root.right = build(m + 1, r, root);\n root.parent = parent;\n\n // Update height during the build\n const lh = root.left ? (root.left as AVLTreeNode<K, V>).height : -1;\n const rh = root.right ? (root.right as AVLTreeNode<K, V>).height : -1;\n root.height = Math.max(lh, rh) + 1;\n return root;\n };\n\n const newRoot = build(0, n - 1, undefined);\n this._setRoot(newRoot);\n this._size = n;\n return true;\n }\n\n /**\n * Creates a new AVLTree by mapping each [key, value] pair.\n * @remarks Time O(N log N) (O(N) iteration + O(log M) `add` for each item into the new tree). Space O(N) for the new tree.\n *\n * @template MK - New key type.\n * @template MV - New value type.\n * @template MR - New raw type.\n * @param callback - A function to map each [key, value] pair.\n * @param [options] - Options for the new AVLTree.\n * @param [thisArg] - `this` context for the callback.\n * @returns A new, mapped AVLTree.\n */\n override map<MK = K, MV = V, MR = any>(\n callback: EntryCallback<K, V | undefined, [MK, MV]>,\n options?: Partial<BinaryTreeOptions<MK, MV, MR>>,\n thisArg?: unknown\n ): AVLTree<MK, MV, MR> {\n const out = this._createLike<MK, MV, MR>([], options);\n\n let index = 0;\n // Iterates in-order\n for (const [key, value] of this) {\n // `add` on the new tree will be O(log N) and will self-balance.\n out.add(callback.call(thisArg, key, value, index++, this));\n }\n return out;\n }\n\n /**\n * (Protected) Creates a new, empty instance of the same AVLTree constructor.\n * @remarks Time O(1)\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [options] - Options for the new tree.\n * @returns A new, empty tree.\n */\n protected override _createInstance<TK = K, TV = V, TR = R>(options?: Partial<BSTOptions<TK, TV, TR>>): this {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BSTOptions<TK, TV, TR>\n ) => this;\n return new Ctor([], { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) }) as unknown as this;\n }\n\n /**\n * (Protected) Creates a new instance of the same AVLTree constructor, potentially with different generic types.\n * @remarks Time O(N log N) (from constructor) due to processing the iterable.\n *\n * @template TK, TV, TR - Generic types for the new instance.\n * @param [iter=[]] - An iterable to populate the new tree.\n * @param [options] - Options for the new tree.\n * @returns A new AVLTree.\n */\n protected override _createLike<TK = K, TV = V, TR = R>(\n iter: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR> = [],\n options?: Partial<BSTOptions<TK, TV, TR>>\n ): AVLTree<TK, TV, TR> {\n const Ctor = this.constructor as unknown as new (\n iter?: Iterable<TK | BSTNode<TK, TV> | [TK | null | undefined, TV | undefined] | null | undefined | TR>,\n opts?: BSTOptions<TK, TV, TR>\n ) => AVLTree<TK, TV, TR>;\n return new Ctor(iter, { ...this._snapshotOptions<TK, TV, TR>(), ...(options ?? {}) });\n }\n\n /**\n * (Protected) Swaps properties of two nodes, including height.\n * @remarks Time O(H) (due to `ensureNode`), but O(1) if nodes are passed directly.\n *\n * @param srcNode - The source node.\n * @param destNode - The destination node.\n * @returns The `destNode` (now holding `srcNode`'s properties).\n */\n protected override _swapProperties(\n srcNode: BSTNOptKeyOrNode<K, AVLTreeNode<K, V>>,\n destNode: BSTNOptKeyOrNode<K, AVLTreeNode<K, V>>\n ): AVLTreeNode<K, V> | undefined {\n const srcNodeEnsured = this.ensureNode(srcNode);\n const destNodeEnsured = this.ensureNode(destNode);\n\n if (srcNodeEnsured && destNodeEnsured) {\n const { key, value, height } = destNodeEnsured;\n const tempNode = this.createNode(key, value);\n\n if (tempNode) {\n tempNode.height = height;\n\n // Copy src to dest\n destNodeEnsured.key = srcNodeEnsured.key;\n if (!this._isMapMode) destNodeEnsured.value = srcNodeEnsured.value;\n destNodeEnsured.height = srcNodeEnsured.height;\n\n // Copy temp (original dest) to src\n srcNodeEnsured.key = tempNode.key;\n if (!this._isMapMode) srcNodeEnsured.value = tempNode.value;\n srcNodeEnsured.height = tempNode.height;\n }\n\n return destNodeEnsured;\n }\n return undefined;\n }\n\n /**\n * (Protected) Calculates the balance factor (height(right) - height(left)).\n * @remarks Time O(1) (assumes heights are stored).\n *\n * @param node - The node to check.\n * @returns The balance factor (positive if right-heavy, negative if left-heavy).\n */\n protected _balanceFactor(node: AVLTreeNode<K, V>): number {\n const left = node.left ? (node.left as AVLTreeNode<K, V>).height : -1;\n const right = node.right ? (node.right as AVLTreeNode<K, V>).height : -1;\n return right - left;\n }\n\n /**\n * (Protected) Recalculates and updates the height of a node based on its children's heights.\n * @remarks Time O(1) (assumes children's heights are correct).\n *\n * @param node - The node to update.\n */\n protected _updateHeight(node: AVLTreeNode<K, V>): void {\n const leftHeight = node.left ? (node.left as AVLTreeNode<K, V>).height : -1;\n const rightHeight = node.right ? (node.right as AVLTreeNode<K, V>).height : -1;\n node.height = 1 + Math.max(leftHeight, rightHeight);\n }\n\n /**\n * (Protected) Performs a Left-Left (LL) rotation (a single right rotation).\n * @remarks Time O(1), Space O(1)\n *\n * @param A - The unbalanced node (root of the unbalanced subtree).\n */\n protected _balanceLL(A: AVLTreeNode<K, V>): void {\n const parentOfA = A.parent;\n const B = A.left; // The left child\n if (B !== null) A.parent = B;\n if (B && B.right) {\n B.right.parent = A;\n }\n if (B) B.parent = parentOfA;\n\n // Update parent's child pointer\n if (A === this.root) {\n if (B) this._setRoot(B);\n } else {\n if (parentOfA?.left === A) {\n parentOfA.left = B;\n } else {\n if (parentOfA) parentOfA.right = B;\n }\n }\n\n // Perform rotation\n if (B) {\n A.left = B.right;\n B.right = A;\n }\n this._updateHeight(A);\n if (B) this._updateHeight(B);\n }\n\n /**\n * (Protected) Performs a Left-Right (LR) double rotation.\n * @remarks Time O(1), Space O(1)\n *\n * @param A - The unbalanced node (root of the unbalanced subtree).\n */\n protected _balanceLR(A: AVLTreeNode<K, V>): void {\n const parentOfA = A.parent;\n const B = A.left;\n let C = undefined;\n if (B) {\n C = B.right; // The \"middle\" node\n }\n if (A && C !== null) A.parent = C;\n if (B && C !== null) B.parent = C;\n\n if (C) {\n if (C.left) {\n if (B !== null) C.left.parent = B;\n }\n if (C.right) {\n C.right.parent = A;\n }\n C.parent = parentOfA;\n }\n\n // Update parent's child pointer\n if (A === this.root) {\n if (C) this._setRoot(C);\n } else {\n if (parentOfA) {\n if (parentOfA.left === A) {\n parentOfA.left = C;\n } else {\n parentOfA.right = C;\n }\n }\n }\n\n // Perform rotation\n if (C) {\n A.left = C.right;\n if (B) B.right = C.left;\n C.left = B;\n C.right = A;\n }\n\n this._updateHeight(A);\n if (B) this._updateHeight(B);\n if (C) this._updateHeight(C);\n }\n\n /**\n * (Protected) Performs a Right-Right (RR) rotation (a single left rotation).\n * @remarks Time O(1), Space O(1)\n *\n * @param A - The unbalanced node (root of the unbalanced subtree).\n */\n protected _balanceRR(A: AVLTreeNode<K, V>): void {\n const parentOfA = A.parent;\n const B = A.right; // The right child\n if (B !== null) A.parent = B;\n if (B) {\n if (B.left) {\n B.left.parent = A;\n }\n B.parent = parentOfA;\n }\n\n // Update parent's child pointer\n if (A === this.root) {\n if (B) this._setRoot(B);\n } else {\n if (parentOfA) {\n if (parentOfA.left === A) {\n parentOfA.left = B;\n } else {\n parentOfA.right = B;\n }\n }\n }\n\n // Perform rotation\n if (B) {\n A.right = B.left;\n B.left = A;\n }\n this._updateHeight(A);\n if (B) this._updateHeight(B);\n }\n\n /**\n * (Protected) Performs a Right-Left (RL) double rotation.\n * @remarks Time O(1), Space O(1)\n *\n * @param A - The unbalanced node (root of the unbalanced subtree).\n */\n protected _balanceRL(A: AVLTreeNode<K, V>): void {\n const parentOfA = A.parent;\n const B = A.right;\n let C = undefined;\n if (B) {\n C = B.left; // The \"middle\" node\n }\n\n if (C !== null) A.parent = C;\n if (B && C !== null) B.parent = C;\n\n if (C) {\n if (C.left) {\n C.left.parent = A;\n }\n if (C.right) {\n if (B !== null) C.right.parent = B;\n }\n C.parent = parentOfA;\n }\n\n // Update parent's child pointer\n if (A === this.root) {\n if (C) this._setRoot(C);\n } else {\n if (parentOfA) {\n if (parentOfA.left === A) {\n parentOfA.left = C;\n } else {\n parentOfA.right = C;\n }\n }\n }\n\n // Perform rotation\n if (C) A.right = C.left;\n if (B && C) B.left = C.right;\n if (C) C.left = A;\n if (C) C.right = B;\n\n this._updateHeight(A);\n if (B) this._updateHeight(B);\n if (C) this._updateHeight(C);\n }\n\n /**\n * (Protected) Traverses up the tree from the specified node, updating heights and performing rotations as needed.\n * @remarks Time O(log N) (O(H)), as it traverses the path to root. Space O(H) for the path array.\n *\n * @param node - The node to start balancing from (e.g., the newly inserted node or parent of the deleted node).\n */\n protected _balancePath(node: K | AVLTreeNode<K, V> | [K | null | undefined, V | undefined] | null | undefined): void {\n // Get the path from the node to the root.\n node = this.ensureNode(node);\n const path = this.getPathToRoot(node, node => node, false);\n\n // Iterate up the path (from node to root)\n for (let i = 0; i < path.length; i++) {\n const A = path[i];\n if (A) {\n this._updateHeight(A);\n\n // Check the balance factor\n switch (this._balanceFactor(A)) {\n case -2: // Left-heavy\n if (A && A.left) {\n if (this._balanceFactor(A.left) <= 0) {\n // Left-Left case\n this._balanceLL(A);\n } else {\n // Left-Right case\n this._balanceLR(A);\n }\n }\n break;\n case +2: // Right-heavy\n if (A && A.right) {\n if (this._balanceFactor(A.right) >= 0) {\n // Right-Right case\n this._balanceRR(A);\n } else {\n // Right-Left case\n this._balanceRL(A);\n }\n }\n }\n }\n }\n }\n\n /**\n * (Protected) Replaces a node, ensuring height is copied.\n * @remarks Time O(1)\n *\n * @param oldNode - The node to be replaced.\n * @param newNode - The node to insert.\n * @returns The `newNode`.\n */\n protected override _replaceNode(oldNode: AVLTreeNode<K, V>, newNode: AVLTreeNode<K, V>): AVLTreeNode<K, V> {\n // When replacing a node (e.g., on duplicate key), preserve the height.\n newNode.height = oldNode.height;\n return super._replaceNode(oldNode, newNode);\n }\n}\n"]}
|