data-structure-typed 1.50.6 → 1.50.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.
- package/CHANGELOG.md +1 -1
- package/README.md +27 -24
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +17 -395
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +6 -4
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +3 -3
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +36 -33
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +7 -5
- package/dist/cjs/data-structures/binary-tree/bst.js +68 -47
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +2 -8
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +7 -17
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -2
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/types/common.d.ts +5 -22
- package/dist/cjs/types/common.js +0 -33
- package/dist/cjs/types/common.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +6 -4
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +3 -3
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +36 -33
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +7 -5
- package/dist/mjs/data-structures/binary-tree/bst.js +68 -47
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +2 -8
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +7 -17
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +1 -2
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +2 -2
- package/dist/mjs/types/common.d.ts +5 -22
- package/dist/mjs/types/common.js +1 -32
- package/dist/umd/data-structure-typed.js +112 -138
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +8 -5
- package/src/data-structures/binary-tree/avl-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +35 -36
- package/src/data-structures/binary-tree/bst.ts +67 -44
- package/src/data-structures/binary-tree/rb-tree.ts +11 -22
- package/src/data-structures/binary-tree/tree-multi-map.ts +2 -2
- package/src/types/common.ts +6 -23
- package/test/integration/all-in-one.test.ts +2 -2
- package/test/integration/avl-tree.test.ts +1 -1
- package/test/integration/bst.test.ts +2 -2
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +13 -22
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +12 -17
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +4 -4
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +118 -65
- package/test/unit/data-structures/binary-tree/bst.test.ts +12 -12
- package/test/unit/data-structures/binary-tree/overall.test.ts +7 -7
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +272 -267
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +249 -245
|
@@ -7,7 +7,7 @@ import type {
|
|
|
7
7
|
RedBlackTreeNested,
|
|
8
8
|
RedBlackTreeNodeNested
|
|
9
9
|
} from '../../types';
|
|
10
|
-
import { RBTNColor } from '../../types';
|
|
10
|
+
import { CRUD, RBTNColor } from '../../types';
|
|
11
11
|
import { BST, BSTNode } from './bst';
|
|
12
12
|
import { IBinaryTree } from '../../interfaces';
|
|
13
13
|
|
|
@@ -89,26 +89,16 @@ export class RedBlackTree<
|
|
|
89
89
|
return this._SENTINEL;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
protected _root: NODE | undefined;
|
|
92
|
+
protected override _root: NODE | undefined;
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* The function returns the root node of a tree or undefined if there is no root.
|
|
96
96
|
* @returns The root node of the tree structure, or undefined if there is no root node.
|
|
97
97
|
*/
|
|
98
|
-
get root(): NODE | undefined {
|
|
98
|
+
override get root(): NODE | undefined {
|
|
99
99
|
return this._root;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
protected _size: number = 0;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* The function returns the size of an object.
|
|
106
|
-
* @returns The size of the object, which is a number.
|
|
107
|
-
*/
|
|
108
|
-
get size(): number {
|
|
109
|
-
return this._size;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
102
|
/**
|
|
113
103
|
* The function creates a new Red-Black Tree node with the specified key, value, and color.
|
|
114
104
|
* @param {K} key - The key parameter represents the key of the node being created. It is of type K,
|
|
@@ -208,7 +198,7 @@ export class RedBlackTree<
|
|
|
208
198
|
* @returns a boolean value.
|
|
209
199
|
*/
|
|
210
200
|
override isRealNode(node: NODE | undefined): node is NODE {
|
|
211
|
-
if (node === this.
|
|
201
|
+
if (node === this.SENTINEL || node === undefined) return false;
|
|
212
202
|
return node instanceof RedBlackTreeNode;
|
|
213
203
|
}
|
|
214
204
|
|
|
@@ -244,8 +234,7 @@ export class RedBlackTree<
|
|
|
244
234
|
beginRoot: BSTNKeyOrNode<K, NODE> = this.root,
|
|
245
235
|
iterationType = this.iterationType
|
|
246
236
|
): NODE | null | undefined {
|
|
247
|
-
if ((identifier as any) instanceof RedBlackTreeNode) callback = (node => node) as C;
|
|
248
|
-
beginRoot = this.ensureNode(beginRoot);
|
|
237
|
+
// if ((identifier as any) instanceof RedBlackTreeNode) callback = (node => node) as C;
|
|
249
238
|
return this.getNodes(identifier, callback, true, beginRoot, iterationType)[0] ?? undefined;
|
|
250
239
|
}
|
|
251
240
|
|
|
@@ -262,8 +251,8 @@ export class RedBlackTree<
|
|
|
262
251
|
* size counter to zero.
|
|
263
252
|
*/
|
|
264
253
|
override clear() {
|
|
254
|
+
super.clear();
|
|
265
255
|
this._root = this.SENTINEL;
|
|
266
|
-
this._size = 0;
|
|
267
256
|
}
|
|
268
257
|
|
|
269
258
|
/**
|
|
@@ -290,7 +279,7 @@ export class RedBlackTree<
|
|
|
290
279
|
|
|
291
280
|
const insertStatus = this._insert(newNode);
|
|
292
281
|
|
|
293
|
-
if (insertStatus === '
|
|
282
|
+
if (insertStatus === 'CREATED') {
|
|
294
283
|
// Ensure the root is black
|
|
295
284
|
if (this.isRealNode(this._root)) {
|
|
296
285
|
this._root.color = RBTNColor.BLACK;
|
|
@@ -299,7 +288,7 @@ export class RedBlackTree<
|
|
|
299
288
|
}
|
|
300
289
|
this._size++;
|
|
301
290
|
return true;
|
|
302
|
-
} else return insertStatus === '
|
|
291
|
+
} else return insertStatus === 'UPDATED';
|
|
303
292
|
}
|
|
304
293
|
|
|
305
294
|
/**
|
|
@@ -434,7 +423,7 @@ export class RedBlackTree<
|
|
|
434
423
|
* node in the tree.
|
|
435
424
|
* @returns {'inserted' | 'updated'} - The result of the insertion.
|
|
436
425
|
*/
|
|
437
|
-
protected _insert(node: NODE):
|
|
426
|
+
protected _insert(node: NODE): CRUD {
|
|
438
427
|
let current = this.root;
|
|
439
428
|
let parent: NODE | undefined = undefined;
|
|
440
429
|
|
|
@@ -446,7 +435,7 @@ export class RedBlackTree<
|
|
|
446
435
|
current = current.right ?? this.SENTINEL;
|
|
447
436
|
} else {
|
|
448
437
|
this._replaceNode(current, node);
|
|
449
|
-
return '
|
|
438
|
+
return 'UPDATED';
|
|
450
439
|
}
|
|
451
440
|
}
|
|
452
441
|
|
|
@@ -465,7 +454,7 @@ export class RedBlackTree<
|
|
|
465
454
|
node.color = RBTNColor.RED;
|
|
466
455
|
|
|
467
456
|
this._insertFixup(node);
|
|
468
|
-
return '
|
|
457
|
+
return 'CREATED';
|
|
469
458
|
}
|
|
470
459
|
|
|
471
460
|
/**
|
|
@@ -14,7 +14,7 @@ import type {
|
|
|
14
14
|
TreeMultiMapNodeNested,
|
|
15
15
|
TreeMultiMapOptions
|
|
16
16
|
} from '../../types';
|
|
17
|
-
import {
|
|
17
|
+
import { RBTNColor } from '../../types';
|
|
18
18
|
import { IBinaryTree } from '../../interfaces';
|
|
19
19
|
import { RedBlackTree, RedBlackTreeNode } from './rb-tree';
|
|
20
20
|
|
|
@@ -363,7 +363,7 @@ export class TreeMultiMap<
|
|
|
363
363
|
|
|
364
364
|
this.clear();
|
|
365
365
|
|
|
366
|
-
if (iterationType ===
|
|
366
|
+
if (iterationType === 'RECURSIVE') {
|
|
367
367
|
const buildBalanceBST = (l: number, r: number) => {
|
|
368
368
|
if (l > r) return;
|
|
369
369
|
const m = l + Math.floor((r - l) / 2);
|
package/src/types/common.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
INVERSE = 'INVERSE'
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export enum CP {
|
|
7
|
-
lt = 'lt',
|
|
8
|
-
eq = 'eq',
|
|
9
|
-
gt = 'gt'
|
|
10
|
-
}
|
|
1
|
+
export type BSTVariant = 'STANDARD' | 'INVERSE';
|
|
2
|
+
export type CP = 'LT' | 'EQ' | 'GT';
|
|
11
3
|
|
|
12
4
|
/**
|
|
13
5
|
* Enum representing different loop types.
|
|
@@ -15,20 +7,9 @@ export enum CP {
|
|
|
15
7
|
* - `iterative`: Indicates the iterative loop type (with loops that use iterations).
|
|
16
8
|
* - `recursive`: Indicates the recursive loop type (with loops that call themselves).
|
|
17
9
|
*/
|
|
18
|
-
export
|
|
19
|
-
ITERATIVE = 'ITERATIVE',
|
|
20
|
-
RECURSIVE = 'RECURSIVE'
|
|
21
|
-
}
|
|
10
|
+
export type IterationType = 'ITERATIVE' | 'RECURSIVE';
|
|
22
11
|
|
|
23
|
-
export
|
|
24
|
-
ROOT = 'ROOT',
|
|
25
|
-
LEFT = 'LEFT',
|
|
26
|
-
RIGHT = 'RIGHT',
|
|
27
|
-
ROOT_LEFT = 'ROOT_LEFT',
|
|
28
|
-
ROOT_RIGHT = 'ROOT_RIGHT',
|
|
29
|
-
ISOLATED = 'ISOLATED',
|
|
30
|
-
MAL_NODE = 'MAL_NODE'
|
|
31
|
-
}
|
|
12
|
+
export type FamilyPosition = 'ROOT' | 'LEFT' | 'RIGHT' | 'ROOT_LEFT' | 'ROOT_RIGHT' | 'ISOLATED' | 'MAL_NODE';
|
|
32
13
|
|
|
33
14
|
export type Comparator<K> = (a: K, b: K) => number;
|
|
34
15
|
|
|
@@ -63,3 +44,5 @@ export type BTNodePureExemplar<K, V, N> = [K, V | undefined] | BTNodePureKeyOrNo
|
|
|
63
44
|
export type BSTNKeyOrNode<K, N> = K | undefined | N;
|
|
64
45
|
|
|
65
46
|
export type BinaryTreeDeleteResult<N> = { deleted: N | null | undefined; needBalanced: N | null | undefined };
|
|
47
|
+
|
|
48
|
+
export type CRUD = 'CREATED' | 'READ' | 'UPDATED' | 'DELETED';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVLTree
|
|
1
|
+
import { AVLTree } from 'data-structure-typed';
|
|
2
2
|
|
|
3
3
|
describe('AVL Tree Test from data-structure-typed', () => {
|
|
4
4
|
it('should perform various operations on a AVL Tree from data-structure-typed', () => {
|
|
@@ -27,7 +27,7 @@ describe('AVL Tree Test from data-structure-typed', () => {
|
|
|
27
27
|
expect(subTreeSum).toBe(70);
|
|
28
28
|
|
|
29
29
|
let lesserSum = 0;
|
|
30
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
30
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
31
31
|
expect(lesserSum).toBe(45);
|
|
32
32
|
|
|
33
33
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
@@ -40,7 +40,7 @@ describe('AVL Tree Test', () => {
|
|
|
40
40
|
expect(getMinNodeBySpecificNode?.key).toBe(12);
|
|
41
41
|
|
|
42
42
|
let subTreeSum = 0;
|
|
43
|
-
node15 && tree.
|
|
43
|
+
node15 && tree.dfs(node => (subTreeSum += node.key), 'in', 15);
|
|
44
44
|
expect(subTreeSum).toBe(70);
|
|
45
45
|
|
|
46
46
|
let lesserSum = 0;
|
|
@@ -34,7 +34,7 @@ describe('Individual package BST operations test', () => {
|
|
|
34
34
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
35
35
|
|
|
36
36
|
let subTreeSum = 0;
|
|
37
|
-
node15 && bst.
|
|
37
|
+
node15 && bst.dfs(node => (subTreeSum += node.key), 'in', 15);
|
|
38
38
|
expect(subTreeSum).toBe(70);
|
|
39
39
|
|
|
40
40
|
let lesserSum = 0;
|
|
@@ -231,7 +231,7 @@ describe('Individual package BST operations test', () => {
|
|
|
231
231
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
232
232
|
|
|
233
233
|
let subTreeSum = 0;
|
|
234
|
-
node15 && objBST.
|
|
234
|
+
node15 && objBST.dfs(node => (subTreeSum += node.key), 'in', node15);
|
|
235
235
|
expect(subTreeSum).toBe(70);
|
|
236
236
|
|
|
237
237
|
let lesserSum = 0;
|
|
@@ -11,23 +11,25 @@ const randomArray = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND - 1,
|
|
|
11
11
|
const cOrderedMap = new OrderedMap<number, number>();
|
|
12
12
|
|
|
13
13
|
suite
|
|
14
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add
|
|
14
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
|
|
15
|
+
rbTree.clear();
|
|
15
16
|
for (let i = 0; i < randomArray.length; i++) rbTree.add(i);
|
|
16
17
|
})
|
|
17
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()}
|
|
18
|
-
for (let i = 0; i < randomArray.length; i++) rbTree.
|
|
19
|
-
})
|
|
20
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add randomly`, () => {
|
|
21
|
-
rbTree.clear();
|
|
22
|
-
for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
|
|
18
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} get`, () => {
|
|
19
|
+
for (let i = 0; i < randomArray.length; i++) rbTree.get(randomArray[i]);
|
|
23
20
|
})
|
|
24
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()}
|
|
25
|
-
|
|
21
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} iterator`, () => {
|
|
22
|
+
const entries = [...rbTree];
|
|
23
|
+
return entries.length === HUNDRED_THOUSAND;
|
|
26
24
|
})
|
|
27
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add orderly`, () => {
|
|
25
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete orderly`, () => {
|
|
26
|
+
rbTree.clear();
|
|
28
27
|
for (let i = 0; i < randomArray.length; i++) rbTree.add(i);
|
|
28
|
+
for (let i = 0; i < randomArray.length; i++) rbTree.delete(i);
|
|
29
29
|
})
|
|
30
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} delete randomly`, () => {
|
|
30
|
+
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete randomly`, () => {
|
|
31
|
+
rbTree.clear();
|
|
32
|
+
for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
|
|
31
33
|
for (let i = 0; i < randomArray.length; i++) rbTree.delete(randomArray[i]);
|
|
32
34
|
});
|
|
33
35
|
|
|
@@ -37,15 +39,4 @@ if (isCompetitor) {
|
|
|
37
39
|
});
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} getNode randomly`, () => {
|
|
41
|
-
for (let i = 0; i < randomArray.length; i++) rbTree.getNode(randomArray[i]);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add & iterator`, () => {
|
|
45
|
-
rbTree.clear();
|
|
46
|
-
for (let i = 0; i < randomArray.length; i++) rbTree.add(randomArray[i]);
|
|
47
|
-
const entries = [...rbTree];
|
|
48
|
-
return entries.length === HUNDRED_THOUSAND;
|
|
49
|
-
});
|
|
50
|
-
|
|
51
42
|
export { suite };
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AVLTreeMultiMap,
|
|
3
|
-
AVLTreeMultiMapNode,
|
|
4
|
-
AVLTreeNode,
|
|
5
|
-
BinaryTreeNode,
|
|
6
|
-
BSTNode,
|
|
7
|
-
CP,
|
|
8
|
-
IterationType
|
|
9
|
-
} from '../../../../src';
|
|
1
|
+
import { AVLTreeMultiMap, AVLTreeMultiMapNode, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
|
|
10
2
|
import { isDebugTest } from '../../../config';
|
|
11
3
|
|
|
12
4
|
const isDebug = isDebugTest;
|
|
@@ -35,8 +27,11 @@ describe('AVLTreeMultiMap count', () => {
|
|
|
35
27
|
[2, 2],
|
|
36
28
|
[3, 3]
|
|
37
29
|
]);
|
|
38
|
-
tm.
|
|
39
|
-
|
|
30
|
+
tm.add([2, 2], undefined, 10);
|
|
31
|
+
tm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
|
|
32
|
+
tm.delete(2);
|
|
33
|
+
expect(tm.count).toBe(12);
|
|
34
|
+
expect(tm.getMutableCount()).toBe(16);
|
|
40
35
|
});
|
|
41
36
|
});
|
|
42
37
|
|
|
@@ -99,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
99
94
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
100
95
|
expect(subTreeSum).toBe(31);
|
|
101
96
|
let lesserSum = 0;
|
|
102
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
97
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
|
|
103
98
|
expect(lesserSum).toBe(45);
|
|
104
99
|
|
|
105
100
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -110,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
110
105
|
const node11 = treeMultimap.getNode(11);
|
|
111
106
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
112
107
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
113
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
108
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
|
|
114
109
|
expect(allGreaterNodesAdded);
|
|
115
110
|
}
|
|
116
111
|
|
|
@@ -296,7 +291,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
296
291
|
|
|
297
292
|
describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
298
293
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
299
|
-
const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType:
|
|
294
|
+
const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
|
|
300
295
|
|
|
301
296
|
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
302
297
|
treeMultimap.add([11, 11]);
|
|
@@ -353,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
353
348
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
354
349
|
expect(subTreeSum).toBe(31);
|
|
355
350
|
let lesserSum = 0;
|
|
356
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
351
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
|
|
357
352
|
expect(lesserSum).toBe(45);
|
|
358
353
|
|
|
359
354
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -364,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
364
359
|
const node11 = treeMultimap.getNode(11);
|
|
365
360
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
366
361
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
367
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
362
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
|
|
368
363
|
expect(allGreaterNodesAdded);
|
|
369
364
|
}
|
|
370
365
|
|
|
@@ -569,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
|
|
|
569
564
|
}
|
|
570
565
|
isDebug && console.log('---add', performance.now() - start);
|
|
571
566
|
const startL = performance.now();
|
|
572
|
-
treeMS.lesserOrGreaterTraverse(node => (node.count += 1),
|
|
567
|
+
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), 'LT', inputSize / 2);
|
|
573
568
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
574
569
|
});
|
|
575
570
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode
|
|
1
|
+
import { AVLTree, AVLTreeNode, BinaryTreeNode, BSTNode } from '../../../../src';
|
|
2
2
|
|
|
3
3
|
describe('AVL Tree Test', () => {
|
|
4
4
|
it('should perform various operations on a AVL Tree', () => {
|
|
@@ -28,7 +28,7 @@ describe('AVL Tree Test', () => {
|
|
|
28
28
|
expect(subTreeSum).toBe(70);
|
|
29
29
|
|
|
30
30
|
let lesserSum = 0;
|
|
31
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
31
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
32
32
|
expect(lesserSum).toBe(45);
|
|
33
33
|
|
|
34
34
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
@@ -112,7 +112,7 @@ describe('AVL Tree Test', () => {
|
|
|
112
112
|
describe('AVL Tree Test recursively', () => {
|
|
113
113
|
it('should perform various operations on a AVL Tree', () => {
|
|
114
114
|
const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
115
|
-
const tree = new AVLTree<number>([], { iterationType:
|
|
115
|
+
const tree = new AVLTree<number>([], { iterationType: 'RECURSIVE' });
|
|
116
116
|
|
|
117
117
|
for (const i of arr) tree.add([i, i]);
|
|
118
118
|
|
|
@@ -136,7 +136,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
136
136
|
expect(subTreeSum).toBe(70);
|
|
137
137
|
|
|
138
138
|
let lesserSum = 0;
|
|
139
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
139
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
140
140
|
expect(lesserSum).toBe(45);
|
|
141
141
|
|
|
142
142
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|