data-structure-typed 2.2.6 → 2.2.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/CONTRIBUTING.md +47 -1
- package/README.md +19 -8
- package/README_CN.md +119 -275
- package/benchmark/report.html +1 -1
- package/benchmark/report.json +20 -324
- package/dist/cjs/index.cjs +109 -107
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +109 -107
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +109 -107
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +109 -107
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/leetcode/avl-tree-counter.mjs +2957 -0
- package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
- package/dist/leetcode/avl-tree.mjs +2720 -0
- package/dist/leetcode/binary-tree.mjs +1594 -0
- package/dist/leetcode/bst.mjs +2398 -0
- package/dist/leetcode/deque.mjs +683 -0
- package/dist/leetcode/directed-graph.mjs +1733 -0
- package/dist/leetcode/doubly-linked-list.mjs +709 -0
- package/dist/leetcode/hash-map.mjs +493 -0
- package/dist/leetcode/heap.mjs +542 -0
- package/dist/leetcode/max-heap.mjs +375 -0
- package/dist/leetcode/max-priority-queue.mjs +383 -0
- package/dist/leetcode/min-heap.mjs +363 -0
- package/dist/leetcode/min-priority-queue.mjs +371 -0
- package/dist/leetcode/priority-queue.mjs +363 -0
- package/dist/leetcode/queue.mjs +943 -0
- package/dist/leetcode/red-black-tree.mjs +2765 -0
- package/dist/leetcode/singly-linked-list.mjs +754 -0
- package/dist/leetcode/stack.mjs +217 -0
- package/dist/leetcode/tree-counter.mjs +3039 -0
- package/dist/leetcode/tree-multi-map.mjs +2913 -0
- package/dist/leetcode/trie.mjs +413 -0
- package/dist/leetcode/undirected-graph.mjs +1650 -0
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +22 -23
- package/dist/types/data-structures/binary-tree/bst.d.ts +11 -11
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
- package/dist/umd/data-structure-typed.js +105 -103
- package/dist/umd/data-structure-typed.js.map +1 -1
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +48 -171
- package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
- package/src/data-structures/binary-tree/avl-tree.ts +15 -15
- package/src/data-structures/binary-tree/binary-tree.ts +53 -55
- package/src/data-structures/binary-tree/bst.ts +21 -22
- package/src/data-structures/binary-tree/red-black-tree.ts +3 -3
- package/src/data-structures/binary-tree/tree-counter.ts +4 -4
- package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
- package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
- package/test/unit/data-structures/binary-tree/bst.test.ts +99 -99
- package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +37 -37
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
- package/tsup.config.js +50 -21
- package/tsup.leetcode.config.js +1 -1
- package/tsup.umd.config.js +29 -0
- package/tsup.node.config.js +0 -83
|
@@ -6,25 +6,25 @@ const isDebug = isDebugTest;
|
|
|
6
6
|
describe('BST operations test', () => {
|
|
7
7
|
it('should add undefined and null', () => {
|
|
8
8
|
const bst = new BST<number, string>();
|
|
9
|
-
const isAddUndefined = bst.
|
|
9
|
+
const isAddUndefined = bst.set(undefined);
|
|
10
10
|
expect(isAddUndefined).toBe(false);
|
|
11
11
|
expect(bst.get(undefined)).toBe(undefined);
|
|
12
|
-
const isAddNull = bst.
|
|
12
|
+
const isAddNull = bst.set(null);
|
|
13
13
|
expect(isAddNull).toBe(false);
|
|
14
14
|
expect(bst.get(null)).toBe(undefined);
|
|
15
|
-
const isAdd0 = bst.
|
|
15
|
+
const isAdd0 = bst.set(0, '0');
|
|
16
16
|
expect(isAdd0).toBe(true);
|
|
17
17
|
expect(bst.get(0)).toBe('0');
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
it('should addMany undefined and null', () => {
|
|
21
21
|
const bst = new BST<number, string>();
|
|
22
|
-
const addManyWithUndefined = bst.
|
|
22
|
+
const addManyWithUndefined = bst.setMany([1, undefined, 3]);
|
|
23
23
|
expect(addManyWithUndefined).toEqual([true, false, true]);
|
|
24
24
|
expect(bst.get(undefined)).toBe(undefined);
|
|
25
|
-
const addManyWithNull = bst.
|
|
25
|
+
const addManyWithNull = bst.setMany([1, null, 3, 4]);
|
|
26
26
|
expect(addManyWithNull).toEqual([true, false, true, true]);
|
|
27
|
-
const addManyEntriesWithNull = bst.
|
|
27
|
+
const addManyEntriesWithNull = bst.setMany([
|
|
28
28
|
[1, '1'],
|
|
29
29
|
[null, 'null'],
|
|
30
30
|
[3, '3'],
|
|
@@ -32,7 +32,7 @@ describe('BST operations test', () => {
|
|
|
32
32
|
]);
|
|
33
33
|
expect(addManyEntriesWithNull).toEqual([true, false, true, true]);
|
|
34
34
|
expect(bst.get(null)).toBe(undefined);
|
|
35
|
-
const node0 = bst.
|
|
35
|
+
const node0 = bst.set(0, '0');
|
|
36
36
|
expect(node0).toBe(true);
|
|
37
37
|
expect(bst.get(0)).toBe('0');
|
|
38
38
|
});
|
|
@@ -40,8 +40,8 @@ describe('BST operations test', () => {
|
|
|
40
40
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
41
41
|
const bst = new BST<number, number>();
|
|
42
42
|
expect(bst).toBeInstanceOf(BST);
|
|
43
|
-
bst.
|
|
44
|
-
bst.
|
|
43
|
+
bst.set([11, 11]);
|
|
44
|
+
bst.set([3, 3]);
|
|
45
45
|
const idsAndValues: [number, number][] = [
|
|
46
46
|
[15, 15],
|
|
47
47
|
[1, 1],
|
|
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
|
|
|
58
58
|
[10, 10],
|
|
59
59
|
[5, 5]
|
|
60
60
|
];
|
|
61
|
-
bst.
|
|
61
|
+
bst.setMany(idsAndValues, [], false);
|
|
62
62
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
63
63
|
|
|
64
64
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -247,10 +247,10 @@ describe('BST operations test', () => {
|
|
|
247
247
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
248
248
|
const objBST = new BST<number, { name: string; age: number }>();
|
|
249
249
|
expect(objBST).toBeInstanceOf(BST);
|
|
250
|
-
objBST.
|
|
251
|
-
objBST.
|
|
250
|
+
objBST.set([11, { name: '11', age: 11 }]);
|
|
251
|
+
objBST.set([3, { name: '3', age: 3 }]);
|
|
252
252
|
|
|
253
|
-
objBST.
|
|
253
|
+
objBST.setMany(
|
|
254
254
|
[15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
|
|
255
255
|
[
|
|
256
256
|
{ name: 'Alice', age: 15 },
|
|
@@ -474,17 +474,17 @@ describe('BST operations test', () => {
|
|
|
474
474
|
const tree = new BST<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
475
475
|
expect(tree.get(1)).toBe('1');
|
|
476
476
|
expect(tree.getNode(1)?.value).toBe('1');
|
|
477
|
-
tree.
|
|
477
|
+
tree.set(1, 'a');
|
|
478
478
|
expect(tree.get(1)).toBe('a');
|
|
479
|
-
tree.
|
|
479
|
+
tree.set([1, 'b']);
|
|
480
480
|
expect(tree.getNode(1)?.value).toBe('b');
|
|
481
481
|
expect(tree.get(1)).toBe('b');
|
|
482
482
|
const treeMap = new BST<number>([4, 5, [1, '1'], 2, 3]);
|
|
483
483
|
expect(treeMap.get(1)).toBe('1');
|
|
484
484
|
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
485
|
-
treeMap.
|
|
485
|
+
treeMap.set(1, 'a');
|
|
486
486
|
expect(treeMap.get(1)).toBe('a');
|
|
487
|
-
treeMap.
|
|
487
|
+
treeMap.set([1, 'b']);
|
|
488
488
|
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
489
489
|
expect(treeMap.get(1)).toBe('b');
|
|
490
490
|
});
|
|
@@ -502,10 +502,10 @@ describe('BST operations test recursively', () => {
|
|
|
502
502
|
iterationType: 'RECURSIVE'
|
|
503
503
|
});
|
|
504
504
|
expect(bst).toBeInstanceOf(BST);
|
|
505
|
-
bst.
|
|
506
|
-
bst.
|
|
505
|
+
bst.set([11, 11]);
|
|
506
|
+
bst.set([3, 3]);
|
|
507
507
|
const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
508
|
-
bst.
|
|
508
|
+
bst.setMany(idsAndValues, undefined, false);
|
|
509
509
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
510
510
|
|
|
511
511
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -687,8 +687,8 @@ describe('BST operations test recursively', () => {
|
|
|
687
687
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
688
688
|
const objBST = new BST<number, { key: number; keyA: number }>();
|
|
689
689
|
expect(objBST).toBeInstanceOf(BST);
|
|
690
|
-
objBST.
|
|
691
|
-
objBST.
|
|
690
|
+
objBST.set([11, { key: 11, keyA: 11 }]);
|
|
691
|
+
objBST.set([3, { key: 3, keyA: 3 }]);
|
|
692
692
|
const entries: [number, { key: number; keyA: number }][] = [
|
|
693
693
|
[15, { key: 15, keyA: 15 }],
|
|
694
694
|
[1, { key: 1, keyA: 1 }],
|
|
@@ -706,7 +706,7 @@ describe('BST operations test recursively', () => {
|
|
|
706
706
|
[5, { key: 5, keyA: 5 }]
|
|
707
707
|
];
|
|
708
708
|
|
|
709
|
-
objBST.
|
|
709
|
+
objBST.setMany(entries, undefined, false);
|
|
710
710
|
|
|
711
711
|
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
712
712
|
|
|
@@ -893,7 +893,7 @@ describe('BST operations test recursively', () => {
|
|
|
893
893
|
|
|
894
894
|
it('should delete', () => {
|
|
895
895
|
const numBST = new BST<number>();
|
|
896
|
-
numBST.
|
|
896
|
+
numBST.setMany([2, 4, 5, 3, 1]);
|
|
897
897
|
expect(numBST.size).toBe(5);
|
|
898
898
|
numBST.delete(1);
|
|
899
899
|
expect(numBST.size).toBe(4);
|
|
@@ -909,7 +909,7 @@ describe('BST operations test recursively', () => {
|
|
|
909
909
|
|
|
910
910
|
it('should listLevels', () => {
|
|
911
911
|
const bst = new BST<number>();
|
|
912
|
-
bst.
|
|
912
|
+
bst.setMany([2, 4, 5, 3, 1]);
|
|
913
913
|
expect(bst.size).toBe(5);
|
|
914
914
|
bst.delete(1);
|
|
915
915
|
bst.delete(5);
|
|
@@ -921,7 +921,7 @@ describe('BST operations test recursively', () => {
|
|
|
921
921
|
const bst = new BST<number>();
|
|
922
922
|
const levelKeys = bst.lesserOrGreaterTraverse();
|
|
923
923
|
expect(levelKeys).toEqual([]);
|
|
924
|
-
bst.
|
|
924
|
+
bst.setMany([2, 4, 5, 3, 1]);
|
|
925
925
|
expect(bst.size).toBe(5);
|
|
926
926
|
bst.delete(1);
|
|
927
927
|
bst.delete(5);
|
|
@@ -942,7 +942,7 @@ describe('BST operations test recursively', () => {
|
|
|
942
942
|
}
|
|
943
943
|
|
|
944
944
|
const bst = new BST<string, number>();
|
|
945
|
-
bst.
|
|
945
|
+
bst.setMany([
|
|
946
946
|
['2', 2],
|
|
947
947
|
['4', 4],
|
|
948
948
|
['5', 5],
|
|
@@ -980,7 +980,7 @@ describe('BST operations test recursively', () => {
|
|
|
980
980
|
if (isTestStackOverflow) {
|
|
981
981
|
it('should getLeftMost', () => {
|
|
982
982
|
const bst = new BST<number>([]);
|
|
983
|
-
for (let i = 1; i <= SYSTEM_MAX_CALL_STACK; i++) bst.
|
|
983
|
+
for (let i = 1; i <= SYSTEM_MAX_CALL_STACK; i++) bst.set(i);
|
|
984
984
|
|
|
985
985
|
expect(() => {
|
|
986
986
|
const leftMost = bst.getLeftMost(node => node, bst.root, 'RECURSIVE');
|
|
@@ -993,7 +993,7 @@ describe('BST operations test recursively', () => {
|
|
|
993
993
|
|
|
994
994
|
it('should getRightMost', () => {
|
|
995
995
|
const bst = new BST<number>();
|
|
996
|
-
for (let i = 1; i <= SYSTEM_MAX_CALL_STACK; i++) bst.
|
|
996
|
+
for (let i = 1; i <= SYSTEM_MAX_CALL_STACK; i++) bst.set(i);
|
|
997
997
|
|
|
998
998
|
expect(() => {
|
|
999
999
|
const rightMost = bst.getRightMost(node => node, bst.root, 'RECURSIVE');
|
|
@@ -1008,7 +1008,7 @@ describe('BST operations test recursively', () => {
|
|
|
1008
1008
|
describe('BST isBST', function () {
|
|
1009
1009
|
it('isBST', () => {
|
|
1010
1010
|
const bst = new BST<number, number>();
|
|
1011
|
-
bst.
|
|
1011
|
+
bst.setMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
1012
1012
|
expect(bst.isBST()).toBe(true);
|
|
1013
1013
|
});
|
|
1014
1014
|
|
|
@@ -1016,7 +1016,7 @@ describe('BST isBST', function () {
|
|
|
1016
1016
|
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], {
|
|
1017
1017
|
comparator: (a, b) => b - a
|
|
1018
1018
|
});
|
|
1019
|
-
bst.
|
|
1019
|
+
bst.setMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
1020
1020
|
expect(bst.isBST()).toBe(true);
|
|
1021
1021
|
});
|
|
1022
1022
|
});
|
|
@@ -1041,7 +1041,7 @@ describe('BST Performance test', function () {
|
|
|
1041
1041
|
nodes.push(i);
|
|
1042
1042
|
}
|
|
1043
1043
|
const start = performance.now();
|
|
1044
|
-
bst.
|
|
1044
|
+
bst.setMany(nodes);
|
|
1045
1045
|
if (isDebug) console.log('---add', performance.now() - start);
|
|
1046
1046
|
const startL = performance.now();
|
|
1047
1047
|
bst.lesserOrGreaterTraverse(
|
|
@@ -1060,7 +1060,7 @@ describe('BST Performance test', function () {
|
|
|
1060
1060
|
nodes.push(i);
|
|
1061
1061
|
}
|
|
1062
1062
|
const start = performance.now();
|
|
1063
|
-
bst.
|
|
1063
|
+
bst.setMany(nodes);
|
|
1064
1064
|
if (isDebug) console.log('---add', performance.now() - start);
|
|
1065
1065
|
const startL = performance.now();
|
|
1066
1066
|
const arr: number[][] = bst.listLevels(node => node.key);
|
|
@@ -1070,14 +1070,14 @@ describe('BST Performance test', function () {
|
|
|
1070
1070
|
|
|
1071
1071
|
it('should the lastKey of a BST to be the largest key', function () {
|
|
1072
1072
|
const bst = new BST();
|
|
1073
|
-
bst.
|
|
1073
|
+
bst.setMany([9, 8, 7, 3, 1, 2, 5, 4, 6], undefined, false);
|
|
1074
1074
|
// TODO
|
|
1075
1075
|
// expect(bst.lastKey()).toBe(9);
|
|
1076
1076
|
});
|
|
1077
1077
|
|
|
1078
1078
|
it('should dfs as sub tree traversal, null should be ignored', () => {
|
|
1079
1079
|
const bst = new BST();
|
|
1080
|
-
bst.
|
|
1080
|
+
bst.setMany([4, 2, 6, 1, 3, 5, 7]);
|
|
1081
1081
|
expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
1082
1082
|
expect(bst.dfs(node => node.key, 'PRE', false, bst.getNode(6), 'RECURSIVE')).toEqual([6, 5, 7]);
|
|
1083
1083
|
expect(bst.dfs(node => node?.key ?? undefined, 'PRE', false, bst.getNode(6), 'ITERATIVE')).toEqual([6, 5, 7]);
|
|
@@ -1089,7 +1089,7 @@ describe('BST iterative methods test', () => {
|
|
|
1089
1089
|
let bst: BST<number, string>;
|
|
1090
1090
|
beforeEach(() => {
|
|
1091
1091
|
bst = new BST();
|
|
1092
|
-
bst.
|
|
1092
|
+
bst.setMany(
|
|
1093
1093
|
[
|
|
1094
1094
|
[1, 'a'],
|
|
1095
1095
|
[2, 'b'],
|
|
@@ -1179,7 +1179,7 @@ describe('BST iterative methods test', () => {
|
|
|
1179
1179
|
|
|
1180
1180
|
it('should collapsed, unbalanced, balanced bst leaves', () => {
|
|
1181
1181
|
const collapsedToLinkedList = new BST();
|
|
1182
|
-
collapsedToLinkedList.
|
|
1182
|
+
collapsedToLinkedList.setMany(
|
|
1183
1183
|
[
|
|
1184
1184
|
[1, 'a'],
|
|
1185
1185
|
[2, 'b'],
|
|
@@ -1198,7 +1198,7 @@ describe('BST iterative methods test', () => {
|
|
|
1198
1198
|
expect(collapsedToLinkedList.leaves()).toEqual([9]);
|
|
1199
1199
|
|
|
1200
1200
|
const unbalanced = new BST();
|
|
1201
|
-
unbalanced.
|
|
1201
|
+
unbalanced.setMany(
|
|
1202
1202
|
[
|
|
1203
1203
|
[2, 'b'],
|
|
1204
1204
|
[1, 'a'],
|
|
@@ -1217,7 +1217,7 @@ describe('BST iterative methods test', () => {
|
|
|
1217
1217
|
expect(unbalanced.leaves()).toEqual([1, 9]);
|
|
1218
1218
|
|
|
1219
1219
|
const balanced = new BST();
|
|
1220
|
-
balanced.
|
|
1220
|
+
balanced.setMany(
|
|
1221
1221
|
[
|
|
1222
1222
|
[2, 'b'],
|
|
1223
1223
|
[1, 'a'],
|
|
@@ -1242,8 +1242,8 @@ describe('BST operations not map mode test', () => {
|
|
|
1242
1242
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
1243
1243
|
const bst = new BST<number, number>([], { isMapMode: false });
|
|
1244
1244
|
expect(bst).toBeInstanceOf(BST);
|
|
1245
|
-
bst.
|
|
1246
|
-
bst.
|
|
1245
|
+
bst.set([11, 11]);
|
|
1246
|
+
bst.set([3, 3]);
|
|
1247
1247
|
const idsAndValues: [number, number][] = [
|
|
1248
1248
|
[15, 15],
|
|
1249
1249
|
[1, 1],
|
|
@@ -1260,7 +1260,7 @@ describe('BST operations not map mode test', () => {
|
|
|
1260
1260
|
[10, 10],
|
|
1261
1261
|
[5, 5]
|
|
1262
1262
|
];
|
|
1263
|
-
bst.
|
|
1263
|
+
bst.setMany(idsAndValues, undefined, false);
|
|
1264
1264
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
1265
1265
|
|
|
1266
1266
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -1295,10 +1295,10 @@ describe('BST operations not map mode test', () => {
|
|
|
1295
1295
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1296
1296
|
const objBST = new BST<number, { name: string; age: number }>([], { isMapMode: false });
|
|
1297
1297
|
expect(objBST).toBeInstanceOf(BST);
|
|
1298
|
-
objBST.
|
|
1299
|
-
objBST.
|
|
1298
|
+
objBST.set([11, { name: '11', age: 11 }]);
|
|
1299
|
+
objBST.set([3, { name: '3', age: 3 }]);
|
|
1300
1300
|
|
|
1301
|
-
objBST.
|
|
1301
|
+
objBST.setMany(
|
|
1302
1302
|
[15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
|
|
1303
1303
|
[
|
|
1304
1304
|
{ name: 'Alice', age: 15 },
|
|
@@ -1374,10 +1374,10 @@ describe('BST operations not map mode test recursively', () => {
|
|
|
1374
1374
|
isMapMode: false
|
|
1375
1375
|
});
|
|
1376
1376
|
expect(bst).toBeInstanceOf(BST);
|
|
1377
|
-
bst.
|
|
1378
|
-
bst.
|
|
1377
|
+
bst.set([11, 11]);
|
|
1378
|
+
bst.set([3, 3]);
|
|
1379
1379
|
const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
1380
|
-
bst.
|
|
1380
|
+
bst.setMany(idsAndValues, undefined, false);
|
|
1381
1381
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
1382
1382
|
|
|
1383
1383
|
if (bst.root) expect(bst.root.key).toBe(11);
|
|
@@ -1401,8 +1401,8 @@ describe('BST operations not map mode test recursively', () => {
|
|
|
1401
1401
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
1402
1402
|
const objBST = new BST<number, { key: number; keyA: number }>([], { isMapMode: false });
|
|
1403
1403
|
expect(objBST).toBeInstanceOf(BST);
|
|
1404
|
-
objBST.
|
|
1405
|
-
objBST.
|
|
1404
|
+
objBST.set([11, { key: 11, keyA: 11 }]);
|
|
1405
|
+
objBST.set([3, { key: 3, keyA: 3 }]);
|
|
1406
1406
|
const entries: [number, { key: number; keyA: number }][] = [
|
|
1407
1407
|
[15, { key: 15, keyA: 15 }],
|
|
1408
1408
|
[1, { key: 1, keyA: 1 }],
|
|
@@ -1420,7 +1420,7 @@ describe('BST operations not map mode test recursively', () => {
|
|
|
1420
1420
|
[5, { key: 5, keyA: 5 }]
|
|
1421
1421
|
];
|
|
1422
1422
|
|
|
1423
|
-
objBST.
|
|
1423
|
+
objBST.setMany(entries, undefined, false);
|
|
1424
1424
|
|
|
1425
1425
|
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
1426
1426
|
|
|
@@ -1457,7 +1457,7 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1457
1457
|
let bst: BST<number, string>;
|
|
1458
1458
|
beforeEach(() => {
|
|
1459
1459
|
bst = new BST();
|
|
1460
|
-
bst.
|
|
1460
|
+
bst.setMany(
|
|
1461
1461
|
[
|
|
1462
1462
|
[1, 'a'],
|
|
1463
1463
|
[2, 'b'],
|
|
@@ -1476,7 +1476,7 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1476
1476
|
|
|
1477
1477
|
it('should collapsed, unbalanced, balanced bst leaves', () => {
|
|
1478
1478
|
const collapsedToLinkedList = new BST();
|
|
1479
|
-
collapsedToLinkedList.
|
|
1479
|
+
collapsedToLinkedList.setMany(
|
|
1480
1480
|
[
|
|
1481
1481
|
[1, 'a'],
|
|
1482
1482
|
[2, 'b'],
|
|
@@ -1495,7 +1495,7 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1495
1495
|
expect(collapsedToLinkedList.leaves()).toEqual([9]);
|
|
1496
1496
|
|
|
1497
1497
|
const unbalanced = new BST();
|
|
1498
|
-
unbalanced.
|
|
1498
|
+
unbalanced.setMany(
|
|
1499
1499
|
[
|
|
1500
1500
|
[2, 'b'],
|
|
1501
1501
|
[1, 'a'],
|
|
@@ -1514,7 +1514,7 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1514
1514
|
expect(unbalanced.leaves()).toEqual([1, 9]);
|
|
1515
1515
|
|
|
1516
1516
|
const balanced = new BST();
|
|
1517
|
-
balanced.
|
|
1517
|
+
balanced.setMany(
|
|
1518
1518
|
[
|
|
1519
1519
|
[2, 'b'],
|
|
1520
1520
|
[1, 'a'],
|
|
@@ -1540,8 +1540,8 @@ describe('BST constructor and comparator edge cases', () => {
|
|
|
1540
1540
|
const bst = new BST<number>([], {
|
|
1541
1541
|
comparator: (a, b) => b - a
|
|
1542
1542
|
});
|
|
1543
|
-
bst.
|
|
1544
|
-
bst.
|
|
1543
|
+
bst.set(1);
|
|
1544
|
+
bst.set(2);
|
|
1545
1545
|
expect([...bst.keys()]).toEqual([2, 1]);
|
|
1546
1546
|
});
|
|
1547
1547
|
|
|
@@ -1556,7 +1556,7 @@ describe('BST addMany edge cases', () => {
|
|
|
1556
1556
|
const bst = new BST<number, string>();
|
|
1557
1557
|
const keys = [1, 2, 3];
|
|
1558
1558
|
const values = ['a', 'b', 'c'];
|
|
1559
|
-
const result = bst.
|
|
1559
|
+
const result = bst.setMany(keys, values);
|
|
1560
1560
|
expect(result).toEqual([true, true, true]);
|
|
1561
1561
|
expect([...bst]).toEqual([
|
|
1562
1562
|
[1, 'a'],
|
|
@@ -1567,7 +1567,7 @@ describe('BST addMany edge cases', () => {
|
|
|
1567
1567
|
|
|
1568
1568
|
it('should addMany with isBalanceAdd=false', () => {
|
|
1569
1569
|
const bst = new BST<number>();
|
|
1570
|
-
const result = bst.
|
|
1570
|
+
const result = bst.setMany([3, 1, 2], undefined, false);
|
|
1571
1571
|
expect(result).toEqual([true, true, true]);
|
|
1572
1572
|
expect([...bst.keys()]).toEqual([1, 2, 3]);
|
|
1573
1573
|
});
|
|
@@ -1575,7 +1575,7 @@ describe('BST addMany edge cases', () => {
|
|
|
1575
1575
|
it('should addMany with raw/entry/node', () => {
|
|
1576
1576
|
const bst = new BST<number, string>([], { isMapMode: false });
|
|
1577
1577
|
const node = new BSTNode(5, 'x');
|
|
1578
|
-
const result = bst.
|
|
1578
|
+
const result = bst.setMany([1, [2, 'b'], node]);
|
|
1579
1579
|
expect(result).toEqual([true, true, true]);
|
|
1580
1580
|
expect(bst.get(5)).toBe('x');
|
|
1581
1581
|
});
|
|
@@ -1586,10 +1586,10 @@ describe('BST perfectlyBalance and isAVLBalanced edge cases', () => {
|
|
|
1586
1586
|
const bst = new BST<number>();
|
|
1587
1587
|
expect(bst.perfectlyBalance('RECURSIVE')).toBe(false);
|
|
1588
1588
|
expect(bst.perfectlyBalance('ITERATIVE')).toBe(false);
|
|
1589
|
-
bst.
|
|
1589
|
+
bst.setMany([1, 2, 3]);
|
|
1590
1590
|
expect(bst.perfectlyBalance('RECURSIVE')).toBe(true);
|
|
1591
1591
|
bst.clear();
|
|
1592
|
-
bst.
|
|
1592
|
+
bst.setMany([1, 2, 3]);
|
|
1593
1593
|
expect(bst.perfectlyBalance('ITERATIVE')).toBe(true);
|
|
1594
1594
|
});
|
|
1595
1595
|
|
|
@@ -1597,7 +1597,7 @@ describe('BST perfectlyBalance and isAVLBalanced edge cases', () => {
|
|
|
1597
1597
|
const bst = new BST<number>();
|
|
1598
1598
|
expect(bst.isAVLBalanced('RECURSIVE')).toBe(true);
|
|
1599
1599
|
expect(bst.isAVLBalanced('ITERATIVE')).toBe(true);
|
|
1600
|
-
bst.
|
|
1600
|
+
bst.setMany([1, 2, 3, 4, 5]);
|
|
1601
1601
|
expect(typeof bst.isAVLBalanced('RECURSIVE')).toBe('boolean');
|
|
1602
1602
|
expect(typeof bst.isAVLBalanced('ITERATIVE')).toBe('boolean');
|
|
1603
1603
|
});
|
|
@@ -1821,7 +1821,7 @@ describe('BST ceiling and higher', () => {
|
|
|
1821
1821
|
// 6 9
|
|
1822
1822
|
bst = new BST<number, string>();
|
|
1823
1823
|
const keys = [10, 5, 15, 2, 8, 12, 20, 6, 9];
|
|
1824
|
-
keys.forEach(k => bst.
|
|
1824
|
+
keys.forEach(k => bst.set(k, `val-${k}`));
|
|
1825
1825
|
});
|
|
1826
1826
|
|
|
1827
1827
|
describe('ceiling (First key >= key)', () => {
|
|
@@ -1898,7 +1898,7 @@ describe('BST ceiling and higher', () => {
|
|
|
1898
1898
|
|
|
1899
1899
|
test('should handle single node tree', () => {
|
|
1900
1900
|
const singleNodeTree = new BST<number, string>();
|
|
1901
|
-
singleNodeTree.
|
|
1901
|
+
singleNodeTree.set(10);
|
|
1902
1902
|
|
|
1903
1903
|
// ceiling
|
|
1904
1904
|
expect(singleNodeTree.ceiling(5)).toBe(10);
|
|
@@ -1918,7 +1918,7 @@ describe('BST ceiling and higher', () => {
|
|
|
1918
1918
|
const randomKeys = generateRandomArray(500, 0, 1000);
|
|
1919
1919
|
|
|
1920
1920
|
// Insert unique keys
|
|
1921
|
-
[...new Set(randomKeys)].forEach(k => fuzzTree.
|
|
1921
|
+
[...new Set(randomKeys)].forEach(k => fuzzTree.set(k));
|
|
1922
1922
|
|
|
1923
1923
|
// Sort for verification (Ground Truth)
|
|
1924
1924
|
const sortedKeys = Array.from(fuzzTree.keys()).sort((a, b) => a - b);
|
|
@@ -1972,7 +1972,7 @@ describe('BST ceiling and higher', () => {
|
|
|
1972
1972
|
describe('single node tree', () => {
|
|
1973
1973
|
beforeEach(() => {
|
|
1974
1974
|
bst = new BST<number, string>();
|
|
1975
|
-
bst.
|
|
1975
|
+
bst.set(10, 'ten');
|
|
1976
1976
|
});
|
|
1977
1977
|
|
|
1978
1978
|
it('ceiling should return the key if key matches', () => {
|
|
@@ -2669,11 +2669,11 @@ describe('BST Comparator Tests', () => {
|
|
|
2669
2669
|
});
|
|
2670
2670
|
|
|
2671
2671
|
it('should correctly insert elements based on comparator', () => {
|
|
2672
|
-
bst.
|
|
2673
|
-
bst.
|
|
2674
|
-
bst.
|
|
2675
|
-
bst.
|
|
2676
|
-
bst.
|
|
2672
|
+
bst.set(10);
|
|
2673
|
+
bst.set(5);
|
|
2674
|
+
bst.set(15);
|
|
2675
|
+
bst.set(3);
|
|
2676
|
+
bst.set(7);
|
|
2677
2677
|
|
|
2678
2678
|
expect(bst.has(10)).toBe(true);
|
|
2679
2679
|
expect(bst.has(5)).toBe(true);
|
|
@@ -2684,7 +2684,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2684
2684
|
});
|
|
2685
2685
|
|
|
2686
2686
|
it('should maintain BST property with in-order traversal', () => {
|
|
2687
|
-
bst.
|
|
2687
|
+
bst.setMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
|
|
2688
2688
|
|
|
2689
2689
|
const inOrder: (number | undefined)[] = bst.dfs(node => node?.key);
|
|
2690
2690
|
|
|
@@ -2694,7 +2694,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2694
2694
|
});
|
|
2695
2695
|
|
|
2696
2696
|
it('should correctly find min and max using comparator', () => {
|
|
2697
|
-
bst.
|
|
2697
|
+
bst.setMany([15, 10, 20, 8, 12, 18, 25]);
|
|
2698
2698
|
|
|
2699
2699
|
const arr = Array.from(bst.keys());
|
|
2700
2700
|
const min = Math.min(...arr);
|
|
@@ -2705,7 +2705,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2705
2705
|
});
|
|
2706
2706
|
|
|
2707
2707
|
it('should correctly delete elements maintaining BST property', () => {
|
|
2708
|
-
bst.
|
|
2708
|
+
bst.setMany([10, 5, 15, 3, 7, 12, 18]);
|
|
2709
2709
|
bst.delete(10);
|
|
2710
2710
|
|
|
2711
2711
|
expect(bst.has(10)).toBe(false);
|
|
@@ -2717,7 +2717,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2717
2717
|
});
|
|
2718
2718
|
|
|
2719
2719
|
it('should correctly search using comparator', () => {
|
|
2720
|
-
bst.
|
|
2720
|
+
bst.setMany([20, 10, 30, 5, 15, 25, 35]);
|
|
2721
2721
|
|
|
2722
2722
|
const result = bst.search(15);
|
|
2723
2723
|
expect(result.length).toBeGreaterThan(0);
|
|
@@ -2797,7 +2797,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2797
2797
|
|
|
2798
2798
|
beforeEach(() => {
|
|
2799
2799
|
bst = new BST<number>();
|
|
2800
|
-
bst.
|
|
2800
|
+
bst.setMany([10, 5, 15, 3, 7, 12, 18, 1, 4, 6, 8, 11, 13, 16, 20]);
|
|
2801
2801
|
});
|
|
2802
2802
|
|
|
2803
2803
|
it('should find ceiling using comparator', () => {
|
|
@@ -2894,7 +2894,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2894
2894
|
{ name: 'David', grade: 95 }
|
|
2895
2895
|
];
|
|
2896
2896
|
|
|
2897
|
-
students.forEach(s => bst.
|
|
2897
|
+
students.forEach(s => bst.set(s));
|
|
2898
2898
|
|
|
2899
2899
|
expect(bst.size).toBe(4);
|
|
2900
2900
|
expect(bst.has(students[0])).toBe(true);
|
|
@@ -2911,9 +2911,9 @@ describe('BST Comparator Tests', () => {
|
|
|
2911
2911
|
|
|
2912
2912
|
const bst = new BST<number[]>([], { comparator });
|
|
2913
2913
|
|
|
2914
|
-
bst.
|
|
2915
|
-
bst.
|
|
2916
|
-
bst.
|
|
2914
|
+
bst.set([1, 2, 3]);
|
|
2915
|
+
bst.set([2, 2, 2]);
|
|
2916
|
+
bst.set([1, 1, 1]);
|
|
2917
2917
|
|
|
2918
2918
|
expect(bst.size).toBeGreaterThan(0);
|
|
2919
2919
|
});
|
|
@@ -2965,7 +2965,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2965
2965
|
{ departmentId: 1, employeeId: 102 }
|
|
2966
2966
|
];
|
|
2967
2967
|
|
|
2968
|
-
keys.forEach(k => bst.
|
|
2968
|
+
keys.forEach(k => bst.set(k));
|
|
2969
2969
|
|
|
2970
2970
|
expect(bst.size).toBe(5);
|
|
2971
2971
|
const inOrder = bst.dfs(node => node?.key);
|
|
@@ -2992,7 +2992,7 @@ describe('BST Comparator Tests', () => {
|
|
|
2992
2992
|
{ departmentId: 2, employeeId: 102 }
|
|
2993
2993
|
];
|
|
2994
2994
|
|
|
2995
|
-
keys.forEach(k => bst.
|
|
2995
|
+
keys.forEach(k => bst.set(k));
|
|
2996
2996
|
|
|
2997
2997
|
const searchKey = keys[1];
|
|
2998
2998
|
const result = bst.search(searchKey);
|
|
@@ -3017,7 +3017,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3017
3017
|
{ departmentId: 2, employeeId: 102 }
|
|
3018
3018
|
];
|
|
3019
3019
|
|
|
3020
|
-
keys.forEach(k => bst.
|
|
3020
|
+
keys.forEach(k => bst.set(k));
|
|
3021
3021
|
|
|
3022
3022
|
const keyToDelete = keys[1];
|
|
3023
3023
|
const deleted = bst.delete(keyToDelete);
|
|
@@ -3043,7 +3043,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3043
3043
|
{ departmentId: 2, employeeId: 102 }
|
|
3044
3044
|
];
|
|
3045
3045
|
|
|
3046
|
-
keys.forEach(k => bst.
|
|
3046
|
+
keys.forEach(k => bst.set(k));
|
|
3047
3047
|
|
|
3048
3048
|
const searchKey = { departmentId: 1, employeeId: 103 };
|
|
3049
3049
|
const ceiling = bst.ceiling(searchKey);
|
|
@@ -3081,8 +3081,8 @@ describe('BST Comparator Tests', () => {
|
|
|
3081
3081
|
const key2: PersonKey = { id: 2, country: 'Canada' };
|
|
3082
3082
|
const value2: PersonValue = { name: 'Bob', email: 'bob@example.com', age: 25 };
|
|
3083
3083
|
|
|
3084
|
-
bst.
|
|
3085
|
-
bst.
|
|
3084
|
+
bst.set([key1, value1]);
|
|
3085
|
+
bst.set([key2, value2]);
|
|
3086
3086
|
|
|
3087
3087
|
expect(bst.size).toBe(2);
|
|
3088
3088
|
expect(bst.get(key1)).toEqual(value1);
|
|
@@ -3102,10 +3102,10 @@ describe('BST Comparator Tests', () => {
|
|
|
3102
3102
|
const value1: PersonValue = { name: 'Alice', email: 'alice@example.com', age: 30 };
|
|
3103
3103
|
const value2: PersonValue = { name: 'Alice Updated', email: 'alice.new@example.com', age: 31 };
|
|
3104
3104
|
|
|
3105
|
-
bst.
|
|
3105
|
+
bst.set([key, value1]);
|
|
3106
3106
|
expect(bst.get(key)).toEqual(value1);
|
|
3107
3107
|
|
|
3108
|
-
bst.
|
|
3108
|
+
bst.set([key, value2]);
|
|
3109
3109
|
expect(bst.size).toBe(1);
|
|
3110
3110
|
expect(bst.get(key)).toEqual(value2);
|
|
3111
3111
|
});
|
|
@@ -3134,7 +3134,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3134
3134
|
]
|
|
3135
3135
|
];
|
|
3136
3136
|
|
|
3137
|
-
entries.forEach(([key, value]) => bst.
|
|
3137
|
+
entries.forEach(([key, value]) => bst.set([key, value]));
|
|
3138
3138
|
|
|
3139
3139
|
expect(bst.size).toBe(3);
|
|
3140
3140
|
|
|
@@ -3162,8 +3162,8 @@ describe('BST Comparator Tests', () => {
|
|
|
3162
3162
|
const key2: PersonKey = { id: 2, country: 'Canada' };
|
|
3163
3163
|
const value2: PersonValue = { name: 'Bob', email: 'bob@example.com', age: 25 };
|
|
3164
3164
|
|
|
3165
|
-
bst.
|
|
3166
|
-
bst.
|
|
3165
|
+
bst.set([key1, value1]);
|
|
3166
|
+
bst.set([key2, value2]);
|
|
3167
3167
|
|
|
3168
3168
|
bst.delete(key1);
|
|
3169
3169
|
|
|
@@ -3197,7 +3197,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3197
3197
|
]
|
|
3198
3198
|
];
|
|
3199
3199
|
|
|
3200
|
-
entries.forEach(([key, value]) => bst.
|
|
3200
|
+
entries.forEach(([key, value]) => bst.set([key, value]));
|
|
3201
3201
|
|
|
3202
3202
|
const searchKey: PersonKey = entries[1][0];
|
|
3203
3203
|
const value = bst.get(searchKey);
|
|
@@ -3225,7 +3225,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3225
3225
|
]
|
|
3226
3226
|
];
|
|
3227
3227
|
|
|
3228
|
-
entries.forEach(([key, value]) => bst.
|
|
3228
|
+
entries.forEach(([key, value]) => bst.set([key, value]));
|
|
3229
3229
|
|
|
3230
3230
|
const mapped = bst.map((value, key) => [key, value?.name], { comparator, isMapMode: false });
|
|
3231
3231
|
|
|
@@ -3243,7 +3243,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3243
3243
|
const bst = new BST<number, string>([], { comparator, isMapMode: true });
|
|
3244
3244
|
|
|
3245
3245
|
for (let i = 1; i <= 10; i++) {
|
|
3246
|
-
bst.
|
|
3246
|
+
bst.set([i, `value-${i}`]);
|
|
3247
3247
|
}
|
|
3248
3248
|
|
|
3249
3249
|
const result = bst.rangeSearch([3, 7]);
|
|
@@ -3287,7 +3287,7 @@ describe('BST Comparator Tests', () => {
|
|
|
3287
3287
|
]
|
|
3288
3288
|
];
|
|
3289
3289
|
|
|
3290
|
-
tasks.forEach(([key, value]) => bst.
|
|
3290
|
+
tasks.forEach(([key, value]) => bst.set([key, value]));
|
|
3291
3291
|
|
|
3292
3292
|
expect(bst.size).toBe(4);
|
|
3293
3293
|
|
|
@@ -3319,8 +3319,8 @@ describe('classic use', () => {
|
|
|
3319
3319
|
expect(bst.size).toBe(16);
|
|
3320
3320
|
|
|
3321
3321
|
// Add new elements
|
|
3322
|
-
bst.
|
|
3323
|
-
bst.
|
|
3322
|
+
bst.set(17);
|
|
3323
|
+
bst.set(0);
|
|
3324
3324
|
expect(bst.size).toBe(18);
|
|
3325
3325
|
|
|
3326
3326
|
// Verify keys are searchable
|
|
@@ -3368,7 +3368,7 @@ describe('classic use', () => {
|
|
|
3368
3368
|
|
|
3369
3369
|
// Merge datasets into a single BinarySearchTree
|
|
3370
3370
|
const merged = new BST<number, string>(dataset1);
|
|
3371
|
-
merged.
|
|
3371
|
+
merged.setMany(dataset2);
|
|
3372
3372
|
merged.merge(dataset3);
|
|
3373
3373
|
|
|
3374
3374
|
// Verify merged dataset is in sorted order
|