data-structure-typed 1.47.9 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +33 -32
  3. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +6 -0
  4. package/dist/cjs/data-structures/binary-tree/avl-tree.js +8 -0
  5. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  6. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +14 -0
  7. package/dist/cjs/data-structures/binary-tree/binary-tree.js +52 -28
  8. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/bst.d.ts +13 -0
  10. package/dist/cjs/data-structures/binary-tree/bst.js +41 -21
  11. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +16 -0
  13. package/dist/cjs/data-structures/binary-tree/rb-tree.js +54 -31
  14. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +16 -0
  16. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +44 -21
  17. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  18. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +6 -0
  19. package/dist/mjs/data-structures/binary-tree/avl-tree.js +8 -0
  20. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +14 -0
  21. package/dist/mjs/data-structures/binary-tree/binary-tree.js +52 -28
  22. package/dist/mjs/data-structures/binary-tree/bst.d.ts +13 -0
  23. package/dist/mjs/data-structures/binary-tree/bst.js +41 -21
  24. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +16 -0
  25. package/dist/mjs/data-structures/binary-tree/rb-tree.js +54 -31
  26. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +16 -0
  27. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +44 -21
  28. package/dist/umd/data-structure-typed.js +186 -89
  29. package/dist/umd/data-structure-typed.min.js +2 -2
  30. package/dist/umd/data-structure-typed.min.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/data-structures/binary-tree/avl-tree.ts +9 -0
  33. package/src/data-structures/binary-tree/binary-tree.ts +47 -23
  34. package/src/data-structures/binary-tree/bst.ts +38 -19
  35. package/src/data-structures/binary-tree/rb-tree.ts +55 -31
  36. package/src/data-structures/binary-tree/tree-multimap.ts +42 -17
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "data-structure-typed",
3
- "version": "1.47.9",
3
+ "version": "1.48.0",
4
4
  "description": "Data Structures of Javascript & TypeScript. Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, HashMap, Directed Graph, Undirected Graph, Binary Search Tree(BST), AVL Tree, Priority Queue, Graph, Queue, Tree Multiset, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue, Stack.",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/mjs/index.js",
@@ -82,6 +82,15 @@ export class AVLTree<V = any, N extends AVLTreeNode<V, N> = AVLTreeNode<V, AVLTr
82
82
  }) as TREE;
83
83
  }
84
84
 
85
+ /**
86
+ * The function checks if an exemplar is an instance of AVLTreeNode.
87
+ * @param exemplar - The `exemplar` parameter is of type `BTNodeExemplar<V, N>`.
88
+ * @returns a boolean value indicating whether the exemplar is an instance of the AVLTreeNode class.
89
+ */
90
+ override isNode(exemplar: BTNodeExemplar<V, N>): exemplar is N {
91
+ return exemplar instanceof AVLTreeNode;
92
+ }
93
+
85
94
  /**
86
95
  * Time Complexity: O(log n) - logarithmic time, where "n" is the number of nodes in the tree. The add method of the superclass (BST) has logarithmic time complexity.
87
96
  * Space Complexity: O(1) - constant space, as it doesn't use additional data structures that scale with input size.
@@ -163,6 +163,47 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
163
163
  return new BinaryTree<V, N, TREE>([], { iterationType: this.iterationType, ...options }) as TREE;
164
164
  }
165
165
 
166
+ /**
167
+ * The function "isNode" checks if an exemplar is an instance of the BinaryTreeNode class.
168
+ * @param exemplar - The `exemplar` parameter is a variable of type `BTNodeExemplar<V, N>`.
169
+ * @returns a boolean value indicating whether the exemplar is an instance of the class N.
170
+ */
171
+ isNode(exemplar: BTNodeExemplar<V, N>): exemplar is N {
172
+ return exemplar instanceof BinaryTreeNode;
173
+ }
174
+
175
+ /**
176
+ * The function `exemplarToNode` converts an exemplar of a binary tree node into an actual node
177
+ * object.
178
+ * @param exemplar - BTNodeExemplar<V, N> - A generic type representing the exemplar parameter of the
179
+ * function. It can be any type.
180
+ * @returns a value of type `N` (which represents a node), or `null`, or `undefined`.
181
+ */
182
+ exemplarToNode(exemplar: BTNodeExemplar<V, N>): N | null | undefined {
183
+ if (exemplar === undefined) return;
184
+
185
+ let node: N | null | undefined;
186
+ if (exemplar === null) {
187
+ node = null;
188
+ } else if (this.isEntry(exemplar)) {
189
+ const [key, value] = exemplar;
190
+ if (key === undefined) {
191
+ return;
192
+ } else if (key === null) {
193
+ node = null;
194
+ } else {
195
+ node = this.createNode(key, value);
196
+ }
197
+ } else if (this.isNode(exemplar)) {
198
+ node = exemplar;
199
+ } else if (this.isNodeKey(exemplar)) {
200
+ node = this.createNode(exemplar);
201
+ } else {
202
+ return;
203
+ }
204
+ return node;
205
+ }
206
+
166
207
  /**
167
208
  * The function checks if a given value is an entry in a binary tree node.
168
209
  * @param kne - BTNodeExemplar<V, N> - A generic type representing a node in a binary tree. It has
@@ -188,7 +229,9 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
188
229
  */
