data-structure-typed 2.2.7 → 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/README.md +14 -3
- package/README_CN.md +119 -275
- package/benchmark/report.html +1 -1
- package/benchmark/report.json +20 -324
- package/dist/cjs/index.cjs +106 -107
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +106 -107
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +106 -107
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +106 -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 +102 -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.umd.config.js +29 -0
- package/tsup.node.config.js +0 -83
|
@@ -3,9 +3,9 @@ import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
|
|
|
3
3
|
describe('Overall BinaryTree Test', () => {
|
|
4
4
|
it('should perform various operations on BinaryTree', () => {
|
|
5
5
|
const bst = new BST<number>();
|
|
6
|
-
bst.
|
|
7
|
-
bst.
|
|
8
|
-
bst.
|
|
6
|
+
bst.set(11);
|
|
7
|
+
bst.set(3);
|
|
8
|
+
bst.setMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
|
|
9
9
|
expect(bst.size).toBe(16); // true
|
|
10
10
|
bst.has(6); // true
|
|
11
11
|
expect(bst.has(6)).toBe(true); // true
|
|
@@ -24,10 +24,10 @@ describe('Overall BinaryTree Test', () => {
|
|
|
24
24
|
expect(bfsIDs[0]).toBe(11);
|
|
25
25
|
|
|
26
26
|
const objBST = new BST<number, { key: number; keyA: number }>();
|
|
27
|
-
objBST.
|
|
28
|
-
objBST.
|
|
27
|
+
objBST.set([11, { key: 11, keyA: 11 }]);
|
|
28
|
+
objBST.set([3, { key: 3, keyA: 3 }]);
|
|
29
29
|
|
|
30
|
-
objBST.
|
|
30
|
+
objBST.setMany([
|
|
31
31
|
[15, { key: 15, keyA: 15 }],
|
|
32
32
|
[1, { key: 1, keyA: 1 }],
|
|
33
33
|
[8, { key: 8, keyA: 8 }],
|
|
@@ -47,7 +47,7 @@ describe('Overall BinaryTree Test', () => {
|
|
|
47
47
|
objBST.delete(11);
|
|
48
48
|
|
|
49
49
|
const avlTree = new AVLTree();
|
|
50
|
-
avlTree.
|
|
50
|
+
avlTree.setMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
|
|
51
51
|
avlTree.isAVLBalanced(); // true
|
|
52
52
|
expect(avlTree.isAVLBalanced()).toBe(true); // true
|
|
53
53
|
avlTree.delete(10);
|
|
@@ -103,9 +103,9 @@ describe('Overall BinaryTree Test', () => {
|
|
|
103
103
|
comparator: (a, b) => b - a
|
|
104
104
|
});
|
|
105
105
|
expect(avl.size).toBe(5);
|
|
106
|
-
avl.
|
|
107
|
-
avl.
|
|
108
|
-
avl.
|
|
106
|
+
avl.set(2);
|
|
107
|
+
avl.set(5);
|
|
108
|
+
avl.set(4);
|
|
109
109
|
expect(avl.root?.key).toBe(3);
|
|
110
110
|
expect(avl.root?.left?.key).toBe(7);
|
|
111
111
|
expect(avl.root?.left?.left?.key).toBe(9);
|
|
@@ -145,11 +145,11 @@ describe('Overall BinaryTree Test', () => {
|
|
|
145
145
|
iterationType: 'RECURSIVE'
|
|
146
146
|
});
|
|
147
147
|
expect(tmm.size).toBe(5);
|
|
148
|
-
tmm.
|
|
149
|
-
tmm.
|
|
150
|
-
tmm.
|
|
151
|
-
tmm.
|
|
152
|
-
tmm.
|
|
148
|
+
tmm.set(2);
|
|
149
|
+
tmm.set(2);
|
|
150
|
+
tmm.set(2);
|
|
151
|
+
tmm.set(5);
|
|
152
|
+
tmm.set(4);
|
|
153
153
|
expect(tmm.root?.key).toBe(3);
|
|
154
154
|
expect(tmm.root?.left?.key).toBe(1);
|
|
155
155
|
expect(tmm.root?.left?.left?.key).toBe(NaN);
|
|
@@ -190,11 +190,11 @@ describe('Overall BinaryTree Test', () => {
|
|
|
190
190
|
iterationType: 'RECURSIVE'
|
|
191
191
|
});
|
|
192
192
|
expect(rbTree.size).toBe(5);
|
|
193
|
-
rbTree.
|
|
194
|
-
rbTree.
|
|
195
|
-
rbTree.
|
|
196
|
-
rbTree.
|
|
197
|
-
rbTree.
|
|
193
|
+
rbTree.set(2);
|
|
194
|
+
rbTree.set(2);
|
|
195
|
+
rbTree.set(2);
|
|
196
|
+
rbTree.set(5);
|
|
197
|
+
rbTree.set(4);
|
|
198
198
|
expect(rbTree.root?.key).toBe(3);
|
|
199
199
|
expect(rbTree.root?.left?.key).toBe(1);
|
|
200
200
|
expect(rbTree.root?.left?.left?.key).toBe(NaN);
|
|
@@ -17,9 +17,9 @@ describe('RedBlackTree 1', () => {
|
|
|
17
17
|
|
|
18
18
|
describe('add and getNode', () => {
|
|
19
19
|
it('should add and find a node in the rbTree', () => {
|
|
20
|
-
rbTree.
|
|
21
|
-
rbTree.
|
|
22
|
-
rbTree.
|
|
20
|
+
rbTree.set(10);
|
|
21
|
+
rbTree.set(20);
|
|
22
|
+
rbTree.set(5);
|
|
23
23
|
|
|
24
24
|
expect(rbTree.getNode(10)).toBeInstanceOf(RedBlackTreeNode);
|
|
25
25
|
expect(rbTree.getNode(20)).toBeInstanceOf(RedBlackTreeNode);
|
|
@@ -28,8 +28,8 @@ describe('RedBlackTree 1', () => {
|
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
it('should add and find nodes with negative keys', () => {
|
|
31
|
-
rbTree.
|
|
32
|
-
rbTree.
|
|
31
|
+
rbTree.set(-10);
|
|
32
|
+
rbTree.set(-20);
|
|
33
33
|
|
|
34
34
|
expect(rbTree.getNode(-10)).toBeInstanceOf(RedBlackTreeNode);
|
|
35
35
|
expect(rbTree.getNode(-20)).toBeInstanceOf(RedBlackTreeNode);
|
|
@@ -38,36 +38,36 @@ describe('RedBlackTree 1', () => {
|
|
|
38
38
|
|
|
39
39
|
describe('deleteNode', () => {
|
|
40
40
|
it('should delete a node from the rbTree', () => {
|
|
41
|
-
rbTree.
|
|
42
|
-
rbTree.
|
|
43
|
-
rbTree.
|
|
41
|
+
rbTree.set(10);
|
|
42
|
+
rbTree.set(20);
|
|
43
|
+
rbTree.set(5);
|
|
44
44
|
rbTree.delete(20);
|
|
45
45
|
|
|
46
46
|
expect(rbTree.getNode(20)).toBe(undefined);
|
|
47
47
|
});
|
|
48
48
|
|
|
49
49
|
it('should handle deleting a non-existent node', () => {
|
|
50
|
-
rbTree.
|
|
51
|
-
rbTree.
|
|
52
|
-
rbTree.
|
|
50
|
+
rbTree.set(10);
|
|
51
|
+
rbTree.set(20);
|
|
52
|
+
rbTree.set(5);
|
|
53
53
|
rbTree.delete(15);
|
|
54
54
|
|
|
55
55
|
expect(rbTree.getNode(15)).toBe(undefined);
|
|
56
56
|
});
|
|
57
57
|
|
|
58
58
|
it('should getNode performance O(log n)', () => {
|
|
59
|
-
for (let i = 0; i < 10; i++) rbTree.
|
|
59
|
+
for (let i = 0; i < 10; i++) rbTree.set(i);
|
|
60
60
|
rbTree.getNode(6);
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
describe('minimum', () => {
|
|
65
65
|
it('should find the minimum node in the rbTree', () => {
|
|
66
|
-
rbTree.
|
|
67
|
-
rbTree.
|
|
68
|
-
rbTree.
|
|
69
|
-
rbTree.
|
|
70
|
-
rbTree.
|
|
66
|
+
rbTree.set(10);
|
|
67
|
+
rbTree.set(20);
|
|
68
|
+
rbTree.set(5);
|
|
69
|
+
rbTree.set(15);
|
|
70
|
+
rbTree.set(3);
|
|
71
71
|
|
|
72
72
|
const minNode = rbTree.getLeftMost(node => node, rbTree.root);
|
|
73
73
|
expect(minNode?.key).toBe(3);
|
|
@@ -81,11 +81,11 @@ describe('RedBlackTree 1', () => {
|
|
|
81
81
|
|
|
82
82
|
describe('getRightMost', () => {
|
|
83
83
|
it('should find the getRightMost node in the rbTree', () => {
|
|
84
|
-
rbTree.
|
|
85
|
-
rbTree.
|
|
86
|
-
rbTree.
|
|
87
|
-
rbTree.
|
|
88
|
-
rbTree.
|
|
84
|
+
rbTree.set(10);
|
|
85
|
+
rbTree.set(20);
|
|
86
|
+
rbTree.set(5);
|
|
87
|
+
rbTree.set(15);
|
|
88
|
+
rbTree.set(25);
|
|
89
89
|
|
|
90
90
|
const maxNode = rbTree.getRightMost(node => node, rbTree.root);
|
|
91
91
|
expect(maxNode?.key).toBe(25);
|
|
@@ -99,11 +99,11 @@ describe('RedBlackTree 1', () => {
|
|
|
99
99
|
|
|
100
100
|
describe('getSuccessor', () => {
|
|
101
101
|
it('should find the getSuccessor of a node', () => {
|
|
102
|
-
rbTree.
|
|
103
|
-
rbTree.
|
|
104
|
-
rbTree.
|
|
105
|
-
rbTree.
|
|
106
|
-
rbTree.
|
|
102
|
+
rbTree.set(10);
|
|
103
|
+
rbTree.set(20);
|
|
104
|
+
rbTree.set(5);
|
|
105
|
+
rbTree.set(15);
|
|
106
|
+
rbTree.set(25);
|
|
107
107
|
|
|
108
108
|
const node = rbTree.getNode(15);
|
|
109
109
|
const successorNode = rbTree.getSuccessor(node!);
|
|
@@ -112,8 +112,8 @@ describe('RedBlackTree 1', () => {
|
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
it('should handle a node with no getSuccessor', () => {
|
|
115
|
-
rbTree.
|
|
116
|
-
rbTree.
|
|
115
|
+
rbTree.set(10);
|
|
116
|
+
rbTree.set(5);
|
|
117
117
|
|
|
118
118
|
const node = rbTree.getNode(10);
|
|
119
119
|
const successorNode = rbTree.getSuccessor(node!);
|
|
@@ -124,11 +124,11 @@ describe('RedBlackTree 1', () => {
|
|
|
124
124
|
|
|
125
125
|
describe('getPredecessor', () => {
|
|
126
126
|
it('should find the getPredecessor of a node', () => {
|
|
127
|
-
rbTree.
|
|
128
|
-
rbTree.
|
|
129
|
-
rbTree.
|
|
130
|
-
rbTree.
|
|
131
|
-
rbTree.
|
|
127
|
+
rbTree.set(10);
|
|
128
|
+
rbTree.set(20);
|
|
129
|
+
rbTree.set(5);
|
|
130
|
+
rbTree.set(15);
|
|
131
|
+
rbTree.set(25);
|
|
132
132
|
|
|
133
133
|
const node = rbTree.getNode(20);
|
|
134
134
|
const predecessorNode = rbTree.getPredecessor(node!);
|
|
@@ -137,8 +137,8 @@ describe('RedBlackTree 1', () => {
|
|
|
137
137
|
});
|
|
138
138
|
|
|
139
139
|
it('should handle a node with no getPredecessor', () => {
|
|
140
|
-
rbTree.
|
|
141
|
-
rbTree.
|
|
140
|
+
rbTree.set(10);
|
|
141
|
+
rbTree.set(20);
|
|
142
142
|
|
|
143
143
|
const node = rbTree.getNode(20);
|
|
144
144
|
const predecessorNode = rbTree.getPredecessor(node!);
|
|
@@ -160,7 +160,7 @@ describe('RedBlackTree 1', () => {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
const rbTree = new RedBlackTree<string, number>();
|
|
163
|
-
rbTree.
|
|
163
|
+
rbTree.setMany([
|
|
164
164
|
['2', 2],
|
|
165
165
|
['4', 4],
|
|
166
166
|
['5', 5],
|
|
@@ -188,17 +188,17 @@ describe('RedBlackTree 1', () => {
|
|
|
188
188
|
const rbTree = new RedBlackTree<number, string>([4, 5, [1, '1'], 2, 3], { isMapMode: false });
|
|
189
189
|
expect(rbTree.get(1)).toBe('1');
|
|
190
190
|
expect(rbTree.getNode(1)?.value).toBe('1');
|
|
191
|
-
rbTree.
|
|
191
|
+
rbTree.set(1, 'a');
|
|
192
192
|
expect(rbTree.get(1)).toBe('a');
|
|
193
|
-
rbTree.
|
|
193
|
+
rbTree.set([1, 'b']);
|
|
194
194
|
expect(rbTree.getNode(1)?.value).toBe('b');
|
|
195
195
|
expect(rbTree.get(1)).toBe('b');
|
|
196
196
|
const treeMap = new RedBlackTree<number>([4, 5, [1, '1'], 2, 3]);
|
|
197
197
|
expect(treeMap.get(1)).toBe('1');
|
|
198
198
|
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
199
|
-
treeMap.
|
|
199
|
+
treeMap.set(1, 'a');
|
|
200
200
|
expect(treeMap.get(1)).toBe('a');
|
|
201
|
-
treeMap.
|
|
201
|
+
treeMap.set([1, 'b']);
|
|
202
202
|
expect(treeMap.getNode(1)?.value).toBe(undefined);
|
|
203
203
|
expect(treeMap.get(1)).toBe('b');
|
|
204
204
|
});
|
|
@@ -212,68 +212,68 @@ describe('RedBlackTree 2', () => {
|
|
|
212
212
|
});
|
|
213
213
|
|
|
214
214
|
it('should add nodes into the rbTree', () => {
|
|
215
|
-
rbTree.
|
|
215
|
+
rbTree.set(10);
|
|
216
216
|
expect(rbTree.getNode(10)).toBeDefined();
|
|
217
|
-
rbTree.
|
|
217
|
+
rbTree.set(20);
|
|
218
218
|
expect(rbTree.getNode(20)).toBeDefined();
|
|
219
|
-
rbTree.
|
|
219
|
+
rbTree.set(5);
|
|
220
220
|
expect(rbTree.getNode(5)).toBeDefined();
|
|
221
221
|
});
|
|
222
222
|
|
|
223
223
|
it('should delete nodes from the rbTree', () => {
|
|
224
|
-
rbTree.
|
|
225
|
-
rbTree.
|
|
226
|
-
rbTree.
|
|
224
|
+
rbTree.set(10);
|
|
225
|
+
rbTree.set(20);
|
|
226
|
+
rbTree.set(5);
|
|
227
227
|
rbTree.delete(20);
|
|
228
228
|
expect(rbTree.getNode(20)).toBe(undefined);
|
|
229
229
|
});
|
|
230
230
|
|
|
231
231
|
it('should get the successor of a node', () => {
|
|
232
|
-
rbTree.
|
|
233
|
-
rbTree.
|
|
232
|
+
rbTree.set(10);
|
|
233
|
+
rbTree.set(20);
|
|
234
234
|
const node = rbTree.getNode(10);
|
|
235
235
|
const successor = rbTree.getSuccessor(node!);
|
|
236
236
|
expect(successor?.key).toBe(20);
|
|
237
237
|
});
|
|
238
238
|
|
|
239
239
|
it('should get the predecessor of a node', () => {
|
|
240
|
-
rbTree.
|
|
241
|
-
rbTree.
|
|
240
|
+
rbTree.set(10);
|
|
241
|
+
rbTree.set(20);
|
|
242
242
|
const node = rbTree.getNode(20);
|
|
243
243
|
const predecessor = rbTree.getPredecessor(node!);
|
|
244
244
|
expect(predecessor?.key).toBe(20);
|
|
245
245
|
});
|
|
246
246
|
|
|
247
247
|
it('should rotate nodes to the left', () => {
|
|
248
|
-
rbTree.
|
|
249
|
-
rbTree.
|
|
250
|
-
rbTree.
|
|
248
|
+
rbTree.set(10);
|
|
249
|
+
rbTree.set(20);
|
|
250
|
+
rbTree.set(5);
|
|
251
251
|
const node = rbTree.getNode(10);
|
|
252
|
-
rbTree.
|
|
252
|
+
rbTree.set(15);
|
|
253
253
|
// Verify that rotation has occurred
|
|
254
254
|
expect(node?.left?.key).toBe(5);
|
|
255
255
|
expect(node?.right?.key).toBe(20);
|
|
256
256
|
});
|
|
257
257
|
|
|
258
258
|
it('should rotate nodes to the right', () => {
|
|
259
|
-
rbTree.
|
|
260
|
-
rbTree.
|
|
261
|
-
rbTree.
|
|
259
|
+
rbTree.set(10);
|
|
260
|
+
rbTree.set(20);
|
|
261
|
+
rbTree.set(5);
|
|
262
262
|
const node = rbTree.getNode(20);
|
|
263
|
-
rbTree.
|
|
263
|
+
rbTree.set(25);
|
|
264
264
|
// Verify that rotation has occurred
|
|
265
265
|
expect(node?.left?.key).toBeNaN();
|
|
266
266
|
expect(node?.right?.key).toBe(25);
|
|
267
267
|
});
|
|
268
268
|
|
|
269
269
|
it('should all node attributes fully conform to the red-black rbTree standards.', () => {
|
|
270
|
-
rbTree.
|
|
271
|
-
rbTree.
|
|
272
|
-
rbTree.
|
|
273
|
-
rbTree.
|
|
274
|
-
rbTree.
|
|
275
|
-
rbTree.
|
|
276
|
-
rbTree.
|
|
270
|
+
rbTree.set(10);
|
|
271
|
+
rbTree.set(20);
|
|
272
|
+
rbTree.set(5);
|
|
273
|
+
rbTree.set(15);
|
|
274
|
+
rbTree.set(21);
|
|
275
|
+
rbTree.set(6);
|
|
276
|
+
rbTree.set(2);
|
|
277
277
|
|
|
278
278
|
let node10F = rbTree.getNode(10);
|
|
279
279
|
let node20F = rbTree.getNode(20);
|
|
@@ -409,31 +409,31 @@ describe('RedBlackTree 2', () => {
|
|
|
409
409
|
});
|
|
410
410
|
|
|
411
411
|
it('should fix the rbTree after insertion', () => {
|
|
412
|
-
rbTree.
|
|
413
|
-
rbTree.
|
|
414
|
-
rbTree.
|
|
415
|
-
rbTree.
|
|
412
|
+
rbTree.set(1);
|
|
413
|
+
rbTree.set(2);
|
|
414
|
+
rbTree.set(5);
|
|
415
|
+
rbTree.set(15);
|
|
416
416
|
const node15F = rbTree.getNode(15);
|
|
417
417
|
expect(node15F?.left).toBe(rbTree.NIL);
|
|
418
418
|
expect(node15F?.right).toBe(rbTree.NIL);
|
|
419
419
|
expect(node15F?.parent).toBe(rbTree.getNode(5));
|
|
420
420
|
|
|
421
|
-
rbTree.
|
|
422
|
-
rbTree.
|
|
423
|
-
rbTree.
|
|
424
|
-
rbTree.
|
|
425
|
-
rbTree.
|
|
426
|
-
rbTree.
|
|
421
|
+
rbTree.set(25);
|
|
422
|
+
rbTree.set(10);
|
|
423
|
+
rbTree.set(8);
|
|
424
|
+
rbTree.set(28);
|
|
425
|
+
rbTree.set(111);
|
|
426
|
+
rbTree.set(12);
|
|
427
427
|
rbTree.delete(2);
|
|
428
|
-
rbTree.
|
|
429
|
-
rbTree.
|
|
430
|
-
rbTree.
|
|
431
|
-
rbTree.
|
|
428
|
+
rbTree.set(22);
|
|
429
|
+
rbTree.set(50);
|
|
430
|
+
rbTree.set(155);
|
|
431
|
+
rbTree.set(225);
|
|
432
432
|
const node225F = rbTree.getNode(225);
|
|
433
433
|
expect(node225F?.left).toBe(rbTree.NIL);
|
|
434
434
|
expect(node225F?.right).toBe(rbTree.NIL);
|
|
435
435
|
expect(node225F?.parent?.key).toBe(155);
|
|
436
|
-
rbTree.
|
|
436
|
+
rbTree.set(7);
|
|
437
437
|
if (isDebug) rbTree.print();
|
|
438
438
|
|
|
439
439
|
const node15S = rbTree.getNode(15);
|
|
@@ -448,9 +448,9 @@ describe('RedBlackTree 2', () => {
|
|
|
448
448
|
const node15T = rbTree.getNode(15);
|
|
449
449
|
expect(node15T).toBe(undefined);
|
|
450
450
|
|
|
451
|
-
rbTree.
|
|
452
|
-
rbTree.
|
|
453
|
-
rbTree.
|
|
451
|
+
rbTree.set(23);
|
|
452
|
+
rbTree.set(33);
|
|
453
|
+
rbTree.set(15);
|
|
454
454
|
|
|
455
455
|
const nodeLM = rbTree.getLeftMost();
|
|
456
456
|
expect(nodeLM).toBe(1);
|
|
@@ -469,19 +469,19 @@ describe('RedBlackTree 2', () => {
|
|
|
469
469
|
expect(node225S?.parent?.key).toBe(155);
|
|
470
470
|
// TODO
|
|
471
471
|
// expect(rbTree.getNode(0)).toBe(undefined);
|
|
472
|
-
rbTree.
|
|
473
|
-
rbTree.
|
|
474
|
-
rbTree.
|
|
475
|
-
rbTree.
|
|
476
|
-
rbTree.
|
|
477
|
-
rbTree.
|
|
478
|
-
rbTree.
|
|
479
|
-
rbTree.
|
|
480
|
-
rbTree.
|
|
481
|
-
rbTree.
|
|
482
|
-
rbTree.
|
|
483
|
-
rbTree.
|
|
484
|
-
rbTree.
|
|
472
|
+
rbTree.set(2);
|
|
473
|
+
rbTree.set(3);
|
|
474
|
+
rbTree.set(4);
|
|
475
|
+
rbTree.set(6);
|
|
476
|
+
rbTree.set(9);
|
|
477
|
+
rbTree.set(11);
|
|
478
|
+
rbTree.set(13);
|
|
479
|
+
rbTree.set(14);
|
|
480
|
+
rbTree.set(16);
|
|
481
|
+
rbTree.set(17);
|
|
482
|
+
rbTree.set(18);
|
|
483
|
+
rbTree.set(19);
|
|
484
|
+
rbTree.set(110);
|
|
485
485
|
|
|
486
486
|
if (isDebug) rbTree.print();
|
|
487
487
|
|
|
@@ -494,7 +494,7 @@ describe('RedBlackTree 2', () => {
|
|
|
494
494
|
|
|
495
495
|
it('should fix the rbTree after insertion and deletion', () => {
|
|
496
496
|
for (let i = 0; i < 100; i++) {
|
|
497
|
-
rbTree.
|
|
497
|
+
rbTree.set(i);
|
|
498
498
|
}
|
|
499
499
|
for (let i = 0; i < 49; i++) {
|
|
500
500
|
rbTree.delete(i);
|
|
@@ -516,7 +516,7 @@ describe('RedBlackTree 2', () => {
|
|
|
516
516
|
|
|
517
517
|
it('should fix the rbTree after large scale insertion and deletion', () => {
|
|
518
518
|
for (let i = 0; i < 10000; i++) {
|
|
519
|
-
rbTree.
|
|
519
|
+
rbTree.set(i);
|
|
520
520
|
}
|
|
521
521
|
for (let i = 0; i < 10000; i++) {
|
|
522
522
|
rbTree.delete(i);
|
|
@@ -528,7 +528,7 @@ describe('RedBlackTree 2', () => {
|
|
|
528
528
|
|
|
529
529
|
rbTree.clear();
|
|
530
530
|
for (let i = 0; i < 1000; i++) {
|
|
531
|
-
rbTree.
|
|
531
|
+
rbTree.set(getRandomInt(-100, 1000));
|
|
532
532
|
rbTree.delete(getRandomInt(-100, 1000));
|
|
533
533
|
}
|
|
534
534
|
|
|
@@ -543,7 +543,7 @@ describe('RedBlackTree 2', () => {
|
|
|
543
543
|
rbTree.clear();
|
|
544
544
|
const tS = performance.now();
|
|
545
545
|
for (let i = 0; i < arr.length; i++) {
|
|
546
|
-
rbTree.
|
|
546
|
+
rbTree.set(arr[i]);
|
|
547
547
|
}
|
|
548
548
|
if (isDebug) console.log(performance.now() - tS);
|
|
549
549
|
|
|
@@ -556,19 +556,19 @@ describe('RedBlackTree 2', () => {
|
|
|
556
556
|
});
|
|
557
557
|
|
|
558
558
|
it('duplicates', () => {
|
|
559
|
-
rbTree.
|
|
559
|
+
rbTree.setMany([9, 8, 7, 8, 8, 8, 2, 3, 6, 5, 5, 4]);
|
|
560
560
|
if (isDebug) rbTree.print();
|
|
561
561
|
|
|
562
562
|
expect(rbTree.size).toBe(8);
|
|
563
563
|
expect(rbTree.isBST()).toBe(true);
|
|
564
564
|
expect(rbTree.isAVLBalanced()).toBe(true);
|
|
565
|
-
rbTree.
|
|
565
|
+
rbTree.setMany([10, 5, 2, 11]);
|
|
566
566
|
expect(rbTree.size).toBe(10);
|
|
567
567
|
expect(rbTree.isBST()).toBe(true);
|
|
568
568
|
expect(rbTree.isAVLBalanced()).toBe(true);
|
|
569
569
|
|
|
570
570
|
rbTree.clear();
|
|
571
|
-
rbTree.
|
|
571
|
+
rbTree.setMany([10, 20, 30, 40, 50, 60]);
|
|
572
572
|
expect(rbTree.isAVLBalanced()).toBe(false);
|
|
573
573
|
});
|
|
574
574
|
|
|
@@ -581,7 +581,7 @@ describe('RedBlackTree 2', () => {
|
|
|
581
581
|
});
|
|
582
582
|
it('The structure remains normal after random deletion', function () {
|
|
583
583
|
for (let i = 0; i < inputSize; i++) {
|
|
584
|
-
rbTree.
|
|
584
|
+
rbTree.set(i);
|
|
585
585
|
}
|
|
586
586
|
|
|
587
587
|
for (let i = 0; i < inputSize; i++) {
|
|
@@ -607,7 +607,7 @@ describe('RedBlackTree 2', () => {
|
|
|
607
607
|
for (let i = 0; i < inputSize; i++) {
|
|
608
608
|
const num = getRandomInt(0, inputSize - 1);
|
|
609
609
|
if (i === 0 && isDebug) console.log(`first:`, num);
|
|
610
|
-
rbTree.
|
|
610
|
+
rbTree.set(num);
|
|
611
611
|
}
|
|
612
612
|
|
|
613
613
|
for (let i = 0; i < inputSize; i++) {
|
|
@@ -634,9 +634,9 @@ describe('RedBlackTree 2', () => {
|
|
|
634
634
|
let rbTree: RedBlackTree<number, string>;
|
|
635
635
|
beforeEach(() => {
|
|
636
636
|
rbTree = new RedBlackTree();
|
|
637
|
-
rbTree.
|
|
638
|
-
rbTree.
|
|
639
|
-
rbTree.
|
|
637
|
+
rbTree.set([1, 'a']);
|
|
638
|
+
rbTree.set(2, 'b');
|
|
639
|
+
rbTree.set([3, 'c']);
|
|
640
640
|
});
|
|
641
641
|
|
|
642
642
|
it('The node obtained by get Node should match the node type', () => {
|
|
@@ -706,59 +706,59 @@ describe('RedBlackTree - _deleteFixup', () => {
|
|
|
706
706
|
});
|
|
707
707
|
|
|
708
708
|
it('should handle deleting a red leaf node', () => {
|
|
709
|
-
rbTree.
|
|
710
|
-
rbTree.
|
|
711
|
-
rbTree.
|
|
709
|
+
rbTree.set(10, 10);
|
|
710
|
+
rbTree.set(5, 5); // Red leaf
|
|
711
|
+
rbTree.set(20, 20);
|
|
712
712
|
|
|
713
713
|
expect(rbTree.delete(5)).toHaveLength(1); // Delete red leaf
|
|
714
714
|
expect(rbTree.root?.left).toBe(rbTree.NIL); // Left child should be NIL
|
|
715
715
|
});
|
|
716
716
|
|
|
717
717
|
it('should handle deleting a black leaf node', () => {
|
|
718
|
-
rbTree.
|
|
719
|
-
rbTree.
|
|
720
|
-
rbTree.
|
|
721
|
-
rbTree.
|
|
718
|
+
rbTree.set(10, 10);
|
|
719
|
+
rbTree.set(5, 5); // Black node
|
|
720
|
+
rbTree.set(20, 20);
|
|
721
|
+
rbTree.set(1, 1); // Black leaf node
|
|
722
722
|
|
|
723
723
|
expect(rbTree.delete(1)).toHaveLength(1); // Delete black leaf
|
|
724
724
|
expect(rbTree.root?.left?.left).toBe(rbTree.NIL);
|
|
725
725
|
});
|
|
726
726
|
|
|
727
727
|
it('should handle deleting black node with red sibling', () => {
|
|
728
|
-
rbTree.
|
|
729
|
-
rbTree.
|
|
730
|
-
rbTree.
|
|
731
|
-
rbTree.
|
|
728
|
+
rbTree.set(10, 10);
|
|
729
|
+
rbTree.set(5, 5); // Black node
|
|
730
|
+
rbTree.set(20, 20); // Red sibling
|
|
731
|
+
rbTree.set(25, 25); // Force the sibling to be red
|
|
732
732
|
|
|
733
733
|
expect(rbTree.delete(5)).toHaveLength(1); // Delete black node
|
|
734
734
|
expect(rbTree.root?.right?.color).toBe('BLACK'); // Ensure sibling color is black after fixup
|
|
735
735
|
});
|
|
736
736
|
|
|
737
737
|
it('should handle deleting black node with black sibling', () => {
|
|
738
|
-
rbTree.
|
|
739
|
-
rbTree.
|
|
740
|
-
rbTree.
|
|
738
|
+
rbTree.set(10, 10);
|
|
739
|
+
rbTree.set(5, 5); // Black node
|
|
740
|
+
rbTree.set(20, 20); // Black sibling
|
|
741
741
|
|
|
742
742
|
expect(rbTree.delete(5)).toHaveLength(1); // Delete black node
|
|
743
743
|
expect(rbTree.root?.left).toBe(rbTree.NIL);
|
|
744
744
|
});
|
|
745
745
|
|
|
746
746
|
it('should handle deleting the root node', () => {
|
|
747
|
-
rbTree.
|
|
748
|
-
rbTree.
|
|
749
|
-
rbTree.
|
|
747
|
+
rbTree.set(10, 10); // Root node
|
|
748
|
+
rbTree.set(5, 5);
|
|
749
|
+
rbTree.set(20, 20);
|
|
750
750
|
|
|
751
751
|
expect(rbTree.delete(10)).toHaveLength(1); // Delete root node
|
|
752
752
|
expect(rbTree.root?.key).toBe(20); // New root should be 20
|
|
753
753
|
});
|
|
754
754
|
|
|
755
755
|
it('should handle complex case with multiple rotations', () => {
|
|
756
|
-
rbTree.
|
|
757
|
-
rbTree.
|
|
758
|
-
rbTree.
|
|
759
|
-
rbTree.
|
|
760
|
-
rbTree.
|
|
761
|
-
rbTree.
|
|
756
|
+
rbTree.set(10, 10);
|
|
757
|
+
rbTree.set(5, 5);
|
|
758
|
+
rbTree.set(15, 15);
|
|
759
|
+
rbTree.set(12, 12);
|
|
760
|
+
rbTree.set(18, 18);
|
|
761
|
+
rbTree.set(16, 16);
|
|
762
762
|
|
|
763
763
|
// Delete a node that will cause rotations and color changes
|
|
764
764
|
expect(rbTree.delete(5)).toHaveLength(1);
|
|
@@ -773,15 +773,15 @@ describe('RedBlackTree - _deleteFixup', () => {
|
|
|
773
773
|
const rbTree = new RedBlackTree<number, number>();
|
|
774
774
|
|
|
775
775
|
// Build a rbTree that will require complex fixup
|
|
776
|
-
rbTree.
|
|
777
|
-
rbTree.
|
|
778
|
-
rbTree.
|
|
779
|
-
rbTree.
|
|
780
|
-
rbTree.
|
|
781
|
-
rbTree.
|
|
782
|
-
rbTree.
|
|
783
|
-
rbTree.
|
|
784
|
-
rbTree.
|
|
776
|
+
rbTree.set(20, 20);
|
|
777
|
+
rbTree.set(10, 10);
|
|
778
|
+
rbTree.set(30, 30);
|
|
779
|
+
rbTree.set(5, 5);
|
|
780
|
+
rbTree.set(15, 15);
|
|
781
|
+
rbTree.set(25, 25);
|
|
782
|
+
rbTree.set(35, 35);
|
|
783
|
+
rbTree.set(2, 2);
|
|
784
|
+
rbTree.set(8, 8);
|
|
785
785
|
|
|
786
786
|
// This deletion should trigger a complex fixup
|
|
787
787
|
rbTree.delete(2);
|