data-structure-typed 1.50.7 → 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 -19
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +16 -394
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -2
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -4
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.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 +23 -24
- 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 +59 -38
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +6 -7
- 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 -28
- package/dist/cjs/types/common.js +0 -40
- package/dist/cjs/types/common.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -2
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +3 -4
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +3 -3
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +23 -24
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +7 -5
- package/dist/mjs/data-structures/binary-tree/bst.js +59 -38
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +7 -8
- 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 -28
- package/dist/mjs/types/common.js +1 -39
- package/dist/umd/data-structure-typed.js +86 -118
- 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 +3 -4
- package/src/data-structures/binary-tree/binary-tree.ts +23 -26
- package/src/data-structures/binary-tree/bst.ts +59 -36
- package/src/data-structures/binary-tree/rb-tree.ts +6 -6
- package/src/data-structures/binary-tree/tree-multi-map.ts +2 -2
- package/src/types/common.ts +5 -29
- 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 +8 -16
- 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 +10 -5
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +7 -15
|
@@ -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;
|
|
@@ -36,7 +28,7 @@ describe('AVLTreeMultiMap count', () => {
|
|
|
36
28
|
[3, 3]
|
|
37
29
|
]);
|
|
38
30
|
tm.add([2, 2], undefined, 10);
|
|
39
|
-
tm.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
31
|
+
tm.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 1);
|
|
40
32
|
tm.delete(2);
|
|
41
33
|
expect(tm.count).toBe(12);
|
|
42
34
|
expect(tm.getMutableCount()).toBe(16);
|
|
@@ -102,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
102
94
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
103
95
|
expect(subTreeSum).toBe(31);
|
|
104
96
|
let lesserSum = 0;
|
|
105
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
97
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
|
|
106
98
|
expect(lesserSum).toBe(45);
|
|
107
99
|
|
|
108
100
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -113,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
113
105
|
const node11 = treeMultimap.getNode(11);
|
|
114
106
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
115
107
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
116
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
108
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
|
|
117
109
|
expect(allGreaterNodesAdded);
|
|
118
110
|
}
|
|
119
111
|
|
|
@@ -299,7 +291,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
299
291
|
|
|
300
292
|
describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
301
293
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
302
|
-
const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType:
|
|
294
|
+
const treeMultimap = new AVLTreeMultiMap<number>([], { iterationType: 'RECURSIVE' });
|
|
303
295
|
|
|
304
296
|
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
305
297
|
treeMultimap.add([11, 11]);
|
|
@@ -356,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
356
348
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'pre', 15);
|
|
357
349
|
expect(subTreeSum).toBe(31);
|
|
358
350
|
let lesserSum = 0;
|
|
359
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
351
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), 'LT', 10);
|
|
360
352
|
expect(lesserSum).toBe(45);
|
|
361
353
|
|
|
362
354
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -367,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
367
359
|
const node11 = treeMultimap.getNode(11);
|
|
368
360
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
369
361
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
370
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
362
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 'GT', 11);
|
|
371
363
|
expect(allGreaterNodesAdded);
|
|
372
364
|
}
|
|
373
365
|
|
|
@@ -572,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
|
|
|
572
564
|
}
|
|
573
565
|
isDebug && console.log('---add', performance.now() - start);
|
|
574
566
|
const startL = performance.now();
|
|
575
|
-
treeMS.lesserOrGreaterTraverse(node => (node.count += 1),
|
|
567
|
+
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), 'LT', inputSize / 2);
|
|
576
568
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
577
569
|
});
|
|
578
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.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTree, BinaryTreeNode
|
|
1
|
+
import { BinaryTree, BinaryTreeNode } from '../../../../src';
|
|
2
2
|
import { getRandomIntArray } from '../../../utils';
|
|
3
3
|
// import { isDebugTest } from '../../../config';
|
|
4
4
|
|
|
@@ -81,7 +81,7 @@ describe('BinaryTreeNode', () => {
|
|
|
81
81
|
root.right = rightChild;
|
|
82
82
|
|
|
83
83
|
expect(rightChild.familyPosition).toBe('RIGHT');
|
|
84
|
-
expect(isolated.familyPosition).toBe(
|
|
84
|
+
expect(isolated.familyPosition).toBe('ISOLATED');
|
|
85
85
|
expect(root.familyPosition).toBe('ROOT');
|
|
86
86
|
});
|
|
87
87
|
});
|
|
@@ -104,7 +104,7 @@ describe('BinaryTree', () => {
|
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
it('should delete nodes', () => {
|
|
107
|
-
expect(tree.getHeight(tree.root,
|
|
107
|
+
expect(tree.getHeight(tree.root, 'ITERATIVE')).toBe(-1);
|
|
108
108
|
expect(tree.getMinHeight()).toBe(-1);
|
|
109
109
|
const node1 = tree.createNode(1);
|
|
110
110
|
tree.add(node1);
|
|
@@ -132,7 +132,7 @@ describe('BinaryTree', () => {
|
|
|
132
132
|
const result = tree.delete(node1);
|
|
133
133
|
expect(result).toHaveLength(1);
|
|
134
134
|
expect(tree.size).toBe(4);
|
|
135
|
-
expect(tree.getMinHeight(tree.root,
|
|
135
|
+
expect(tree.getMinHeight(tree.root, 'RECURSIVE')).toBe(1);
|
|
136
136
|
}
|
|
137
137
|
});
|
|
138
138
|
|
|
@@ -171,16 +171,25 @@ describe('BinaryTree', () => {
|
|
|
171
171
|
expect(cloned.root?.right?.key).toBe(6);
|
|
172
172
|
expect(cloned.root?.right?.left?.key).toBe(3);
|
|
173
173
|
expect(cloned.root?.right?.right).toBe(null);
|
|
174
|
-
expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6),
|
|
175
|
-
expect(
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
expect(
|
|
182
|
-
|
|
183
|
-
|
|
174
|
+
expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
175
|
+
expect(cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
176
|
+
6,
|
|
177
|
+
3,
|
|
178
|
+
7,
|
|
179
|
+
null
|
|
180
|
+
]);
|
|
181
|
+
expect(cloned.dfs(node => (node ? node.key : node), 'pre', cloned.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
182
|
+
6,
|
|
183
|
+
3,
|
|
184
|
+
7,
|
|
185
|
+
null
|
|
186
|
+
]);
|
|
187
|
+
expect(cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), 'RECURSIVE', true)).toEqual([
|
|
188
|
+
6,
|
|
189
|
+
3,
|
|
190
|
+
7,
|
|
191
|
+
null
|
|
192
|
+
]);
|
|
184
193
|
cloned.delete(6);
|
|
185
194
|
cloned.delete(3);
|
|
186
195
|
cloned.delete(7);
|
|
@@ -234,9 +243,9 @@ describe('BinaryTree', () => {
|
|
|
234
243
|
tree.add(4);
|
|
235
244
|
tree.add(2);
|
|
236
245
|
expect(tree.getHeight()).toBe(1);
|
|
237
|
-
tree.iterationType =
|
|
246
|
+
tree.iterationType = 'RECURSIVE';
|
|
238
247
|
expect(tree.getHeight()).toBe(1);
|
|
239
|
-
tree.iterationType =
|
|
248
|
+
tree.iterationType = 'ITERATIVE';
|
|
240
249
|
|
|
241
250
|
tree.add(6);
|
|
242
251
|
tree.add(1);
|
|
@@ -252,9 +261,9 @@ describe('BinaryTree', () => {
|
|
|
252
261
|
it('should getLeftMost', () => {
|
|
253
262
|
tree.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
254
263
|
|
|
255
|
-
const leftMost = tree.getLeftMost(tree.root,
|
|
264
|
+
const leftMost = tree.getLeftMost(tree.root, 'RECURSIVE');
|
|
256
265
|
expect(leftMost?.key).toEqual(1);
|
|
257
|
-
const rightMost = tree.getRightMost(tree.root,
|
|
266
|
+
const rightMost = tree.getRightMost(tree.root, 'RECURSIVE');
|
|
258
267
|
expect(rightMost?.key).toEqual(7);
|
|
259
268
|
});
|
|
260
269
|
|
|
@@ -270,37 +279,37 @@ describe('BinaryTree', () => {
|
|
|
270
279
|
new BinaryTreeNode(4, 4)
|
|
271
280
|
]);
|
|
272
281
|
|
|
273
|
-
expect(tree.isBST(tree.getNode(4),
|
|
274
|
-
expect(tree.isBST(tree.getNode(4),
|
|
282
|
+
expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
|
|
283
|
+
expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
|
|
275
284
|
});
|
|
276
285
|
|
|
277
286
|
it('should isSubtreeBST', () => {
|
|
278
287
|
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
279
288
|
|
|
280
|
-
expect(tree.isBST(tree.getNode(4),
|
|
281
|
-
expect(tree.isBST(tree.getNode(4),
|
|
289
|
+
expect(tree.isBST(tree.getNode(4), 'RECURSIVE')).toBe(true);
|
|
290
|
+
expect(tree.isBST(tree.getNode(4), 'ITERATIVE')).toBe(true);
|
|
282
291
|
expect(tree.getNodes(2, undefined, false, null)).toEqual([]);
|
|
283
292
|
expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)]);
|
|
284
293
|
});
|
|
285
294
|
|
|
286
295
|
it('should sub tree traverse', () => {
|
|
287
296
|
tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
|
|
288
|
-
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6),
|
|
289
|
-
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6),
|
|
290
|
-
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6),
|
|
291
|
-
expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6),
|
|
297
|
+
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'ITERATIVE')).toEqual([6, 3, 7]);
|
|
298
|
+
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'ITERATIVE', false)).toEqual([6, 3, 7]);
|
|
299
|
+
expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), 'RECURSIVE')).toEqual([6, 3, 7]);
|
|
300
|
+
expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
292
301
|
6,
|
|
293
302
|
3,
|
|
294
303
|
7,
|
|
295
304
|
null
|
|
296
305
|
]);
|
|
297
|
-
expect(tree.dfs(node => (node ? node.key : node), 'pre', tree.getNode(6),
|
|
306
|
+
expect(tree.dfs(node => (node ? node.key : node), 'pre', tree.getNode(6), 'ITERATIVE', true)).toEqual([
|
|
298
307
|
6,
|
|
299
308
|
3,
|
|
300
309
|
7,
|
|
301
310
|
null
|
|
302
311
|
]);
|
|
303
|
-
expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6),
|
|
312
|
+
expect(tree.dfs(node => (node ? node.key : null), 'pre', tree.getNode(6), 'RECURSIVE', true)).toEqual([
|
|
304
313
|
6,
|
|
305
314
|
3,
|
|
306
315
|
7,
|
|
@@ -360,7 +369,7 @@ describe('BinaryTree Morris Traversal', () => {
|
|
|
360
369
|
|
|
361
370
|
expect(result).toEqual(expected);
|
|
362
371
|
expect(tree.dfs(node => node.key, 'in')).toEqual(expected);
|
|
363
|
-
expect(tree.dfs(node => node.key, 'in', tree.root,
|
|
372
|
+
expect(tree.dfs(node => node.key, 'in', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
364
373
|
});
|
|
365
374
|
|
|
366
375
|
it('should perform pre-order Morris traversal correctly as dfs traversal', () => {
|
|
@@ -399,57 +408,101 @@ describe('BinaryTree traversals', () => {
|
|
|
399
408
|
|
|
400
409
|
const arr = [35, 20, 40, 15, 29, null, 50, null, 16, 28, 30, 45, 55];
|
|
401
410
|
tree.refill(arr);
|
|
402
|
-
expect(
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
411
|
+
expect(tree.bfs(node => node, tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
412
|
+
35,
|
|
413
|
+
20,
|
|
414
|
+
40,
|
|
415
|
+
15,
|
|
416
|
+
29,
|
|
417
|
+
null,
|
|
418
|
+
50,
|
|
419
|
+
null,
|
|
420
|
+
16,
|
|
421
|
+
28,
|
|
422
|
+
30,
|
|
423
|
+
45,
|
|
424
|
+
55
|
|
425
|
+
]);
|
|
426
|
+
expect(tree.bfs(node => node, tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
427
|
+
35,
|
|
428
|
+
20,
|
|
429
|
+
40,
|
|
430
|
+
15,
|
|
431
|
+
29,
|
|
432
|
+
null,
|
|
433
|
+
50,
|
|
434
|
+
null,
|
|
435
|
+
16,
|
|
436
|
+
28,
|
|
437
|
+
30,
|
|
438
|
+
45,
|
|
439
|
+
55
|
|
440
|
+
]);
|
|
441
|
+
expect(tree.bfs(node => node, tree.root, 'ITERATIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
442
|
+
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
443
|
+
]);
|
|
444
|
+
expect(tree.bfs(node => node, tree.root, 'RECURSIVE').map(node => (node === null ? null : node.key))).toEqual([
|
|
445
|
+
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
446
|
+
]);
|
|
414
447
|
|
|
415
448
|
expect(tree.dfs(node => node.key, 'pre')).toEqual([35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55]);
|
|
416
|
-
expect(tree.dfs(node => node.key, 'pre', tree.root,
|
|
449
|
+
expect(tree.dfs(node => node.key, 'pre', tree.root, 'RECURSIVE')).toEqual([
|
|
417
450
|
35, 20, 15, 16, 29, 28, 30, 40, 50, 45, 55
|
|
418
451
|
]);
|
|
419
|
-
expect(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
452
|
+
expect(tree.dfs(node => node, 'pre', tree.root, 'ITERATIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
453
|
+
35,
|
|
454
|
+
20,
|
|
455
|
+
15,
|
|
456
|
+
null,
|
|
457
|
+
16,
|
|
458
|
+
29,
|
|
459
|
+
28,
|
|
460
|
+
30,
|
|
461
|
+
40,
|
|
462
|
+
null,
|
|
463
|
+
50,
|
|
464
|
+
45,
|
|
465
|
+
55
|
|
466
|
+
]);
|
|
467
|
+
expect(tree.dfs(node => node, 'pre', tree.root, 'RECURSIVE', true).map(node => (node ? node.key : null))).toEqual([
|
|
468
|
+
35,
|
|
469
|
+
20,
|
|
470
|
+
15,
|
|
471
|
+
null,
|
|
472
|
+
16,
|
|
473
|
+
29,
|
|
474
|
+
28,
|
|
475
|
+
30,
|
|
476
|
+
40,
|
|
477
|
+
null,
|
|
478
|
+
50,
|
|
479
|
+
45,
|
|
480
|
+
55
|
|
481
|
+
]);
|
|
425
482
|
|
|
426
483
|
expect(tree.dfs(node => node.key, 'in')).toEqual([15, 16, 20, 28, 29, 30, 35, 40, 45, 50, 55]);
|
|
427
484
|
expect(tree.dfs(node => node.key, 'post')).toEqual([16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35]);
|
|
428
|
-
expect(tree.dfs(node => node.key, 'post', tree.root,
|
|
485
|
+
expect(tree.dfs(node => node.key, 'post', tree.root, 'RECURSIVE')).toEqual([
|
|
429
486
|
16, 15, 28, 30, 29, 20, 45, 55, 50, 40, 35
|
|
430
487
|
]);
|
|
431
|
-
expect(tree.bfs(node => node.key, tree.root,
|
|
432
|
-
|
|
433
|
-
]);
|
|
434
|
-
expect(tree.bfs(node => node.key, tree.root, IterationType.ITERATIVE)).toEqual([
|
|
435
|
-
35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55
|
|
436
|
-
]);
|
|
488
|
+
expect(tree.bfs(node => node.key, tree.root, 'RECURSIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
489
|
+
expect(tree.bfs(node => node.key, tree.root, 'ITERATIVE')).toEqual([35, 20, 40, 15, 29, 50, 16, 28, 30, 45, 55]);
|
|
437
490
|
|
|
438
491
|
expect(tree.listLevels(node => node.key)).toEqual([[35], [20, 40], [15, 29, 50], [16, 28, 30, 45, 55]]);
|
|
439
492
|
|
|
440
|
-
expect(tree.listLevels(node => node.key, tree.root,
|
|
493
|
+
expect(tree.listLevels(node => node.key, tree.root, 'RECURSIVE')).toEqual([
|
|
441
494
|
[35],
|
|
442
495
|
[20, 40],
|
|
443
496
|
[15, 29, 50],
|
|
444
497
|
[16, 28, 30, 45, 55]
|
|
445
498
|
]);
|
|
446
|
-
expect(tree.listLevels(node => (node ? node.key : null), tree.root,
|
|
499
|
+
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'ITERATIVE', true)).toEqual([
|
|
447
500
|
[35],
|
|
448
501
|
[20, 40],
|
|
449
502
|
[15, 29, null, 50],
|
|
450
503
|
[null, 16, 28, 30, 45, 55]
|
|
451
504
|
]);
|
|
452
|
-
expect(tree.listLevels(node => (node ? node.key : null), tree.root,
|
|
505
|
+
expect(tree.listLevels(node => (node ? node.key : null), tree.root, 'RECURSIVE', true)).toEqual([
|
|
453
506
|
[35],
|
|
454
507
|
[20, 40],
|
|
455
508
|
[15, 29, null, 50],
|
|
@@ -461,7 +514,7 @@ describe('BinaryTree', () => {
|
|
|
461
514
|
let tree: BinaryTree<number, string>;
|
|
462
515
|
|
|
463
516
|
beforeEach(() => {
|
|
464
|
-
tree = new BinaryTree<number, string>([], { iterationType:
|
|
517
|
+
tree = new BinaryTree<number, string>([], { iterationType: 'RECURSIVE' });
|
|
465
518
|
});
|
|
466
519
|
|
|
467
520
|
afterEach(() => {
|
|
@@ -533,8 +586,8 @@ describe('BinaryTree', () => {
|
|
|
533
586
|
tree.add([7, 'C']);
|
|
534
587
|
|
|
535
588
|
expect(tree.getHeight()).toBe(1);
|
|
536
|
-
expect(tree.getHeight(undefined,
|
|
537
|
-
expect(tree.getMinHeight(undefined,
|
|
589
|
+
expect(tree.getHeight(undefined, 'RECURSIVE')).toBe(1);
|
|
590
|
+
expect(tree.getMinHeight(undefined, 'RECURSIVE')).toBe(1);
|
|
538
591
|
});
|
|
539
592
|
|
|
540
593
|
it('should check if the tree is a binary search tree', () => {
|
|
@@ -604,7 +657,7 @@ describe('BinaryTree', () => {
|
|
|
604
657
|
expect(nodes.length).toBe(1);
|
|
605
658
|
expect(nodes[0].key).toBe(3);
|
|
606
659
|
|
|
607
|
-
const nodesRec = tree.getNodes('B', node => node.value, false, tree.root,
|
|
660
|
+
const nodesRec = tree.getNodes('B', node => node.value, false, tree.root, 'RECURSIVE');
|
|
608
661
|
|
|
609
662
|
expect(nodesRec.length).toBe(1);
|
|
610
663
|
expect(nodesRec[0].key).toBe(3);
|
|
@@ -615,19 +668,19 @@ describe('BinaryTree', () => {
|
|
|
615
668
|
tree.add([3, 'B']);
|
|
616
669
|
tree.add([7, 'C']);
|
|
617
670
|
|
|
618
|
-
tree.iterationType =
|
|
671
|
+
tree.iterationType = 'ITERATIVE';
|
|
619
672
|
expect([...tree]).toEqual([
|
|
620
673
|
[3, 'B'],
|
|
621
674
|
[5, 'A'],
|
|
622
675
|
[7, 'C']
|
|
623
676
|
]);
|
|
624
|
-
tree.iterationType =
|
|
677
|
+
tree.iterationType = 'RECURSIVE';
|
|
625
678
|
expect([...tree]).toEqual([
|
|
626
679
|
[3, 'B'],
|
|
627
680
|
[5, 'A'],
|
|
628
681
|
[7, 'C']
|
|
629
682
|
]);
|
|
630
|
-
tree.iterationType =
|
|
683
|
+
tree.iterationType = 'ITERATIVE';
|
|
631
684
|
|
|
632
685
|
const result = tree.morris();
|
|
633
686
|
expect(result).toEqual([3, 5, 7]);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BST, BSTNode
|
|
1
|
+
import { BinaryTreeNode, BST, BSTNode } from '../../../../src';
|
|
2
2
|
import { isDebugTest } from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
|
|
|
58
58
|
expect(subTreeSum).toBe(70);
|
|
59
59
|
|
|
60
60
|
let lesserSum = 0;
|
|
61
|
-
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
61
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
62
62
|
expect(lesserSum).toBe(45);
|
|
63
63
|
|
|
64
64
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -261,7 +261,7 @@ describe('BST operations test', () => {
|
|
|
261
261
|
expect(subTreeSum).toBe(70);
|
|
262
262
|
|
|
263
263
|
let lesserSum = 0;
|
|
264
|
-
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
264
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
265
265
|
expect(lesserSum).toBe(45);
|
|
266
266
|
|
|
267
267
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -411,7 +411,7 @@ describe('BST operations test', () => {
|
|
|
411
411
|
|
|
412
412
|
describe('BST operations test recursively', () => {
|
|
413
413
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
414
|
-
const bst = new BST<number>([], { iterationType:
|
|
414
|
+
const bst = new BST<number>([], { iterationType: 'RECURSIVE' });
|
|
415
415
|
expect(bst).toBeInstanceOf(BST);
|
|
416
416
|
bst.add([11, 11]);
|
|
417
417
|
bst.add([3, 3]);
|
|
@@ -448,7 +448,7 @@ describe('BST operations test recursively', () => {
|
|
|
448
448
|
expect(subTreeSum).toBe(70);
|
|
449
449
|
|
|
450
450
|
let lesserSum = 0;
|
|
451
|
-
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
451
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
452
452
|
expect(lesserSum).toBe(45);
|
|
453
453
|
|
|
454
454
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -649,7 +649,7 @@ describe('BST operations test recursively', () => {
|
|
|
649
649
|
expect(subTreeSum).toBe(70);
|
|
650
650
|
|
|
651
651
|
let lesserSum = 0;
|
|
652
|
-
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
652
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
|
|
653
653
|
expect(lesserSum).toBe(45);
|
|
654
654
|
|
|
655
655
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -869,7 +869,7 @@ describe('BST isBST', function () {
|
|
|
869
869
|
});
|
|
870
870
|
|
|
871
871
|
test('isBST when variant is Max', () => {
|
|
872
|
-
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant:
|
|
872
|
+
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant: 'INVERSE' });
|
|
873
873
|
bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
874
874
|
expect(bst.isBST()).toBe(true);
|
|
875
875
|
});
|
|
@@ -902,7 +902,7 @@ describe('BST Performance test', function () {
|
|
|
902
902
|
node => {
|
|
903
903
|
node.key - 1;
|
|
904
904
|
},
|
|
905
|
-
|
|
905
|
+
'LT',
|
|
906
906
|
inputSize / 2
|
|
907
907
|
);
|
|
908
908
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
@@ -932,10 +932,10 @@ describe('BST Performance test', function () {
|
|
|
932
932
|
it('should dfs as sub tree traversal, null should be ignored', () => {
|
|
933
933
|
const bst = new BST();
|
|
934
934
|
bst.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
935
|
-
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6),
|
|
936
|
-
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6),
|
|
937
|
-
expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6),
|
|
938
|
-
expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6),
|
|
935
|
+
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
936
|
+
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
937
|
+
expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
938
|
+
expect(bst.dfs(node => node?.key ?? undefined, 'pre', bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
939
939
|
});
|
|
940
940
|
});
|
|
941
941
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AVLTree, BST,
|
|
1
|
+
import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
|
|
2
2
|
|
|
3
3
|
describe('Overall BinaryTree Test', () => {
|
|
4
4
|
it('should perform various operations on BinaryTree', () => {
|
|
@@ -63,8 +63,8 @@ describe('Overall BinaryTree Test', () => {
|
|
|
63
63
|
|
|
64
64
|
it('Should clone a BST works fine', () => {
|
|
65
65
|
const bst = new BST<number>([3, 6, 7, 1, 9], {
|
|
66
|
-
iterationType:
|
|
67
|
-
variant:
|
|
66
|
+
iterationType: 'RECURSIVE',
|
|
67
|
+
variant: 'INVERSE',
|
|
68
68
|
extractor: key => key
|
|
69
69
|
});
|
|
70
70
|
expect(bst.size).toBe(5);
|
|
@@ -104,8 +104,8 @@ describe('Overall BinaryTree Test', () => {
|
|
|
104
104
|
|
|
105
105
|
it('Should clone a AVLTree works fine', () => {
|
|
106
106
|
const avl = new AVLTree<number>([3, 6, 7, 1, 9], {
|
|
107
|
-
iterationType:
|
|
108
|
-
variant:
|
|
107
|
+
iterationType: 'RECURSIVE',
|
|
108
|
+
variant: 'INVERSE',
|
|
109
109
|
extractor: key => key
|
|
110
110
|
});
|
|
111
111
|
expect(avl.size).toBe(5);
|
|
@@ -148,7 +148,7 @@ describe('Overall BinaryTree Test', () => {
|
|
|
148
148
|
|
|
149
149
|
it('Should clone a TreeMultiMap works fine', () => {
|
|
150
150
|
const tmm = new TreeMultiMap<number>([3, 6, 7, 1, 9], {
|
|
151
|
-
iterationType:
|
|
151
|
+
iterationType: 'RECURSIVE',
|
|
152
152
|
extractor: key => key
|
|
153
153
|
});
|
|
154
154
|
expect(tmm.size).toBe(5);
|
|
@@ -197,7 +197,7 @@ describe('Overall BinaryTree Test', () => {
|
|
|
197
197
|
|
|
198
198
|
it('Should clone a RedBlackTree works fine', () => {
|
|
199
199
|
const rbTree = new RedBlackTree<number>([3, 6, 7, 1, 9], {
|
|
200
|
-
iterationType:
|
|
200
|
+
iterationType: 'RECURSIVE',
|
|
201
201
|
extractor: key => key
|
|
202
202
|
});
|
|
203
203
|
expect(rbTree.size).toBe(5);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BSTNode,
|
|
1
|
+
import { BinaryTreeNode, BSTNode, RBTNColor, RedBlackTree, RedBlackTreeNode } from '../../../../src';
|
|
2
2
|
import { getRandomInt, getRandomIntArray, magnitude } from '../../../utils';
|
|
3
3
|
import { OrderedMap } from 'js-sdsl';
|
|
4
4
|
|
|
@@ -53,6 +53,11 @@ describe('RedBlackTree 1', () => {
|
|
|
53
53
|
|
|
54
54
|
expect(rbTree.getNode(15)).toBe(undefined);
|
|
55
55
|
});
|
|
56
|
+
|
|
57
|
+
it('should getNode performance O(log n)', () => {
|
|
58
|
+
for (let i = 0; i < 10; i++) rbTree.add(i);
|
|
59
|
+
rbTree.getNode(6);
|
|
60
|
+
});
|
|
56
61
|
});
|
|
57
62
|
|
|
58
63
|
describe('minimum', () => {
|
|
@@ -477,13 +482,13 @@ describe('RedBlackTree 2', () => {
|
|
|
477
482
|
|
|
478
483
|
expect(rbTree.size).toBe(51);
|
|
479
484
|
expect(rbTree.isBST()).toBe(true);
|
|
480
|
-
expect(rbTree.isBST(rbTree.root,
|
|
485
|
+
expect(rbTree.isBST(rbTree.root, 'RECURSIVE')).toBe(true);
|
|
481
486
|
|
|
482
|
-
expect(rbTree.dfs(n => n.key, 'in', rbTree.root,
|
|
487
|
+
expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'ITERATIVE')).toEqual([
|
|
483
488
|
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
|
|
484
489
|
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
|
|
485
490
|
]);
|
|
486
|
-
expect(rbTree.dfs(n => n.key, 'in', rbTree.root,
|
|
491
|
+
expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'RECURSIVE')).toEqual([
|
|
487
492
|
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
|
|
488
493
|
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
|
|
489
494
|
]);
|
|
@@ -499,7 +504,7 @@ describe('RedBlackTree 2', () => {
|
|
|
499
504
|
|
|
500
505
|
expect(rbTree.size).toBe(0);
|
|
501
506
|
expect(rbTree.isBST()).toBe(true);
|
|
502
|
-
expect(rbTree.dfs(n => n.key, 'in', rbTree.root,
|
|
507
|
+
expect(rbTree.dfs(n => n.key, 'in', rbTree.root, 'ITERATIVE')).toEqual([]);
|
|
503
508
|
|
|
504
509
|
rbTree.clear();
|
|
505
510
|
for (let i = 0; i < 1000; i++) {
|