189
230
  add(keyOrNodeOrEntry: BTNodeExemplar<V, N>): N | null | undefined {
190
231
 
191
- let inserted: N | null | undefined, needInsert: N | null | undefined;
232
+ let inserted: N | null | undefined;
233
+ const newNode = this.exemplarToNode(keyOrNodeOrEntry);
234
+ if (newNode === undefined) return;
192
235
 
193
236
  const _bfs = (root: N, newNode: N | null): N | undefined | null => {
194
237
  const queue = new Queue<N>([root]);
@@ -205,30 +248,11 @@ export class BinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNode
205
248
  }
206
249
  };
207
250
 
208
- if (keyOrNodeOrEntry === null) {
209
- needInsert = null;
210
- } else if (this.isNodeKey(keyOrNodeOrEntry)) {
211
- needInsert = this.createNode(keyOrNodeOrEntry);
212
- } else if (keyOrNodeOrEntry instanceof BinaryTreeNode) {
213
- needInsert = keyOrNodeOrEntry;
214
- } else if (this.isEntry(keyOrNodeOrEntry)) {
215
- const [key, value] = keyOrNodeOrEntry;
216
- if (key === undefined) {
217
- return;
218
- } else if (key === null) {
219
- needInsert = null;
220
- } else {
221
- needInsert = this.createNode(key, value);
222
- }
223
- } else {
224
- return;
225
- }
226
-
227
251
  if (this.root) {
228
- inserted = _bfs(this.root, needInsert);
252
+ inserted = _bfs(this.root, newNode);
229
253
  } else {
230
- this._setRoot(needInsert);
231
- if (needInsert) {
254
+ this._setRoot(newNode);
255
+ if (newNode) {
232
256
  this._size = 1;
233
257
  } else {
234
258
  this._size = 0;
@@ -143,6 +143,42 @@ export class BST<V = any, N extends BSTNode<V, N> = BSTNode<V, BSTNodeNested<V>>
143
143
  }) as TREE;
144
144
  }
145
145
 
