directed-graph-typed 1.52.5 → 1.52.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/constants/index.d.ts +4 -0
  2. package/dist/constants/index.js +8 -0
  3. package/dist/data-structures/base/iterable-element-base.d.ts +8 -1
  4. package/dist/data-structures/base/iterable-element-base.js +10 -1
  5. package/dist/data-structures/base/iterable-entry-base.d.ts +8 -1
  6. package/dist/data-structures/base/iterable-entry-base.js +10 -10
  7. package/dist/data-structures/binary-tree/avl-tree-multi-map.d.ts +31 -32
  8. package/dist/data-structures/binary-tree/avl-tree-multi-map.js +43 -44
  9. package/dist/data-structures/binary-tree/avl-tree.d.ts +23 -24
  10. package/dist/data-structures/binary-tree/avl-tree.js +71 -64
  11. package/dist/data-structures/binary-tree/binary-indexed-tree.js +2 -2
  12. package/dist/data-structures/binary-tree/binary-tree.d.ts +534 -402
  13. package/dist/data-structures/binary-tree/binary-tree.js +669 -598
  14. package/dist/data-structures/binary-tree/bst.d.ts +72 -65
  15. package/dist/data-structures/binary-tree/bst.js +115 -113
  16. package/dist/data-structures/binary-tree/rb-tree.d.ts +21 -24
  17. package/dist/data-structures/binary-tree/rb-tree.js +40 -39
  18. package/dist/data-structures/binary-tree/segment-tree.d.ts +2 -2
  19. package/dist/data-structures/binary-tree/segment-tree.js +2 -2
  20. package/dist/data-structures/binary-tree/tree-multi-map.d.ts +28 -31
  21. package/dist/data-structures/binary-tree/tree-multi-map.js +44 -43
  22. package/dist/data-structures/graph/abstract-graph.d.ts +2 -2
  23. package/dist/data-structures/graph/abstract-graph.js +7 -4
  24. package/dist/data-structures/graph/directed-graph.d.ts +2 -2
  25. package/dist/data-structures/graph/directed-graph.js +4 -2
  26. package/dist/data-structures/graph/undirected-graph.d.ts +2 -2
  27. package/dist/data-structures/hash/hash-map.d.ts +2 -2
  28. package/dist/data-structures/hash/hash-map.js +1 -1
  29. package/dist/data-structures/heap/heap.js +3 -3
  30. package/dist/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  31. package/dist/data-structures/linked-list/doubly-linked-list.js +7 -7
  32. package/dist/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  33. package/dist/data-structures/linked-list/singly-linked-list.js +6 -6
  34. package/dist/data-structures/linked-list/skip-linked-list.d.ts +2 -2
  35. package/dist/data-structures/matrix/matrix.d.ts +2 -2
  36. package/dist/data-structures/matrix/navigator.d.ts +2 -2
  37. package/dist/data-structures/matrix/navigator.js +4 -2
  38. package/dist/data-structures/queue/deque.d.ts +3 -3
  39. package/dist/data-structures/queue/deque.js +29 -29
  40. package/dist/data-structures/queue/queue.d.ts +1 -1
  41. package/dist/data-structures/stack/stack.d.ts +2 -2
  42. package/dist/data-structures/trie/trie.d.ts +2 -2
  43. package/dist/data-structures/trie/trie.js +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.js +1 -0
  46. package/dist/interfaces/binary-tree.d.ts +2 -2
  47. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +2 -4
  48. package/dist/types/data-structures/binary-tree/binary-tree.js +0 -6
  49. package/package.json +2 -2
  50. package/src/constants/index.ts +4 -0
  51. package/src/data-structures/base/iterable-element-base.ts +11 -1
  52. package/src/data-structures/base/iterable-entry-base.ts +11 -19
  53. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +47 -50
  54. package/src/data-structures/binary-tree/avl-tree.ts +69 -71
  55. package/src/data-structures/binary-tree/binary-indexed-tree.ts +2 -2
  56. package/src/data-structures/binary-tree/binary-tree.ts +698 -726
  57. package/src/data-structures/binary-tree/bst.ts +123 -129
  58. package/src/data-structures/binary-tree/rb-tree.ts +44 -46
  59. package/src/data-structures/binary-tree/segment-tree.ts +2 -2
  60. package/src/data-structures/binary-tree/tree-multi-map.ts +48 -49
  61. package/src/data-structures/graph/abstract-graph.ts +6 -6
  62. package/src/data-structures/graph/directed-graph.ts +4 -4
  63. package/src/data-structures/graph/undirected-graph.ts +2 -2
  64. package/src/data-structures/hash/hash-map.ts +3 -3
  65. package/src/data-structures/heap/heap.ts +3 -3
  66. package/src/data-structures/linked-list/doubly-linked-list.ts +9 -9
  67. package/src/data-structures/linked-list/singly-linked-list.ts +8 -8
  68. package/src/data-structures/linked-list/skip-linked-list.ts +2 -2
  69. package/src/data-structures/matrix/matrix.ts +2 -2
  70. package/src/data-structures/matrix/navigator.ts +4 -4
  71. package/src/data-structures/queue/deque.ts +31 -31
  72. package/src/data-structures/queue/queue.ts +1 -1
  73. package/src/data-structures/stack/stack.ts +2 -2
  74. package/src/data-structures/trie/trie.ts +3 -3
  75. package/src/index.ts +2 -1
  76. package/src/interfaces/binary-tree.ts +3 -3
  77. package/src/types/data-structures/binary-tree/binary-tree.ts +3 -5
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * data-structure-typed
3
3
  *
