data-structure-typed 1.42.5 → 1.42.7
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/CHANGELOG.md +1 -1
- package/CONTRIBUTING.md +66 -5
- package/README.md +218 -126
- package/benchmark/report.html +12 -12
- package/benchmark/report.json +101 -101
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.d.ts +5 -5
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js +19 -14
- package/dist/cjs/src/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.d.ts +108 -60
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js +189 -89
- package/dist/cjs/src/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/bst.d.ts +30 -8
- package/dist/cjs/src/data-structures/binary-tree/bst.js +77 -28
- package/dist/cjs/src/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +35 -28
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +44 -45
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.d.ts +7 -12
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js +38 -37
- package/dist/cjs/src/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/src/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.js +6 -0
- package/dist/cjs/src/types/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/rb-tree.d.ts +2 -2
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.d.ts +5 -5
- package/dist/mjs/src/data-structures/binary-tree/avl-tree.js +19 -14
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.d.ts +108 -60
- package/dist/mjs/src/data-structures/binary-tree/binary-tree.js +191 -89
- package/dist/mjs/src/data-structures/binary-tree/bst.d.ts +30 -8
- package/dist/mjs/src/data-structures/binary-tree/bst.js +78 -27
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +35 -28
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +43 -45
- package/dist/mjs/src/data-structures/binary-tree/tree-multimap.d.ts +7 -12
- package/dist/mjs/src/data-structures/binary-tree/tree-multimap.js +38 -37
- package/dist/mjs/src/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/src/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/binary-tree.js +6 -0
- package/dist/mjs/src/types/data-structures/binary-tree/rb-tree.d.ts +2 -2
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -5
- package/src/data-structures/binary-tree/avl-tree.ts +24 -18
- package/src/data-structures/binary-tree/binary-tree.ts +248 -142
- package/src/data-structures/binary-tree/bst.ts +88 -38
- package/src/data-structures/binary-tree/rb-tree.ts +52 -58
- package/src/data-structures/binary-tree/tree-multimap.ts +50 -54
- package/src/interfaces/binary-tree.ts +2 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +7 -1
- package/src/types/data-structures/binary-tree/rb-tree.ts +2 -2
- package/test/performance/reportor.ts +2 -2
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +9 -9
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @license MIT License
|
|
7
7
|
*/
|
|
8
8
|
import type { BTNKey, TreeMultimapNodeNested, TreeMultimapOptions } from '../../types';
|
|
9
|
-
import {
|
|
9
|
+
import { BiTreeDeleteResult, BTNCallback, IterationType } from '../../types';
|
|
10
10
|
import { IBinaryTree } from '../../interfaces';
|
|
11
11
|
import { AVLTree, AVLTreeNode } from './avl-tree';
|
|
12
12
|
export declare class TreeMultimapNode<V = any, N extends TreeMultimapNode<V, N> = TreeMultimapNodeNested<V>> extends AVLTreeNode<V, N> {
|
|
@@ -68,7 +68,7 @@ export declare class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = Tr
|
|
|
68
68
|
* be added as a child.
|
|
69
69
|
* @returns The method `_addTo` returns either the `parent.left`, `parent.right`, or `undefined`.
|
|
70
70
|
*/
|
|
71
|
-
_addTo(newNode: N | undefined, parent: N): N | undefined;
|
|
71
|
+
protected _addTo(newNode: N | undefined, parent: BTNKey | N | undefined): N | undefined;
|
|
72
72
|
/**
|
|
73
73
|
* The `addMany` function adds multiple keys or nodes to a TreeMultimap and returns an array of the
|
|
74
74
|
* inserted nodes.
|
|
@@ -79,7 +79,7 @@ export declare class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = Tr
|
|
|
79
79
|
* each key or node.
|
|
80
80
|
* @returns The function `addMany` returns an array of `N`, `undefined`, or `undefined` values.
|
|
81
81
|
*/
|
|
82
|
-
addMany(keysOrNodes: (BTNKey |
|
|
82
|
+
addMany(keysOrNodes: (BTNKey | N | undefined)[], data?: V[]): (N | undefined)[];
|
|
83
83
|
/**
|
|
84
84
|
* The `perfectlyBalance` function in TypeScript takes a sorted array of nodes and builds a balanced
|
|
85
85
|
* binary search tree using either a recursive or iterative approach.
|
|
@@ -98,14 +98,14 @@ export declare class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = Tr
|
|
|
98
98
|
* @param callback - The `callback` parameter is a function that takes a node as input and returns a
|
|
99
99
|
* value. This value is compared with the `identifier` parameter to determine if the node should be
|
|
100
100
|
* included in the result. The `callback` parameter has a default value of
|
|
101
|
-
* `this.
|
|
101
|
+
* `this._defaultOneParamCallback`
|
|
102
102
|
* @param [ignoreCount=false] - A boolean flag indicating whether to ignore the count of the node
|
|
103
103
|
* being deleted. If set to true, the count of the node will not be considered and the node will be
|
|
104
104
|
* deleted regardless of its count. If set to false (default), the count of the node will be
|
|
105
105
|
* decremented by 1 and
|
|
106
|
-
* @returns The method `delete` returns an array of `
|
|
106
|
+
* @returns The method `delete` returns an array of `BiTreeDeleteResult<N>` objects.
|
|
107
107
|
*/
|
|
108
|
-
delete<C extends BTNCallback<N>>(identifier: ReturnType<C>, callback?: C, ignoreCount?: boolean):
|
|
108
|
+
delete<C extends BTNCallback<N>>(identifier: ReturnType<C>, callback?: C, ignoreCount?: boolean): BiTreeDeleteResult<N>[];
|
|
109
109
|
/**
|
|
110
110
|
* The clear() function clears the contents of a data structure and sets the count to zero.
|
|
111
111
|
*/
|
|
@@ -117,10 +117,5 @@ export declare class TreeMultimap<V = any, N extends TreeMultimapNode<V, N> = Tr
|
|
|
117
117
|
* from `srcNode` will be swapped into.
|
|
118
118
|
* @returns The method is returning the `destNode` after swapping its properties with the `srcNode`.
|
|
119
119
|
*/
|
|
120
|
-
protected _swap(srcNode: N, destNode: N): N;
|
|
121
|
-
/**
|
|
122
|
-
* The function sets the value of the "_count" property.
|
|
123
|
-
* @param {number} v - number
|
|
124
|
-
*/
|
|
125
|
-
protected _setCount(v: number): void;
|
|
120
|
+
protected _swap(srcNode: BTNKey | N | undefined, destNode: BTNKey | N | undefined): N | undefined;
|
|
126
121
|
}
|
|
@@ -79,7 +79,8 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
79
79
|
if (!this.root) {
|
|
80
80
|
this._setRoot(newNode);
|
|
81
81
|
this._size = this.size + 1;
|
|
82
|
-
|
|
82
|
+
if (newNode)
|
|
83
|
+
this._count += newNode.count;
|
|
83
84
|
inserted = this.root;
|
|
84
85
|
}
|
|
85
86
|
else {
|
|
@@ -91,7 +92,7 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
91
92
|
if (this._compare(cur.key, newNode.key) === types_1.CP.eq) {
|
|
92
93
|
cur.value = newNode.value;
|
|
93
94
|
cur.count += newNode.count;
|
|
94
|
-
this.
|
|
95
|
+
this._count += newNode.count;
|
|
95
96
|
traversing = false;
|
|
96
97
|
inserted = cur;
|
|
97
98
|
}
|
|
@@ -101,7 +102,7 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
101
102
|
//Add to the left of the current node
|
|
102
103
|
cur.left = newNode;
|
|
103
104
|
this._size = this.size + 1;
|
|
104
|
-
this.
|
|
105
|
+
this._count += newNode.count;
|
|
105
106
|
traversing = false;
|
|
106
107
|
inserted = cur.left;
|
|
107
108
|
}
|
|
@@ -117,7 +118,7 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
117
118
|
//Add to the right of the current node
|
|
118
119
|
cur.right = newNode;
|
|
119
120
|
this._size = this.size + 1;
|
|
120
|
-
this.
|
|
121
|
+
this._count += newNode.count;
|
|
121
122
|
traversing = false;
|
|
122
123
|
inserted = cur.right;
|
|
123
124
|
}
|
|
@@ -150,12 +151,13 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
150
151
|
* @returns The method `_addTo` returns either the `parent.left`, `parent.right`, or `undefined`.
|
|
151
152
|
*/
|
|
152
153
|
_addTo(newNode, parent) {
|
|
154
|
+
parent = this.ensureNotKey(parent);
|
|
153
155
|
if (parent) {
|
|
154
156
|
if (parent.left === undefined) {
|
|
155
157
|
parent.left = newNode;
|
|
156
158
|
if (newNode !== undefined) {
|
|
157
159
|
this._size = this.size + 1;
|
|
158
|
-
this.
|
|
160
|
+
this._count += newNode.count;
|
|
159
161
|
}
|
|
160
162
|
return parent.left;
|
|
161
163
|
}
|
|
@@ -163,7 +165,7 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
163
165
|
parent.right = newNode;
|
|
164
166
|
if (newNode !== undefined) {
|
|
165
167
|
this._size = this.size + 1;
|
|
166
|
-
this.
|
|
168
|
+
this._count += newNode.count;
|
|
167
169
|
}
|
|
168
170
|
return parent.right;
|
|
169
171
|
}
|
|
@@ -254,25 +256,25 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
254
256
|
* @param callback - The `callback` parameter is a function that takes a node as input and returns a
|
|
255
257
|
* value. This value is compared with the `identifier` parameter to determine if the node should be
|
|
256
258
|
* included in the result. The `callback` parameter has a default value of
|
|
257
|
-
* `this.
|
|
259
|
+
* `this._defaultOneParamCallback`
|
|
258
260
|
* @param [ignoreCount=false] - A boolean flag indicating whether to ignore the count of the node
|
|
259
261
|
* being deleted. If set to true, the count of the node will not be considered and the node will be
|
|
260
262
|
* deleted regardless of its count. If set to false (default), the count of the node will be
|
|
261
263
|
* decremented by 1 and
|
|
262
|
-
* @returns The method `delete` returns an array of `
|
|
264
|
+
* @returns The method `delete` returns an array of `BiTreeDeleteResult<N>` objects.
|
|
263
265
|
*/
|
|
264
|
-
delete(identifier, callback = this.
|
|
265
|
-
const
|
|
266
|
+
delete(identifier, callback = this._defaultOneParamCallback, ignoreCount = false) {
|
|
267
|
+
const deletedResult = [];
|
|
266
268
|
if (!this.root)
|
|
267
|
-
return
|
|
269
|
+
return deletedResult;
|
|
268
270
|
const curr = this.getNode(identifier, callback) ?? undefined;
|
|
269
271
|
if (!curr)
|
|
270
|
-
return
|
|
272
|
+
return deletedResult;
|
|
271
273
|
const parent = curr?.parent ? curr.parent : undefined;
|
|
272
274
|
let needBalanced = undefined, orgCurrent = curr;
|
|
273
275
|
if (curr.count > 1 && !ignoreCount) {
|
|
274
276
|
curr.count--;
|
|
275
|
-
this.
|
|
277
|
+
this._count--;
|
|
276
278
|
}
|
|
277
279
|
else {
|
|
278
280
|
if (!curr.left) {
|
|
@@ -309,20 +311,21 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
309
311
|
}
|
|
310
312
|
this._size = this.size - 1;
|
|
311
313
|
// TODO How to handle when the count of target node is lesser than current node's count
|
|
312
|
-
|
|
314
|
+
if (orgCurrent)
|
|
315
|
+
this._count -= orgCurrent.count;
|
|
313
316
|
}
|
|
314
|
-
|
|
317
|
+
deletedResult.push({ deleted: orgCurrent, needBalanced });
|
|
315
318
|
if (needBalanced) {
|
|
316
319
|
this._balancePath(needBalanced);
|
|
317
320
|
}
|
|
318
|
-
return
|
|
321
|
+
return deletedResult;
|
|
319
322
|
}
|
|
320
323
|
/**
|
|
321
324
|
* The clear() function clears the contents of a data structure and sets the count to zero.
|
|
322
325
|
*/
|
|
323
326
|
clear() {
|
|
324
327
|
super.clear();
|
|
325
|
-
this.
|
|
328
|
+
this._count = 0;
|
|
326
329
|
}
|
|
327
330
|
/**
|
|
328
331
|
* The function swaps the values of two nodes in a binary tree.
|
|
@@ -332,27 +335,25 @@ class TreeMultimap extends avl_tree_1.AVLTree {
|
|
|
332
335
|
* @returns The method is returning the `destNode` after swapping its properties with the `srcNode`.
|
|
333
336
|
*/
|
|
334
337
|
_swap(srcNode, destNode) {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
338
|
+
srcNode = this.ensureNotKey(srcNode);
|
|
339
|
+
destNode = this.ensureNotKey(destNode);
|
|
340
|
+
if (srcNode && destNode) {
|
|
341
|
+
const { key, value, count, height } = destNode;
|
|
342
|
+
const tempNode = this.createNode(key, value, count);
|
|
343
|
+
if (tempNode) {
|
|
344
|
+
tempNode.height = height;
|
|
345
|
+
destNode.key = srcNode.key;
|
|
346
|
+
destNode.value = srcNode.value;
|
|
347
|
+
destNode.count = srcNode.count;
|
|
348
|
+
destNode.height = srcNode.height;
|
|
349
|
+
srcNode.key = tempNode.key;
|
|
350
|
+
srcNode.value = tempNode.value;
|
|
351
|
+
srcNode.count = tempNode.count;
|
|
352
|
+
srcNode.height = tempNode.height;
|
|
353
|
+
}
|
|
354
|
+
return destNode;
|
|
347
355
|
}
|
|
348
|
-
return
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* The function sets the value of the "_count" property.
|
|
352
|
-
* @param {number} v - number
|
|
353
|
-
*/
|
|
354
|
-
_setCount(v) {
|
|
355
|
-
this._count = v;
|
|
356
|
+
return undefined;
|
|
356
357
|
}
|
|
357
358
|
}
|
|
358
359
|
exports.TreeMultimap = TreeMultimap;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BinaryTreeNode } from '../data-structures';
|
|
2
|
-
import {
|
|
2
|
+
import { BiTreeDeleteResult, BinaryTreeNodeNested, BTNCallback, BTNKey } from '../types';
|
|
3
3
|
export interface IBinaryTree<V = any, N extends BinaryTreeNode<V, N> = BinaryTreeNodeNested<V>> {
|
|
4
4
|
createNode(key: BTNKey, value?: N['value']): N;
|
|
5
5
|
add(keyOrNode: BTNKey | N | null, value?: N['value']): N | null | undefined;
|
|
6
|
-
delete<C extends BTNCallback<N>>(identifier: ReturnType<C> | null, callback: C):
|
|
6
|
+
delete<C extends BTNCallback<N>>(identifier: ReturnType<C> | null, callback: C): BiTreeDeleteResult<N>[];
|
|
7
7
|
}
|
|
@@ -19,7 +19,7 @@ export declare enum FamilyPosition {
|
|
|
19
19
|
MAL_NODE = "MAL_NODE"
|
|
20
20
|
}
|
|
21
21
|
export type BTNKey = number;
|
|
22
|
-
export type
|
|
22
|
+
export type BiTreeDeleteResult<N> = {
|
|
23
23
|
deleted: N | null | undefined;
|
|
24
24
|
needBalanced: N | null | undefined;
|
|
25
25
|
};
|
|
@@ -22,3 +22,9 @@ var FamilyPosition;
|
|
|
22
22
|
FamilyPosition["ISOLATED"] = "ISOLATED";
|
|
23
23
|
FamilyPosition["MAL_NODE"] = "MAL_NODE";
|
|
24
24
|
})(FamilyPosition || (exports.FamilyPosition = FamilyPosition = {}));
|
|
25
|
+
//
|
|
26
|
+
// export type BTNIdentifierOrNU<N> = BTNKey | N | null | undefined;
|
|
27
|
+
//
|
|
28
|
+
// export type BTNIdentifierOrU<N> = BTNKey | N | undefined;
|
|
29
|
+
//
|
|
30
|
+
// export type BTNOrNU<N> = N | null | undefined;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RedBlackTreeNode } from '../../../data-structures';
|
|
2
2
|
import { BSTOptions } from "./bst";
|
|
3
3
|
export declare enum RBTNColor {
|
|
4
4
|
RED = 1,
|
|
5
5
|
BLACK = 0
|
|
6
6
|
}
|
|
7
|
-
export type
|
|
7
|
+
export type RedBlackTreeNodeNested<T> = RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, RedBlackTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
|
|
8
8
|
export type RBTreeOptions = BSTOptions & {};
|