146
+ /**
147
+ * The function checks if an exemplar is an instance of BSTNode.
148
+ * @param exemplar - The `exemplar` parameter is a variable of type `BTNodeExemplar<V, N>`.
149
+ * @returns a boolean value indicating whether the exemplar is an instance of the BSTNode class.
150
+ */
151
+ override isNode(exemplar: BTNodeExemplar<V, N>): exemplar is N {
152
+ return exemplar instanceof BSTNode;
153
+ }
154
+
155
+ /**
156
+ * The function `exemplarToNode` takes an exemplar and returns a corresponding node if the exemplar
157
+ * is valid, otherwise it returns undefined.
158
+ * @param exemplar - The `exemplar` parameter is of type `BTNodeExemplar<V, N>`.
159
+ * @returns a variable `node` which is of type `N` or `undefined`.
160
+ */
161
+ override exemplarToNode(exemplar: BTNodeExemplar<V, N>): N | undefined {
162
+ let node: N | undefined;
163
+ if (exemplar === null || exemplar === undefined) {
164
+ return;
165
+ } else if (this.isNode(exemplar)) {
166
+ node = exemplar;
167
+ } else if (this.isEntry(exemplar)) {
168
+ const [key, value] = exemplar;
169
+ if (key === undefined || key === null) {
170
+ return;
171
+ } else {
172
+ node = this.createNode(key, value);
173
+ }
174
+ } else if (this.isNodeKey(exemplar)) {
175
+ node = this.createNode(exemplar);
176
+ } else {
177
+ return;
178
+ }
179
+ return node;
180
+ }
181
+
146
182
  /**
147
183
  * Time Complexity: O(log n) - Average case for a balanced tree. In the worst case (unbalanced tree), it can be O(n).
148
184
  * Space Complexity: O(1) - Constant space is used.
@@ -159,25 +195,8 @@ export class BST<V = any, N extends BSTNode<V, N> = BSTNode<V, BSTNodeNested<V>>
159
195
  * (`keyOrNodeOrEntry`) is null, undefined, or does not match any of the expected types.
160
196
  */