4
- * @author Tyler Zeng
5
- * @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
4
+ * @author Pablo Zeng
5
+ * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>
6
6
  * @license MIT License
7
7
  */
8
8
  import type {
@@ -11,11 +11,11 @@ import type {
11
11
  AVLTreeMultiMapOptions,
12
12
  BinaryTreeDeleteResult,
13
13
  BSTNKeyOrNode,
14
- BTNCallback,
15
14
  BTNKeyOrNodeOrEntry,
16
- IterationType
15
+ BTNPredicate,
16
+ IterationType,
17
+ BTNEntry
17
18
  } from '../../types';
18
- import { BTNEntry } from '../../types';
19
19
  import { IBinaryTree } from '../../interfaces';
20
20
  import { AVLTree, AVLTreeNode } from './avl-tree';
21
21
 
@@ -80,18 +80,18 @@ export class AVLTreeMultiMap<
80
80
  {
81
81
  /**
82
82
  * The constructor initializes a new AVLTreeMultiMap object with optional initial elements.
83
- * @param keysOrNodesOrEntriesOrRawElements - The `keysOrNodesOrEntriesOrRawElements` parameter is an
83
+ * @param keysOrNodesOrEntriesOrRaws - The `keysOrNodesOrEntriesOrRaws` parameter is an
84
84
  * iterable object that can contain either keys, nodes, entries, or raw elements.
85
85
  * @param [options] - The `options` parameter is an optional object that can be used to customize the
86
86
  * behavior of the AVLTreeMultiMap. It can include properties such as `compareKeys` and
87
87
  * `compareValues` functions to define custom comparison logic for keys and values, respectively.
88
88
  */
89
89
  constructor(
90
- keysOrNodesOrEntriesOrRawElements: Iterable<R | BTNKeyOrNodeOrEntry<K, V, NODE>> = [],
90
+ keysOrNodesOrEntriesOrRaws: Iterable<R | BTNKeyOrNodeOrEntry<K, V, NODE>> = [],
91
91
  options?: AVLTreeMultiMapOptions<K, V, R>
92
92
  ) {
93
93
  super([], options);
94
- if (keysOrNodesOrEntriesOrRawElements) this.addMany(keysOrNodesOrEntriesOrRawElements);
94
+ if (keysOrNodesOrEntriesOrRaws) this.addMany(keysOrNodesOrEntriesOrRaws);
95
95
  }
96
96
 
97
97
  protected _count = 0;
@@ -144,29 +144,28 @@ export class AVLTreeMultiMap<
144
144
  override createTree(options?: AVLTreeMultiMapOptions<K, V, R>): TREE {
145
145
  return new AVLTreeMultiMap<K, V, R, NODE, TREE>([], {
146
146
  iterationType: this.iterationType,
147
- comparator: this.comparator,
147
+ comparator: this._comparator,
148
+ toEntryFn: this._toEntryFn,
148
149
  ...options
149
150
  }) as TREE;
150
151
  }
151
152
 
152
153
  /**
153
154
  * The function checks if the input is an instance of AVLTreeMultiMapNode.
154
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
155
- * `keyOrNodeOrEntryOrRawElement` can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
156
- * @returns a boolean value indicating whether the input parameter `keyOrNodeOrEntryOrRawElement` is
155
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} keyOrNodeOrEntryOrRaw - The parameter
156
+ * `keyOrNodeOrEntryOrRaw` can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
157
+ * @returns a boolean value indicating whether the input parameter `keyOrNodeOrEntryOrRaw` is
157
158
  * an instance of the `AVLTreeMultiMapNode` class.
158
159
  */
159
- override isNode(
160
- keyOrNodeOrEntryOrRawElement: R | BTNKeyOrNodeOrEntry<K, V, NODE>
161
- ): keyOrNodeOrEntryOrRawElement is NODE {
162
- return keyOrNodeOrEntryOrRawElement instanceof AVLTreeMultiMapNode;
160
+ override isNode(keyOrNodeOrEntryOrRaw: BTNKeyOrNodeOrEntry<K, V, NODE> | R): keyOrNodeOrEntryOrRaw is NODE {
161
+ return keyOrNodeOrEntryOrRaw instanceof AVLTreeMultiMapNode;
163
162
  }
164
163
 
165
164
  /**
166
165
  * The function `keyValueOrEntryOrRawElementToNode` converts a key, value, entry, or raw element into
167
166
  * a node object.
168
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The
169
- * `keyOrNodeOrEntryOrRawElement` parameter can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
167
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} keyOrNodeOrEntryOrRaw - The
168
+ * `keyOrNodeOrEntryOrRaw` parameter can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
170
169
  * @param {V} [value] - The `value` parameter is an optional value that can be passed to the
171
170
  * `override` function. It represents the value associated with the key in the data structure. If no
172
171
  * value is provided, it will default to `undefined`.
@@ -175,25 +174,25 @@ export class AVLTreeMultiMap<
175
174
  * @returns either a NODE object or undefined.
176
175
  */
177
176
  override keyValueOrEntryOrRawElementToNode(
178
- keyOrNodeOrEntryOrRawElement: R | BTNKeyOrNodeOrEntry<K, V, NODE>,
177
+ keyOrNodeOrEntryOrRaw: BTNKeyOrNodeOrEntry<K, V, NODE> | R,
179
178
  value?: V,
180
179
  count = 1
181
180
  ): NODE | undefined {
182
- if (keyOrNodeOrEntryOrRawElement === undefined || keyOrNodeOrEntryOrRawElement === null) return;
183
- if (this.isNode(keyOrNodeOrEntryOrRawElement)) return keyOrNodeOrEntryOrRawElement;
181
+ if (keyOrNodeOrEntryOrRaw === undefined || keyOrNodeOrEntryOrRaw === null) return;
182
+ if (this.isNode(keyOrNodeOrEntryOrRaw)) return keyOrNodeOrEntryOrRaw;
184
183
 
185
- if (this.isEntry(keyOrNodeOrEntryOrRawElement)) {
186
- const [key, entryValue] = keyOrNodeOrEntryOrRawElement;
184
+ if (this.isEntry(keyOrNodeOrEntryOrRaw)) {
185
+ const [key, entryValue] = keyOrNodeOrEntryOrRaw;
187
186
  if (key === undefined || key === null) return;
188
187
  if (this.isKey(key)) return this.createNode(key, value ?? entryValue, count);
189
188
  }
190
189
 
191
- if (this.toEntryFn) {
192
- const [key, entryValue] = this.toEntryFn(keyOrNodeOrEntryOrRawElement as R);
190
+ if (this._toEntryFn) {
191
+ const [key, entryValue] = this._toEntryFn(keyOrNodeOrEntryOrRaw as R);
193
192
  if (this.isKey(key)) return this.createNode(key, value ?? entryValue, count);
194
193
  }
195
194
 
196
- if (this.isKey(keyOrNodeOrEntryOrRawElement)) return this.createNode(keyOrNodeOrEntryOrRawElement, value, count);
195
+ if (this.isKey(keyOrNodeOrEntryOrRaw)) return this.createNode(keyOrNodeOrEntryOrRaw, value, count);
197
196
 
198
197
  return;
199
198
  }
@@ -204,8 +203,8 @@ export class AVLTreeMultiMap<
204
203
  *
205
204
  * The function overrides the add method of a TypeScript class to add a new node to a data structure
206
205
  * and update the count.
207
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The
208
- * `keyOrNodeOrEntryOrRawElement` parameter can accept a value of type `R`, which can be any type. It
206
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} keyOrNodeOrEntryOrRaw - The
207
+ * `keyOrNodeOrEntryOrRaw` parameter can accept a value of type `R`, which can be any type. It
209
208
  * can also accept a value of type `BTNKeyOrNodeOrEntry<K, V, NODE>`, which represents a key, node,
210
209
  * entry, or raw element
211
210
  * @param {V} [value] - The `value` parameter represents the value associated with the key in the
@@ -215,8 +214,8 @@ export class AVLTreeMultiMap<
215
214
  * be added once. However, you can specify a different value for `count` if you want to add
216
215
  * @returns a boolean value.
217
216
  */
218
- override add(keyOrNodeOrEntryOrRawElement: R | BTNKeyOrNodeOrEntry<K, V, NODE>, value?: V, count = 1): boolean {
219
- const newNode = this.keyValueOrEntryOrRawElementToNode(keyOrNodeOrEntryOrRawElement, value, count);
217
+ override add(keyOrNodeOrEntryOrRaw: BTNKeyOrNodeOrEntry<K, V, NODE> | R, value?: V, count = 1): boolean {
218
+ const newNode = this.keyValueOrEntryOrRawElementToNode(keyOrNodeOrEntryOrRaw, value, count);
220
219
  if (newNode === undefined) return false;
221
220
 
222
221
  const orgNodeCount = newNode?.count || 0;
@@ -231,31 +230,29 @@ export class AVLTreeMultiMap<
231
230
  * Time Complexity: O(log n)
232
231
  * Space Complexity: O(1)
233
232
  *
234
- * The `delete` function in a binary tree data structure deletes a node based on its identifier and
235
- * returns the deleted node along with the parent node that needs to be balanced.
236
- * @param identifier - The identifier parameter is the value used to identify the node that needs to
237
- * be deleted from the binary tree. It can be of any type and is the return type of the callback
238
- * function.
239
- * @param {C} callback - The `callback` parameter is a function that is used to determine the
240
- * equality of nodes in the binary tree. It is optional and has a default value of
241
- * `this._DEFAULT_CALLBACK`. The `callback` function takes a single argument, which is the identifier
242
- * of a node, and returns a value that
243
- * @param [ignoreCount=false] - A boolean flag indicating whether to ignore the count of the node
244
- * being deleted. If set to true, the count of the node will not be considered and the node will be
245
- * deleted regardless of its count. If set to false (default), the count of the node will be taken
246
- * into account and the node
247
- * @returns an array of `BinaryTreeDeleteResult<NODE>`.
233
+ * The function overrides the delete method in a binary tree data structure, handling deletion of
234
+ * nodes and maintaining balance in the tree.
235
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R | BTNPredicate<NODE>} predicate - The `predicate`
236
+ * parameter in the `delete` method is used to specify the condition for deleting a node from the
237
+ * binary tree. It can be a key, node, entry, or a custom predicate function that determines which
238
+ * node(s) should be deleted.
239
+ * @param [ignoreCount=false] - The `ignoreCount` parameter in the `override delete` method is a
240
+ * boolean flag that determines whether to ignore the count of the node being deleted. If
241
+ * `ignoreCount` is set to `true`, the method will delete the node regardless of its count. If
242
+ * `ignoreCount` is set to
243
+ * @returns The `delete` method overrides the default delete behavior in a binary tree data
244
+ * structure. It takes a predicate or node to be deleted and an optional flag to ignore count. The
245
+ * method returns an array of `BinaryTreeDeleteResult` objects, each containing information about the
246
+ * deleted node and whether balancing is needed in the tree.
248
247
  */
249
- override delete<C extends BTNCallback<NODE>>(
250
- identifier: ReturnType<C>,
251
- callback: C = this._DEFAULT_CALLBACK as C,
248
+ override delete(
249
+ predicate: BTNKeyOrNodeOrEntry<K, V, NODE> | R | BTNPredicate<NODE>,
252
250
  ignoreCount = false
253
251
  ): BinaryTreeDeleteResult<NODE>[] {
254
252
  const deletedResult: BinaryTreeDeleteResult<NODE>[] = [];
255
253
  if (!this.root) return deletedResult;
256
- callback = this._ensureCallback(identifier, callback);
257
254
 
258
- const curr: NODE | undefined = this.getNode(identifier, callback) ?? undefined;
255
+ const curr: NODE | undefined = this.getNode(predicate) ?? undefined;
259
256
  if (!curr) return deletedResult;
260
257
 
261
258
  const parent: NODE | undefined = curr?.parent ? curr.parent : undefined;
@@ -293,7 +290,7 @@ export class AVLTreeMultiMap<
293
290
  }
294
291
  }
295
292
  }
296
- this._size = this.size - 1;
293
+ this._size = this._size - 1;
297
294
  // TODO How to handle when the count of target node is lesser than current node's count
298
295
  if (orgCurrent) this._count -= orgCurrent.count;
299
296
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * data-structure-typed
3
3
  *
4
- * @author Tyler Zeng
5
- * @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
4
+ * @author Pablo Zeng
5
+ * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>
6
6
  * @license MIT License
7
7
  */
8
8
  import { BST, BSTNode } from './bst';
@@ -12,10 +12,10 @@ import type {
12
12
  AVLTreeOptions,
13
13
  BinaryTreeDeleteResult,
14
14
  BSTNKeyOrNode,
15
- BTNCallback,
16
- BTNKeyOrNodeOrEntry
15
+ BTNKeyOrNodeOrEntry,
16
+ BTNPredicate,
17
+ BTNEntry
17
18
  } from '../../types';
18
- import { BTNEntry } from '../../types';
19
19
  import { IBinaryTree } from '../../interfaces';
20
20
 
21
21
  export class AVLTreeNode<
@@ -78,7 +78,7 @@ export class AVLTree<
78
78
  /**
79
79
  * This is a constructor function for an AVLTree class that initializes the tree with keys, nodes,
80
80
  * entries, or raw elements.
81
- * @param keysOrNodesOrEntriesOrRawElements - The `keysOrNodesOrEntriesOrRawElements` parameter is an
81
+ * @param keysOrNodesOrEntriesOrRaws - The `keysOrNodesOrEntriesOrRaws` parameter is an
82
82
  * iterable object that can contain either keys, nodes, entries, or raw elements. These elements will
83
83
  * be used to initialize the AVLTree.
84
84
  * @param [options] - The `options` parameter is an optional object that can be used to customize the
@@ -87,11 +87,11 @@ export class AVLTree<
87
87
  * `nodeBuilder` (
88
88
  */
89
89
  constructor(
90
- keysOrNodesOrEntriesOrRawElements: Iterable<R | BTNKeyOrNodeOrEntry<K, V, NODE>> = [],
90
+ keysOrNodesOrEntriesOrRaws: Iterable<R | BTNKeyOrNodeOrEntry<K, V, NODE>> = [],
91
91
  options?: AVLTreeOptions<K, V, R>
92
92
  ) {
93
93
  super([], options);
94
- if (keysOrNodesOrEntriesOrRawElements) super.addMany(keysOrNodesOrEntriesOrRawElements);
94
+ if (keysOrNodesOrEntriesOrRaws) super.addMany(keysOrNodesOrEntriesOrRaws);
95
95
  }
96
96
 
97
97
  /**
@@ -117,22 +117,21 @@ export class AVLTree<
117
117
  override createTree(options?: AVLTreeOptions<K, V, R>): TREE {
118
118
  return new AVLTree<K, V, R, NODE, TREE>([], {
119
119
  iterationType: this.iterationType,
120
- comparator: this.comparator,
120
+ comparator: this._comparator,
121
+ toEntryFn: this._toEntryFn,
121
122
  ...options
122
123
  }) as TREE;
123
124
  }
124
125
 
125
126
  /**
126
127
  * The function checks if the input is an instance of AVLTreeNode.
127
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
128
- * `keyOrNodeOrEntryOrRawElement` can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
129
- * @returns a boolean value indicating whether the input parameter `keyOrNodeOrEntryOrRawElement` is
128
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} keyOrNodeOrEntryOrRaw - The parameter
129
+ * `keyOrNodeOrEntryOrRaw` can be of type `R` or `BTNKeyOrNodeOrEntry<K, V, NODE>`.
130
+ * @returns a boolean value indicating whether the input parameter `keyOrNodeOrEntryOrRaw` is
130
131
  * an instance of the `AVLTreeNode` class.
131
132
  */
132
- override isNode(
133
- keyOrNodeOrEntryOrRawElement: R | BTNKeyOrNodeOrEntry<K, V, NODE>
134
- ): keyOrNodeOrEntryOrRawElement is NODE {
135
- return keyOrNodeOrEntryOrRawElement instanceof AVLTreeNode;
133
+ override isNode(keyOrNodeOrEntryOrRaw: BTNKeyOrNodeOrEntry<K, V, NODE> | R): keyOrNodeOrEntryOrRaw is NODE {
134
+ return keyOrNodeOrEntryOrRaw instanceof AVLTreeNode;
136
135
  }
137
136
 
138
137
  /**
@@ -141,17 +140,17 @@ export class AVLTree<
141
140
  *
142
141
  * The function overrides the add method of a class and inserts a key-value pair into a data
143
142
  * structure, then balances the path.
144
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} keyOrNodeOrEntryOrRawElement - The parameter
145
- * `keyOrNodeOrEntryOrRawElement` can accept values of type `R`, `BTNKeyOrNodeOrEntry<K, V, NODE>`, or
143
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} keyOrNodeOrEntryOrRaw - The parameter
144
+ * `keyOrNodeOrEntryOrRaw` can accept values of type `R`, `BTNKeyOrNodeOrEntry<K, V, NODE>`, or
146
145
  * `RawElement`.
147
146
  * @param {V} [value] - The `value` parameter is an optional value that you want to associate with
148
147
  * the key or node being added to the data structure.
149
148
  * @returns The method is returning a boolean value.
150
149
  */
151
- override add(keyOrNodeOrEntryOrRawElement: R | BTNKeyOrNodeOrEntry<K, V, NODE>, value?: V): boolean {
152
- if (keyOrNodeOrEntryOrRawElement === null) return false;
153
- const inserted = super.add(keyOrNodeOrEntryOrRawElement, value);
154
- if (inserted) this._balancePath(keyOrNodeOrEntryOrRawElement);
150
+ override add(keyOrNodeOrEntryOrRaw: BTNKeyOrNodeOrEntry<K, V, NODE> | R, value?: V): boolean {
151
+ if (keyOrNodeOrEntryOrRaw === null) return false;
152
+ const inserted = super.add(keyOrNodeOrEntryOrRaw, value);
153
+ if (inserted) this._balancePath(keyOrNodeOrEntryOrRaw);
155
154
  return inserted;
156
155
  }
157
156
 
@@ -159,20 +158,17 @@ export class AVLTree<
159
158
  * Time Complexity: O(log n)
160
159
  * Space Complexity: O(1)
161
160
  *
162
- * The function overrides the delete method of a binary tree class and performs additional operations
163
- * to balance the tree after deletion.
164
- * @param identifier - The `identifier` parameter is the value or condition used to identify the
165
- * node(s) to be deleted from the binary tree. It can be of any type that is compatible with the
166
- * binary tree's node type.
167
- * @param {C} callback - The `callback` parameter is a function that will be used to determine if a
168
- * node should be deleted or not. It is optional and has a default value of `this._DEFAULT_CALLBACK`.
169
- * @returns The method is returning an array of BinaryTreeDeleteResult<NODE> objects.
161
+ * The function overrides the delete method in a TypeScript class, performs deletion, and then
162
+ * balances the tree if necessary.
163
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R | BTNPredicate<NODE>} predicate - The `predicate`
164
+ * parameter in the `override delete` method can be one of the following types:
165
+ * @returns The `delete` method is being overridden in this code snippet. It first calls the `delete`
166
+ * method from the superclass (presumably a parent class) with the provided `predicate`, which could
167
+ * be a key, node, entry, or a custom predicate. The result of this deletion operation is stored in
168
+ * `deletedResults`, which is an array of `BinaryTreeDeleteResult` objects.
170
169
  */
171
- override delete<C extends BTNCallback<NODE>>(
172
- identifier: ReturnType<C>,
173
- callback: C = this._DEFAULT_CALLBACK as C
174
- ): BinaryTreeDeleteResult<NODE>[] {
175
- const deletedResults = super.delete(identifier, callback);
170
+ override delete(predicate: BTNKeyOrNodeOrEntry<K, V, NODE> | R | BTNPredicate<NODE>): BinaryTreeDeleteResult<NODE>[] {
171
+ const deletedResults = super.delete(predicate);
176
172
  for (const { needBalanced } of deletedResults) {
177
173
  if (needBalanced) {
178
174
  this._balancePath(needBalanced);
@@ -339,8 +335,8 @@ export class AVLTree<
339
335
  }
340
336
 
341
337
  this._updateHeight(A);
342
- B && this._updateHeight(B);
343
- C && this._updateHeight(C);
338
+ if (B) this._updateHeight(B);
339
+ if (C) this._updateHeight(C);
344
340
  }
345
341
 
346
342
  /**
@@ -378,7 +374,7 @@ export class AVLTree<
378
374
  B.left = A;
379
375
  }
380
376
  this._updateHeight(A);
381
- B && this._updateHeight(B);
377
+ if (B) this._updateHeight(B);
382
378
  }
383
379
 
384
380
  /**
@@ -427,8 +423,8 @@ export class AVLTree<
427
423
  if (C) C.right = B;
428
424
 
429
425
  this._updateHeight(A);
430
- B && this._updateHeight(B);
431
- C && this._updateHeight(C);
426
+ if (B) this._updateHeight(B);
427
+ if (C) this._updateHeight(C);
432
428
  }
433
429
 
434
430
  /**
@@ -437,46 +433,48 @@ export class AVLTree<
437
433
  *
438
434
  * The `_balancePath` function is used to update the heights of nodes and perform rotation operations
439
435
  * to restore balance in an AVL tree after inserting a node.
440
- * @param {R | BTNKeyOrNodeOrEntry<K, V, NODE>} node - The `node` parameter can be of type `R` or
436
+ * @param {BTNKeyOrNodeOrEntry<K, V, NODE> | R} node - The `node` parameter can be of type `R` or
441
437
  * `BTNKeyOrNodeOrEntry<K, V, NODE>`.
442
438
  */
443
- protected _balancePath(node: R | BTNKeyOrNodeOrEntry<K, V, NODE>): void {
439
+ protected _balancePath(node: BTNKeyOrNodeOrEntry<K, V, NODE> | R): void {
444
440
  node = this.ensureNode(node);
445
- const path = this.getPathToRoot(node, false); // first O(log n) + O(log n)
441
+ const path = this.getPathToRoot(node => node, node, false); // first O(log n) + O(log n)
446
442
  for (let i = 0; i < path.length; i++) {
447
443
  // second O(log n)
448
444
  const A = path[i];
449
- // Update Heights: After inserting a node, backtrack from the insertion point to the root node, updating the height of each node along the way.
450
- this._updateHeight(A); // first O(1)
451
- // Check Balance: Simultaneously with height updates, check if each node violates the balance property of an AVL tree.
452
- // Balance Restoration: If a balance issue is discovered after inserting a node, it requires balance restoration operations. Balance restoration includes four basic cases where rotation operations need to be performed to fix the balance:
453
- switch (
454
- this._balanceFactor(A) // second O(1)
455
- ) {
456
- case -2:
457
- if (A && A.left) {
458
- if (this._balanceFactor(A.left) <= 0) {
459
- // second O(1)
460
- // Left Rotation (LL Rotation): When the inserted node is in the left subtree of the left subtree, causing an imbalance.
461
- this._balanceLL(A);
462
- } else {
463
- // Left-Right Rotation (LR Rotation): When the inserted node is in the right subtree of the left subtree, causing an imbalance.
464
- this._balanceLR(A);
445
+ if (A) {
446
+ // Update Heights: After inserting a node, backtrack from the insertion point to the root node, updating the height of each node along the way.
447
+ this._updateHeight(A); // first O(1)
448
+ // Check Balance: Simultaneously with height updates, check if each node violates the balance property of an AVL tree.
449
+ // Balance Restoration: If a balance issue is discovered after inserting a node, it requires balance restoration operations. Balance restoration includes four basic cases where rotation operations need to be performed to fix the balance:
450
+ switch (
451
+ this._balanceFactor(A) // second O(1)
452
+ ) {
453
+ case -2:
454
+ if (A && A.left) {
455
+ if (this._balanceFactor(A.left) <= 0) {
456
+ // second O(1)
457
+ // Left Rotation (LL Rotation): When the inserted node is in the left subtree of the left subtree, causing an imbalance.
458
+ this._balanceLL(A);
459
+ } else {
460
+ // Left-Right Rotation (LR Rotation): When the inserted node is in the right subtree of the left subtree, causing an imbalance.
461
+ this._balanceLR(A);
462
+ }
465
463
  }
466
- }
467
- break;
468
- case +2:
469
- if (A && A.right) {
470
- if (this._balanceFactor(A.right) >= 0) {
471
- // Right Rotation (RR Rotation): When the inserted node is in the right subtree of the right subtree, causing an imbalance.
472
- this._balanceRR(A);
473
- } else {
474
- // Right-Left Rotation (RL Rotation): When the inserted node is in the left subtree of the right subtree, causing an imbalance.
475
- this._balanceRL(A);
464
+ break;
465
+ case +2:
466
+ if (A && A.right) {
467
+ if (this._balanceFactor(A.right) >= 0) {
468
+ // Right Rotation (RR Rotation): When the inserted node is in the right subtree of the right subtree, causing an imbalance.
469
+ this._balanceRR(A);
470
+ } else {
471
+ // Right-Left Rotation (RL Rotation): When the inserted node is in the left subtree of the right subtree, causing an imbalance.
472
+ this._balanceRL(A);
473
+ }
476
474
  }
477
- }
475
+ }
476
+ // TODO So far, no sure if this is necessary that Recursive Repair: Once rotation operations are executed, it may cause imbalance issues at higher levels of the tree. Therefore, you need to recursively check and repair imbalance problems upwards until you reach the root node.
478
477
  }
479
- // TODO So far, no sure if this is necessary that Recursive Repair: Once rotation operations are executed, it may cause imbalance issues at higher levels of the tree. Therefore, you need to recursively check and repair imbalance problems upwards until you reach the root node.
480
478
  }
481
479
  }
482
480
 
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * data-structure-typed
3
3
  *
4
- * @author Tyler Zeng
5
- * @copyright Copyright (c) 2022 Tyler Zeng <zrwusa@gmail.com>
4
+ * @author Pablo Zeng
5
+ * @copyright Copyright (c) 2022 Pablo Zeng <zrwusa@gmail.com>
6
6
  * @license MIT License
7
7
  */
8
8
  import { getMSB } from '../../utils';