161
197
  override add(keyOrNodeOrEntry: BTNodeExemplar<V, N>): N | undefined {
162
- if (keyOrNodeOrEntry === null || keyOrNodeOrEntry === undefined) {
163
- return undefined;
164
- }
165
-
166
- let newNode: N | undefined;
167
- if (keyOrNodeOrEntry instanceof BSTNode) {
168
- newNode = keyOrNodeOrEntry;
169
- } else if (this.isNodeKey(keyOrNodeOrEntry)) {
170
- newNode = this.createNode(keyOrNodeOrEntry);
171
- } else if (this.isEntry(keyOrNodeOrEntry)) {
172
- const [key, value] = keyOrNodeOrEntry;
173
- if (key === undefined || key === null) {
174
- return;
175
- } else {
176
- newNode = this.createNode(key, value);
177
- }
178
- } else {
179
- return;
180
- }
198
+ const newNode = this.exemplarToNode(keyOrNodeOrEntry);
199
+ if (newNode === undefined) return;
181
200
 
182
201
  if (this.root === undefined) {
183
202
  this._setRoot(newNode);
@@ -107,38 +107,62 @@ export class RedBlackTree<V = any, N extends RedBlackTreeNode<V, N> = RedBlackTr
107
107
  }
108
108
 
109
109
  /**
110
- * Time Complexity: O(log n) on average (where n is the number of nodes in the tree)
111
- * Space Complexity: O(1)
110
+ * The function checks if an exemplar is an instance of the RedBlackTreeNode class.
111
+ * @param exemplar - The `exemplar` parameter is of type `BTNodeExemplar<V, N>`.
112
+ * @returns a boolean value indicating whether the exemplar is an instance of the RedBlackTreeNode
113
+ * class.
112
114
  */
113
-
115
+ override isNode(exemplar: BTNodeExemplar<V, N>): exemplar is N {
116
+ return exemplar instanceof RedBlackTreeNode;
117
+ }
114
118
 
115
119
  /**
116
- * The function adds a node to a Red-Black Tree data structure.
117
- * @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter can be one of the following:
118
- * @returns The method `add` returns either an instance of `N` (the node that was added) or
119
- * `undefined`.
120
+ * The function `exemplarToNode` takes an exemplar and returns a node if the exemplar is valid,
121
+ * otherwise it returns undefined.
122
+ * @param exemplar - BTNodeExemplar<V, N> - A generic type representing an exemplar of a binary tree
123
+ * node. It can be either a node itself, an entry (key-value pair), a node key, or any other value
124
+ * that is not a valid exemplar.
125
+ * @returns a variable `node` which is of type `N | undefined`.
120
126
  */
121
- override add(keyOrNodeOrEntry: BTNodeExemplar<V, N>): N | undefined {
122
- let node: N;
123
- if (this.isNodeKey(keyOrNodeOrEntry)) {
124
- node = this.createNode(keyOrNodeOrEntry, undefined, RBTNColor.RED);
125
- } else if (keyOrNodeOrEntry instanceof RedBlackTreeNode) {
126
- node = keyOrNodeOrEntry;
127
- } else if (keyOrNodeOrEntry === null || keyOrNodeOrEntry === undefined) {
127
+ override exemplarToNode(exemplar: BTNodeExemplar<V, N>): N | undefined {
128
+ let node: N | undefined;
129
+
130
+ if (exemplar === null || exemplar === undefined) {
128
131
  return;
129
- } else if (this.isEntry(keyOrNodeOrEntry)) {
130
- const [key, value] = keyOrNodeOrEntry;
132
+ } else if (this.isNode(exemplar)) {
133
+ node = exemplar;
134
+ } else if (this.isEntry(exemplar)) {
135
+ const [key, value] = exemplar;
131
136
  if (key === undefined || key === null) {
132
137
  return;
133
138
  } else {
134
139
  node = this.createNode(key, value, RBTNColor.RED);
135
140
  }
141
+ } else if (this.isNodeKey(exemplar)) {
142
+ node = this.createNode(exemplar, undefined, RBTNColor.RED);
136
143
  } else {
137
144
  return;
138
145
  }
146
+ return node;
147
+ }
148
+
149
+ /**
150
+ * Time Complexity: O(log n) on average (where n is the number of nodes in the tree)
151
+ * Space Complexity: O(1)
152
+ */
153
+
154
+ /**
155
+ * The function adds a node to a Red-Black Tree data structure.
156
+ * @param keyOrNodeOrEntry - The `keyOrNodeOrEntry` parameter can be one of the following:
157
+ * @returns The method `add` returns either an instance of `N` (the node that was added) or
158
+ * `undefined`.
159
+ */
160
+ override add(keyOrNodeOrEntry: BTNodeExemplar<V, N>): N | undefined {
161
+ const newNode = this.exemplarToNode(keyOrNodeOrEntry);
162
+ if (newNode === undefined) return;
139
163
 
140
- node.left = this.Sentinel;
141
- node.right = this.Sentinel;
164
+ newNode.left = this.Sentinel;
165
+ newNode.right = this.Sentinel;
142
166
 
143
167
  let y: N | undefined = undefined;
144
168
  let x: N | undefined = this.root;
@@ -146,13 +170,13 @@ export class RedBlackTree<V = any, N extends RedBlackTreeNode<V, N> = RedBlackTr
146
170
  while (x !== this.Sentinel) {
147
171
  y = x;
148
172
  if (x) {
149
- if (node.key < x.key) {
173
+ if (newNode.key < x.key) {
150
174
  x = x.left;
151
- } else if (node.key > x.key) {
175
+ } else if (newNode.key > x.key) {
152
176
  x = x?.right;
153
177
  } else {
154
- if (node !== x) {
155
- this._replaceNode(x, node)
178
+ if (newNode !== x) {
179
+ this._replaceNode(x, newNode)
156
180
  }
157
181
  return;
158
182
  }
@@ -160,27 +184,27 @@ export class RedBlackTree<V = any, N extends RedBlackTreeNode<V, N> = RedBlackTr
160
184
 
161
185
  }
162
186
 
163
- node.parent = y;
187
+ newNode.parent = y;
164
188
  if (y === undefined) {
165
- this._setRoot(node);
166
- } else if (node.key < y.key) {
167
- y.left = node;
189
+ this._setRoot(newNode);
190
+ } else if (newNode.key < y.key) {
191
+ y.left = newNode;
168
192
  } else {
169
- y.right = node;
193
+ y.right = newNode;
170
194
  }
171
195
 
172
- if (node.parent === undefined) {
173
- node.color = RBTNColor.BLACK;
196
+ if (newNode.parent === undefined) {
197
+ newNode.color = RBTNColor.BLACK;
174
198
  this._size++;
175
199
  return;
176
200
  }
177
201
 
178
- if (node.parent.parent === undefined) {
202
+ if (newNode.parent.parent === undefined) {
179
203
  this._size++;
180
204
  return;
181
205
  }
182
206
 
183
- this._fixInsert(node);
207
+ this._fixInsert(newNode);
184
208
  this._size++;
185
209
  }
186
210
 
@@ -80,6 +80,45 @@ export class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = TreeMultim
80
80
  }) as TREE;
81
81
  }
82
82
 
83
+ /**
84
+ * The function checks if an exemplar is an instance of the TreeMultimapNode class.
85
+ * @param exemplar - The `exemplar` parameter is of type `BTNodeExemplar<V, N>`.
86
+ * @returns a boolean value indicating whether the exemplar is an instance of the TreeMultimapNode
87
+ * class.
88
+ */
89
+ override isNode(exemplar: BTNodeExemplar<V, N>): exemplar is N {
90
+ return exemplar instanceof TreeMultimapNode;
91
+ }
92
+
93
+ /**
94
+ * The function `exemplarToNode` converts an exemplar object into a node object.
95
+ * @param exemplar - The `exemplar` parameter is of type `BTNodeExemplar<V, N>`, where `V` represents
96
+ * the value type and `N` represents the node type.
97
+ * @param [count=1] - The `count` parameter is an optional parameter that specifies the number of
98
+ * times the node should be created. If not provided, it defaults to 1.
99
+ * @returns a value of type `N` (the generic type parameter) or `undefined`.
100
+ */
101
+ override exemplarToNode(exemplar: BTNodeExemplar<V, N>, count = 1): N | undefined {
102
+ let node: N | undefined;
103
+ if (exemplar === undefined || exemplar === null) {
104
+ return;
105
+ } else if (this.isNode(exemplar)) {
106
+ node = exemplar;
107
+ } else if (this.isEntry(exemplar)) {
108
+ const [key, value] = exemplar;
109
+ if (key === undefined || key === null) {
110
+ return;
111
+ } else {
112
+ node = this.createNode(key, value, count);
113
+ }
114
+ } else if (this.isNodeKey(exemplar)) {
115
+ node = this.createNode(exemplar, undefined, count);
116
+ } else {
117
+ return;
118
+ }
119
+ return node;
120
+ }
121
+
83
122
  /**
84
123
  * Time Complexity: O(log n) - logarithmic time, where "n" is the number of nodes in the tree. The add method of the superclass (AVLTree) has logarithmic time complexity.
85
124
  * Space Complexity: O(1) - constant space, as it doesn't use additional data structures that scale with input size.
@@ -98,23 +137,9 @@ export class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = TreeMultim
98
137
  * @returns either a node (`N`) or `undefined`.
99
138
  */
100
139
  override add(keyOrNodeOrEntry: BTNodeExemplar<V, N>, count = 1): N | undefined {
101
- let newNode: N | undefined;
102
- if (keyOrNodeOrEntry === undefined || keyOrNodeOrEntry === null) {
103
- return;
104
- } else if (keyOrNodeOrEntry instanceof TreeMultimapNode) {
105
- newNode = keyOrNodeOrEntry;
106
- } else if (this.isNodeKey(keyOrNodeOrEntry)) {
107
- newNode = this.createNode(keyOrNodeOrEntry, undefined, count);
108
- } else if (this.isEntry(keyOrNodeOrEntry)) {
109
- const [key, value] = keyOrNodeOrEntry;
110
- if (key === undefined || key === null) {
111
- return;
112
- } else {
113
- newNode = this.createNode(key, value, count);
114
- }
115
- } else {
116
- return;
117
- }
140
+ const newNode = this.exemplarToNode(keyOrNodeOrEntry, count);
141
+ if (newNode === undefined) return;
142
+
118
143
  const orgNodeCount = newNode?.count || 0;
119
144
  const inserted = super.add(newNode);
120
145
  if (inserted) {