data-structure-typed 1.41.6 → 1.41.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +11 -11
  3. package/benchmark/report.html +11 -11
  4. package/benchmark/report.json +111 -111
  5. package/dist/cjs/src/data-structures/graph/abstract-graph.js +5 -5
  6. package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
  7. package/dist/mjs/src/data-structures/graph/abstract-graph.js +5 -5
  8. package/dist/umd/data-structure-typed.min.js +1 -1
  9. package/dist/umd/data-structure-typed.min.js.map +1 -1
  10. package/package.json +5 -5
  11. package/src/data-structures/graph/abstract-graph.ts +6 -6
  12. package/test/config.ts +1 -0
  13. package/test/integration/avl-tree.test.ts +110 -0
  14. package/test/integration/bst.test.ts +385 -0
  15. package/test/integration/heap.test.js +16 -0
  16. package/test/integration/index.html +51 -0
  17. package/test/performance/data-structures/binary-tree/avl-tree.test.ts +36 -0
  18. package/test/performance/data-structures/binary-tree/binary-index-tree.test.ts +0 -0
  19. package/test/performance/data-structures/binary-tree/binary-tree.test.ts +45 -0
  20. package/test/performance/data-structures/binary-tree/bst.test.ts +36 -0
  21. package/test/performance/data-structures/binary-tree/overall.test.ts +0 -0
  22. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +0 -0
  23. package/test/performance/data-structures/binary-tree/segment-tree.test.ts +0 -0
  24. package/test/performance/data-structures/binary-tree/tree-multiset.test.ts +0 -0
  25. package/test/performance/data-structures/graph/abstract-graph.test.ts +0 -0
  26. package/test/performance/data-structures/graph/directed-graph.test.ts +49 -0
  27. package/test/performance/data-structures/graph/map-graph.test.ts +0 -0
  28. package/test/performance/data-structures/graph/overall.test.ts +0 -0
  29. package/test/performance/data-structures/graph/undirected-graph.test.ts +0 -0
  30. package/test/performance/data-structures/hash/coordinate-map.test.ts +0 -0
  31. package/test/performance/data-structures/hash/coordinate-set.test.ts +0 -0
  32. package/test/performance/data-structures/hash/hash-map.test.ts +0 -0
  33. package/test/performance/data-structures/hash/hash-table.test.ts +0 -0
  34. package/test/performance/data-structures/heap/heap.test.ts +30 -0
  35. package/test/performance/data-structures/heap/max-heap.test.ts +0 -0
  36. package/test/performance/data-structures/heap/min-heap.test.ts +0 -0
  37. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +40 -0
  38. package/test/performance/data-structures/linked-list/linked-list.test.ts +0 -0
  39. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +34 -0
  40. package/test/performance/data-structures/linked-list/skip-linked-list.test.ts +0 -0
  41. package/test/performance/data-structures/linked-list/skip-list.test.ts +0 -0
  42. package/test/performance/data-structures/matrix/matrix.test.ts +0 -0
  43. package/test/performance/data-structures/matrix/matrix2d.test.ts +0 -0
  44. package/test/performance/data-structures/matrix/navigator.test.ts +0 -0
  45. package/test/performance/data-structures/matrix/vector2d.test.ts +0 -0
  46. package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +19 -0
  47. package/test/performance/data-structures/priority-queue/min-priority-queue.test.ts +0 -0
  48. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +0 -0
  49. package/test/performance/data-structures/queue/deque.test.ts +21 -0
  50. package/test/performance/data-structures/queue/queue.test.ts +25 -0
  51. package/test/performance/data-structures/stack/stack.test.ts +0 -0
  52. package/test/performance/data-structures/tree/tree.test.ts +0 -0
  53. package/test/performance/data-structures/trie/trie.test.ts +22 -0
  54. package/test/performance/reportor.ts +186 -0
  55. package/test/performance/types/index.ts +1 -0
  56. package/test/performance/types/reportor.ts +3 -0
  57. package/test/types/index.ts +1 -0
  58. package/test/types/utils/big-o.ts +1 -0
  59. package/test/types/utils/index.ts +2 -0
  60. package/test/types/utils/json2html.ts +1 -0
  61. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +269 -0
  62. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +320 -0
  63. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +486 -0
  64. package/test/unit/data-structures/binary-tree/bst.test.ts +840 -0
  65. package/test/unit/data-structures/binary-tree/overall.test.ts +66 -0
  66. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +435 -0
  67. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +50 -0
  68. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +542 -0
  69. package/test/unit/data-structures/graph/abstract-graph.test.ts +100 -0
  70. package/test/unit/data-structures/graph/directed-graph.test.ts +564 -0
  71. package/test/unit/data-structures/graph/map-graph.test.ts +126 -0
  72. package/test/unit/data-structures/graph/overall.test.ts +49 -0
  73. package/test/unit/data-structures/graph/salty-edges.json +1 -0
  74. package/test/unit/data-structures/graph/salty-vertexes.json +1 -0
  75. package/test/unit/data-structures/graph/undirected-graph.test.ts +168 -0
  76. package/test/unit/data-structures/hash/coordinate-map.test.ts +74 -0
  77. package/test/unit/data-structures/hash/coordinate-set.test.ts +66 -0
  78. package/test/unit/data-structures/hash/hash-map.test.ts +103 -0
  79. package/test/unit/data-structures/hash/hash-table.test.ts +186 -0
  80. package/test/unit/data-structures/heap/heap.test.ts +254 -0
  81. package/test/unit/data-structures/heap/max-heap.test.ts +52 -0
  82. package/test/unit/data-structures/heap/min-heap.test.ts +52 -0
  83. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +400 -0
  84. package/test/unit/data-structures/linked-list/linked-list.test.ts +8 -0
  85. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +474 -0
  86. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +13 -0
  87. package/test/unit/data-structures/linked-list/skip-list.test.ts +86 -0
  88. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  89. package/test/unit/data-structures/matrix/matrix2d.test.ts +345 -0
  90. package/test/unit/data-structures/matrix/navigator.test.ts +244 -0
  91. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  92. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +73 -0
  93. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +63 -0
  94. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +53 -0
  95. package/test/unit/data-structures/queue/deque.test.ts +410 -0
  96. package/test/unit/data-structures/queue/queue.test.ts +207 -0
  97. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  98. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  99. package/test/unit/data-structures/trie/trie.test.ts +825 -0
  100. package/test/utils/array.ts +5514 -0
  101. package/test/utils/big-o.ts +207 -0
  102. package/test/utils/console.ts +31 -0
  103. package/test/utils/index.ts +7 -0
  104. package/test/utils/is.ts +56 -0
  105. package/test/utils/json2html.ts +322 -0
  106. package/test/utils/number.ts +13 -0
  107. package/test/utils/string.ts +1 -0
@@ -0,0 +1,840 @@
1
+ import {BST, BSTNode, CP, IterationType} from '../../../../src';
2
+ import {isDebugTest} from '../../../config';
3
+
4
+ const isDebug = isDebugTest;
5
+
6
+ describe('BST operations test', () => {
7
+ it('should perform various operations on a Binary Search Tree with numeric values', () => {
8
+ const bst = new BST();
9
+ expect(bst).toBeInstanceOf(BST);
10
+ bst.add(11, 11);
11
+ bst.add(3, 3);
12
+ const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
13
+ bst.addMany(idsAndValues, idsAndValues, false);
14
+ expect(bst.root).toBeInstanceOf(BSTNode);
15
+
16
+ if (bst.root) expect(bst.root.key).toBe(11);
17
+
18
+ expect(bst.size).toBe(16);
19
+
20
+ expect(bst.has(6)).toBe(true);
21
+
22
+ const node6 = bst.getNode(6);
23
+ expect(node6 && bst.getHeight(6)).toBe(2);
24
+ expect(node6 && bst.getDepth(6)).toBe(3);
25
+
26
+ const nodeId10 = bst.getNode(10);
27
+ expect(nodeId10?.key).toBe(10);
28
+
29
+ const nodeVal9 = bst.getNode(9, node => node.value);
30
+ expect(nodeVal9?.key).toBe(9);
31
+
32
+ const leftMost = bst.getLeftMost();
33
+ expect(leftMost?.key).toBe(1);
34
+
35
+ const node15 = bst.getNode(15);
36
+ const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
37
+ expect(minNodeBySpecificNode?.key).toBe(12);
38
+
39
+ let subTreeSum = 0;
40
+ node15 && bst.subTreeTraverse(node => (subTreeSum += node.key), 15);
41
+ expect(subTreeSum).toBe(70);
42
+
43
+ let lesserSum = 0;
44
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
45
+ expect(lesserSum).toBe(45);
46
+
47
+ expect(node15).toBeInstanceOf(BSTNode);
48
+
49
+ const node11 = bst.getNode(11);
50
+ expect(node11).toBeInstanceOf(BSTNode);
51
+
52
+ const dfsInorderNodes = bst.dfs(node => node, 'in');
53
+ expect(dfsInorderNodes[0].key).toBe(1);
54
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
55
+
56
+ bst.perfectlyBalance();
57
+ expect(bst.isPerfectlyBalanced()).toBe(true);
58
+
59
+ const bfsNodesAfterBalanced: BSTNode<number>[] = [];
60
+ bst.bfs(node => bfsNodesAfterBalanced.push(node));
61
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
62
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
63
+
64
+ const removed11 = bst.delete(11);
65
+ expect(removed11).toBeInstanceOf(Array);
66
+ expect(removed11[0]).toBeDefined();
67
+ expect(removed11[0].deleted).toBeDefined();
68
+
69
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
70
+
71
+ expect(bst.isAVLBalanced()).toBe(true);
72
+
73
+ expect(bst.getHeight(15)).toBe(1);
74
+
75
+ const removed1 = bst.delete(1);
76
+ expect(removed1).toBeInstanceOf(Array);
77
+ expect(removed1[0]).toBeDefined();
78
+ expect(removed1[0].deleted).toBeDefined();
79
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
80
+
81
+ expect(bst.isAVLBalanced()).toBe(true);
82
+
83
+ expect(bst.getHeight()).toBe(4);
84
+
85
+ const removed4 = bst.delete(4);
86
+ expect(removed4).toBeInstanceOf(Array);
87
+ expect(removed4[0]).toBeDefined();
88
+ expect(removed4[0].deleted).toBeDefined();
89
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
90
+ expect(bst.isAVLBalanced()).toBe(true);
91
+ expect(bst.getHeight()).toBe(4);
92
+
93
+ const removed10 = bst.delete(10);
94
+ expect(removed10).toBeInstanceOf(Array);
95
+ expect(removed10[0]).toBeDefined();
96
+ expect(removed10[0].deleted).toBeDefined();
97
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
98
+ expect(bst.isAVLBalanced()).toBe(false);
99
+ expect(bst.getHeight()).toBe(4);
100
+
101
+ const removed15 = bst.delete(15);
102
+ expect(removed15).toBeInstanceOf(Array);
103
+ expect(removed15[0]).toBeDefined();
104
+ expect(removed15[0].deleted).toBeDefined();
105
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
106
+
107
+ expect(bst.isAVLBalanced()).toBe(true);
108
+ expect(bst.getHeight()).toBe(3);
109
+
110
+ const removed5 = bst.delete(5);
111
+ expect(removed5).toBeInstanceOf(Array);
112
+ expect(removed5[0]).toBeDefined();
113
+ expect(removed5[0].deleted).toBeDefined();
114
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
115
+
116
+ expect(bst.isAVLBalanced()).toBe(true);
117
+ expect(bst.getHeight()).toBe(3);
118
+
119
+ const removed13 = bst.delete(13);
120
+ expect(removed13).toBeInstanceOf(Array);
121
+ expect(removed13[0]).toBeDefined();
122
+ expect(removed13[0].deleted).toBeDefined();
123
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
124
+ expect(bst.isAVLBalanced()).toBe(true);
125
+ expect(bst.getHeight()).toBe(3);
126
+
127
+ const removed3 = bst.delete(3);
128
+ expect(removed3).toBeInstanceOf(Array);
129
+ expect(removed3[0]).toBeDefined();
130
+ expect(removed3[0].deleted).toBeDefined();
131
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
132
+ expect(bst.isAVLBalanced()).toBe(false);
133
+ expect(bst.getHeight()).toBe(3);
134
+
135
+ const removed8 = bst.delete(8);
136
+ expect(removed8).toBeInstanceOf(Array);
137
+ expect(removed8[0]).toBeDefined();
138
+ expect(removed8[0].deleted).toBeDefined();
139
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
140
+ expect(bst.isAVLBalanced()).toBe(true);
141
+ expect(bst.getHeight()).toBe(3);
142
+
143
+ const removed6 = bst.delete(6);
144
+ expect(removed6).toBeInstanceOf(Array);
145
+ expect(removed6[0]).toBeDefined();
146
+ expect(removed6[0].deleted).toBeDefined();
147
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
148
+ expect(bst.delete(6).length).toBe(0);
149
+ expect(bst.isAVLBalanced()).toBe(false);
150
+ expect(bst.getHeight()).toBe(3);
151
+
152
+ const removed7 = bst.delete(7);
153
+ expect(removed7).toBeInstanceOf(Array);
154
+ expect(removed7[0]).toBeDefined();
155
+ expect(removed7[0].deleted).toBeDefined();
156
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
157
+ expect(bst.isAVLBalanced()).toBe(false);
158
+ expect(bst.getHeight()).toBe(3);
159
+
160
+ const removed9 = bst.delete(9);
161
+ expect(removed9).toBeInstanceOf(Array);
162
+ expect(removed9[0]).toBeDefined();
163
+ expect(removed9[0].deleted).toBeDefined();
164
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
165
+ expect(bst.isAVLBalanced()).toBe(false);
166
+ expect(bst.getHeight()).toBe(3);
167
+
168
+ const removed14 = bst.delete(14);
169
+ expect(removed14).toBeInstanceOf(Array);
170
+ expect(removed14[0]).toBeDefined();
171
+ expect(removed14[0].deleted).toBeDefined();
172
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
173
+ expect(bst.isAVLBalanced()).toBe(false);
174
+ expect(bst.getHeight()).toBe(2);
175
+
176
+ expect(bst.isAVLBalanced()).toBe(false);
177
+
178
+ const bfsIDs: number[] = [];
179
+ bst.bfs(node => bfsIDs.push(node.key));
180
+ expect(bfsIDs[0]).toBe(2);
181
+ expect(bfsIDs[1]).toBe(12);
182
+ expect(bfsIDs[2]).toBe(16);
183
+
184
+ const bfsNodes: BSTNode<number>[] = [];
185
+ bst.bfs(node => bfsNodes.push(node));
186
+ expect(bfsNodes[0].key).toBe(2);
187
+ expect(bfsNodes[1].key).toBe(12);
188
+ expect(bfsNodes[2].key).toBe(16);
189
+ });
190
+
191
+ it('should perform various operations on a Binary Search Tree with object values', () => {
192
+ const objBST = new BST<{key: number; keyA: number}>();
193
+ expect(objBST).toBeInstanceOf(BST);
194
+ objBST.add(11, {key: 11, keyA: 11});
195
+ objBST.add(3, {key: 3, keyA: 3});
196
+ const values = [
197
+ {key: 15, keyA: 15},
198
+ {key: 1, keyA: 1},
199
+ {key: 8, keyA: 8},
200
+ {key: 13, keyA: 13},
201
+ {key: 16, keyA: 16},
202
+ {key: 2, keyA: 2},
203
+ {key: 6, keyA: 6},
204
+ {key: 9, keyA: 9},
205
+ {key: 12, keyA: 12},
206
+ {key: 14, keyA: 14},
207
+ {key: 4, keyA: 4},
208
+ {key: 7, keyA: 7},
209
+ {key: 10, keyA: 10},
210
+ {key: 5, keyA: 5}
211
+ ];
212
+
213
+ objBST.addMany(
214
+ values.map(item => item.key),
215
+ values,
216
+ false
217
+ );
218
+
219
+ expect(objBST.root).toBeInstanceOf(BSTNode);
220
+
221
+ if (objBST.root) expect(objBST.root.key).toBe(11);
222
+
223
+ expect(objBST.has(6)).toBe(true);
224
+
225
+ const node6 = objBST.getNode(6);
226
+ expect(node6 && objBST.getHeight(node6)).toBe(2);
227
+ expect(node6 && objBST.getDepth(node6)).toBe(3);
228
+
229
+ const nodeId10 = objBST.getNode(10);
230
+ expect(nodeId10?.key).toBe(10);
231
+
232
+ const nodeVal9 = objBST.getNode(9);
233
+ expect(nodeVal9?.key).toBe(9);
234
+
235
+ const leftMost = objBST.getLeftMost();
236
+ expect(leftMost?.key).toBe(1);
237
+
238
+ const node15 = objBST.getNode(15);
239
+ expect(node15?.value).toEqual({key: 15, keyA: 15});
240
+ const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
241
+ expect(minNodeBySpecificNode?.key).toBe(12);
242
+
243
+ let subTreeSum = 0;
244
+ node15 && objBST.subTreeTraverse(node => (subTreeSum += node.key), node15);
245
+ expect(subTreeSum).toBe(70);
246
+
247
+ let lesserSum = 0;
248
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
249
+ expect(lesserSum).toBe(45);
250
+
251
+ expect(node15).toBeInstanceOf(BSTNode);
252
+
253
+ const node11 = objBST.getNode(11);
254
+ expect(node11).toBeInstanceOf(BSTNode);
255
+
256
+ const dfsInorderNodes = objBST.dfs(node => node, 'in');
257
+ expect(dfsInorderNodes[0].key).toBe(1);
258
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
259
+
260
+ objBST.perfectlyBalance();
261
+ expect(objBST.isPerfectlyBalanced()).toBe(true);
262
+
263
+ const bfsNodesAfterBalanced: BSTNode<{key: number; keyA: number}>[] = [];
264
+ objBST.bfs(node => bfsNodesAfterBalanced.push(node));
265
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
266
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
267
+
268
+ const removed11 = objBST.delete(11);
269
+ expect(removed11).toBeInstanceOf(Array);
270
+ expect(removed11[0]).toBeDefined();
271
+ expect(removed11[0].deleted).toBeDefined();
272
+
273
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
274
+
275
+ expect(objBST.isAVLBalanced()).toBe(true);
276
+
277
+ expect(node15 && objBST.getHeight(node15)).toBe(2);
278
+
279
+ const removed1 = objBST.delete(1);
280
+ expect(removed1).toBeInstanceOf(Array);
281
+ expect(removed1[0]).toBeDefined();
282
+ expect(removed1[0].deleted).toBeDefined();
283
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
284
+
285
+ expect(objBST.isAVLBalanced()).toBe(true);
286
+
287
+ expect(objBST.getHeight()).toBe(4);
288
+
289
+ const removed4 = objBST.delete(4);
290
+ expect(removed4).toBeInstanceOf(Array);
291
+ expect(removed4[0]).toBeDefined();
292
+ expect(removed4[0].deleted).toBeDefined();
293
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
294
+ expect(objBST.isAVLBalanced()).toBe(true);
295
+ expect(objBST.getHeight()).toBe(4);
296
+
297
+ const removed10 = objBST.delete(10);
298
+ expect(removed10).toBeInstanceOf(Array);
299
+ expect(removed10[0]).toBeDefined();
300
+ expect(removed10[0].deleted).toBeDefined();
301
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
302
+ expect(objBST.isAVLBalanced()).toBe(false);
303
+ expect(objBST.getHeight()).toBe(4);
304
+
305
+ const removed15 = objBST.delete(15);
306
+ expect(removed15).toBeInstanceOf(Array);
307
+ expect(removed15[0]).toBeDefined();
308
+ expect(removed15[0].deleted).toBeDefined();
309
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
310
+
311
+ expect(objBST.isAVLBalanced()).toBe(true);
312
+ expect(objBST.getHeight()).toBe(3);
313
+
314
+ const removed5 = objBST.delete(5);
315
+ expect(removed5).toBeInstanceOf(Array);
316
+ expect(removed5[0]).toBeDefined();
317
+ expect(removed5[0].deleted).toBeDefined();
318
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
319
+
320
+ expect(objBST.isAVLBalanced()).toBe(true);
321
+ expect(objBST.getHeight()).toBe(3);
322
+
323
+ const removed13 = objBST.delete(13);
324
+ expect(removed13).toBeInstanceOf(Array);
325
+ expect(removed13[0]).toBeDefined();
326
+ expect(removed13[0].deleted).toBeDefined();
327
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
328
+ expect(objBST.isAVLBalanced()).toBe(true);
329
+ expect(objBST.getHeight()).toBe(3);
330
+
331
+ const removed3 = objBST.delete(3);
332
+ expect(removed3).toBeInstanceOf(Array);
333
+ expect(removed3[0]).toBeDefined();
334
+ expect(removed3[0].deleted).toBeDefined();
335
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
336
+ expect(objBST.isAVLBalanced()).toBe(false);
337
+ expect(objBST.getHeight()).toBe(3);
338
+
339
+ const removed8 = objBST.delete(8);
340
+ expect(removed8).toBeInstanceOf(Array);
341
+ expect(removed8[0]).toBeDefined();
342
+ expect(removed8[0].deleted).toBeDefined();
343
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
344
+ expect(objBST.isAVLBalanced()).toBe(true);
345
+ expect(objBST.getHeight()).toBe(3);
346
+
347
+ const removed6 = objBST.delete(6);
348
+ expect(removed6).toBeInstanceOf(Array);
349
+ expect(removed6[0]).toBeDefined();
350
+ expect(removed6[0].deleted).toBeDefined();
351
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
352
+ expect(objBST.delete(6).length).toBe(0);
353
+ expect(objBST.isAVLBalanced()).toBe(false);
354
+ expect(objBST.getHeight()).toBe(3);
355
+
356
+ const removed7 = objBST.delete(7);
357
+ expect(removed7).toBeInstanceOf(Array);
358
+ expect(removed7[0]).toBeDefined();
359
+ expect(removed7[0].deleted).toBeDefined();
360
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
361
+ expect(objBST.isAVLBalanced()).toBe(false);
362
+ expect(objBST.getHeight()).toBe(3);
363
+
364
+ const removed9 = objBST.delete(9);
365
+ expect(removed9).toBeInstanceOf(Array);
366
+ expect(removed9[0]).toBeDefined();
367
+ expect(removed9[0].deleted).toBeDefined();
368
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
369
+ expect(objBST.isAVLBalanced()).toBe(false);
370
+ expect(objBST.getHeight()).toBe(3);
371
+
372
+ const removed14 = objBST.delete(14);
373
+ expect(removed14).toBeInstanceOf(Array);
374
+ expect(removed14[0]).toBeDefined();
375
+ expect(removed14[0].deleted).toBeDefined();
376
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
377
+ expect(objBST.isAVLBalanced()).toBe(false);
378
+ expect(objBST.getHeight()).toBe(2);
379
+
380
+ expect(objBST.isAVLBalanced()).toBe(false);
381
+
382
+ const bfsIDs: number[] = [];
383
+ objBST.bfs(node => bfsIDs.push(node.key));
384
+ expect(bfsIDs[0]).toBe(2);
385
+ expect(bfsIDs[1]).toBe(12);
386
+ expect(bfsIDs[2]).toBe(16);
387
+
388
+ const bfsNodes: BSTNode<{key: number; keyA: number}>[] = [];
389
+ objBST.bfs(node => bfsNodes.push(node));
390
+ expect(bfsNodes[0].key).toBe(2);
391
+ expect(bfsNodes[1].key).toBe(12);
392
+ expect(bfsNodes[2].key).toBe(16);
393
+ });
394
+ });
395
+
396
+ describe('BST operations test recursively', () => {
397
+ it('should perform various operations on a Binary Search Tree with numeric values', () => {
398
+ const bst = new BST({iterationType: IterationType.RECURSIVE});
399
+ expect(bst).toBeInstanceOf(BST);
400
+ bst.add(11, 11);
401
+ bst.add(3, 3);
402
+ const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
403
+ bst.addMany(idsAndValues, idsAndValues, false);
404
+ expect(bst.root).toBeInstanceOf(BSTNode);
405
+
406
+ if (bst.root) expect(bst.root.key).toBe(11);
407
+
408
+ expect(bst.size).toBe(16);
409
+
410
+ expect(bst.has(6)).toBe(true);
411
+
412
+ const node6 = bst.getNode(6);
413
+ expect(node6 && bst.getHeight(6)).toBe(2);
414
+ expect(node6 && bst.getDepth(6)).toBe(3);
415
+
416
+ const nodeId10 = bst.getNode(10);
417
+ expect(bst.get(10)).toBe(10);
418
+ expect(nodeId10?.key).toBe(10);
419
+
420
+ const nodeVal9 = bst.getNode(9, node => node.value);
421
+ expect(nodeVal9?.key).toBe(9);
422
+
423
+ const leftMost = bst.getLeftMost();
424
+ expect(leftMost?.key).toBe(1);
425
+
426
+ const node15 = bst.getNode(15);
427
+ const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
428
+ expect(minNodeBySpecificNode?.key).toBe(12);
429
+
430
+ let subTreeSum = 0;
431
+ node15 && bst.subTreeTraverse(node => (subTreeSum += node.key), 15);
432
+ expect(subTreeSum).toBe(70);
433
+
434
+ let lesserSum = 0;
435
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
436
+ expect(lesserSum).toBe(45);
437
+
438
+ expect(node15).toBeInstanceOf(BSTNode);
439
+
440
+ const node11 = bst.getNode(11);
441
+ expect(node11).toBeInstanceOf(BSTNode);
442
+
443
+ const dfsInorderNodes = bst.dfs(node => node, 'in');
444
+ expect(dfsInorderNodes[0].key).toBe(1);
445
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
446
+
447
+ bst.perfectlyBalance();
448
+ expect(bst.isPerfectlyBalanced()).toBe(true);
449
+
450
+ const bfsNodesAfterBalanced: BSTNode<number>[] = [];
451
+ bst.bfs(node => bfsNodesAfterBalanced.push(node));
452
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
453
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
454
+
455
+ const removed11 = bst.delete(11);
456
+ expect(removed11).toBeInstanceOf(Array);
457
+ expect(removed11[0]).toBeDefined();
458
+ expect(removed11[0].deleted).toBeDefined();
459
+
460
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
461
+
462
+ expect(bst.isAVLBalanced()).toBe(true);
463
+
464
+ expect(bst.getHeight(15)).toBe(1);
465
+
466
+ const removed1 = bst.delete(1);
467
+ expect(removed1).toBeInstanceOf(Array);
468
+ expect(removed1[0]).toBeDefined();
469
+ expect(removed1[0].deleted).toBeDefined();
470
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
471
+
472
+ expect(bst.isAVLBalanced()).toBe(true);
473
+
474
+ expect(bst.getHeight()).toBe(4);
475
+
476
+ const removed4 = bst.delete(4);
477
+ expect(removed4).toBeInstanceOf(Array);
478
+ expect(removed4[0]).toBeDefined();
479
+ expect(removed4[0].deleted).toBeDefined();
480
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
481
+ expect(bst.isAVLBalanced()).toBe(true);
482
+ expect(bst.getHeight()).toBe(4);
483
+
484
+ const removed10 = bst.delete(10);
485
+ expect(removed10).toBeInstanceOf(Array);
486
+ expect(removed10[0]).toBeDefined();
487
+ expect(removed10[0].deleted).toBeDefined();
488
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
489
+ expect(bst.isAVLBalanced()).toBe(false);
490
+ expect(bst.getHeight()).toBe(4);
491
+
492
+ const removed15 = bst.delete(15);
493
+ expect(removed15).toBeInstanceOf(Array);
494
+ expect(removed15[0]).toBeDefined();
495
+ expect(removed15[0].deleted).toBeDefined();
496
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
497
+
498
+ expect(bst.isAVLBalanced()).toBe(true);
499
+ expect(bst.getHeight()).toBe(3);
500
+
501
+ const removed5 = bst.delete(5);
502
+ expect(removed5).toBeInstanceOf(Array);
503
+ expect(removed5[0]).toBeDefined();
504
+ expect(removed5[0].deleted).toBeDefined();
505
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
506
+
507
+ expect(bst.isAVLBalanced()).toBe(true);
508
+ expect(bst.getHeight()).toBe(3);
509
+
510
+ const removed13 = bst.delete(13);
511
+ expect(removed13).toBeInstanceOf(Array);
512
+ expect(removed13[0]).toBeDefined();
513
+ expect(removed13[0].deleted).toBeDefined();
514
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
515
+ expect(bst.isAVLBalanced()).toBe(true);
516
+ expect(bst.getHeight()).toBe(3);
517
+
518
+ const removed3 = bst.delete(3);
519
+ expect(removed3).toBeInstanceOf(Array);
520
+ expect(removed3[0]).toBeDefined();
521
+ expect(removed3[0].deleted).toBeDefined();
522
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
523
+ expect(bst.isAVLBalanced()).toBe(false);
524
+ expect(bst.getHeight()).toBe(3);
525
+
526
+ const removed8 = bst.delete(8);
527
+ expect(removed8).toBeInstanceOf(Array);
528
+ expect(removed8[0]).toBeDefined();
529
+ expect(removed8[0].deleted).toBeDefined();
530
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
531
+ expect(bst.isAVLBalanced()).toBe(true);
532
+ expect(bst.getHeight()).toBe(3);
533
+
534
+ const removed6 = bst.delete(6);
535
+ expect(removed6).toBeInstanceOf(Array);
536
+ expect(removed6[0]).toBeDefined();
537
+ expect(removed6[0].deleted).toBeDefined();
538
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
539
+ expect(bst.delete(6).length).toBe(0);
540
+ expect(bst.isAVLBalanced()).toBe(false);
541
+ expect(bst.getHeight()).toBe(3);
542
+
543
+ const removed7 = bst.delete(7);
544
+ expect(removed7).toBeInstanceOf(Array);
545
+ expect(removed7[0]).toBeDefined();
546
+ expect(removed7[0].deleted).toBeDefined();
547
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
548
+ expect(bst.isAVLBalanced()).toBe(false);
549
+ expect(bst.getHeight()).toBe(3);
550
+
551
+ const removed9 = bst.delete(9);
552
+ expect(removed9).toBeInstanceOf(Array);
553
+ expect(removed9[0]).toBeDefined();
554
+ expect(removed9[0].deleted).toBeDefined();
555
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
556
+ expect(bst.isAVLBalanced()).toBe(false);
557
+ expect(bst.getHeight()).toBe(3);
558
+
559
+ const removed14 = bst.delete(14);
560
+ expect(removed14).toBeInstanceOf(Array);
561
+ expect(removed14[0]).toBeDefined();
562
+ expect(removed14[0].deleted).toBeDefined();
563
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
564
+ expect(bst.isAVLBalanced()).toBe(false);
565
+ expect(bst.getHeight()).toBe(2);
566
+
567
+ expect(bst.isAVLBalanced()).toBe(false);
568
+
569
+ const bfsIDs: number[] = [];
570
+ bst.bfs(node => bfsIDs.push(node.key));
571
+ expect(bfsIDs[0]).toBe(2);
572
+ expect(bfsIDs[1]).toBe(12);
573
+ expect(bfsIDs[2]).toBe(16);
574
+
575
+ const bfsNodes: BSTNode<number>[] = [];
576
+ bst.bfs(node => bfsNodes.push(node));
577
+ expect(bfsNodes[0].key).toBe(2);
578
+ expect(bfsNodes[1].key).toBe(12);
579
+ expect(bfsNodes[2].key).toBe(16);
580
+ });
581
+
582
+ it('should perform various operations on a Binary Search Tree with object values', () => {
583
+ const objBST = new BST<{key: number; keyA: number}>();
584
+ expect(objBST).toBeInstanceOf(BST);
585
+ objBST.add(11, {key: 11, keyA: 11});
586
+ objBST.add(3, {key: 3, keyA: 3});
587
+ const values = [
588
+ {key: 15, keyA: 15},
589
+ {key: 1, keyA: 1},
590
+ {key: 8, keyA: 8},
591
+ {key: 13, keyA: 13},
592
+ {key: 16, keyA: 16},
593
+ {key: 2, keyA: 2},
594
+ {key: 6, keyA: 6},
595
+ {key: 9, keyA: 9},
596
+ {key: 12, keyA: 12},
597
+ {key: 14, keyA: 14},
598
+ {key: 4, keyA: 4},
599
+ {key: 7, keyA: 7},
600
+ {key: 10, keyA: 10},
601
+ {key: 5, keyA: 5}
602
+ ];
603
+
604
+ objBST.addMany(
605
+ values.map(item => item.key),
606
+ values,
607
+ false
608
+ );
609
+
610
+ expect(objBST.root).toBeInstanceOf(BSTNode);
611
+
612
+ if (objBST.root) expect(objBST.root.key).toBe(11);
613
+
614
+ expect(objBST.has(6)).toBe(true);
615
+
616
+ const node6 = objBST.getNode(6);
617
+ expect(objBST.get(6)).toEqual({key: 6, keyA: 6});
618
+ expect(node6 && objBST.getHeight(node6)).toBe(2);
619
+ expect(node6 && objBST.getDepth(node6)).toBe(3);
620
+
621
+ const nodeId10 = objBST.getNode(10);
622
+ expect(nodeId10?.key).toBe(10);
623
+
624
+ const nodeVal9 = objBST.getNode(9);
625
+ expect(nodeVal9?.key).toBe(9);
626
+
627
+ const leftMost = objBST.getLeftMost();
628
+ expect(leftMost?.key).toBe(1);
629
+
630
+ const node15 = objBST.getNode(15);
631
+ expect(node15?.value).toEqual({key: 15, keyA: 15});
632
+ const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
633
+ expect(minNodeBySpecificNode?.key).toBe(12);
634
+
635
+ let subTreeSum = 0;
636
+ node15 && objBST.subTreeTraverse(node => (subTreeSum += node.key), node15);
637
+ expect(subTreeSum).toBe(70);
638
+
639
+ let lesserSum = 0;
640
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10);
641
+ expect(lesserSum).toBe(45);
642
+
643
+ expect(node15).toBeInstanceOf(BSTNode);
644
+
645
+ const node11 = objBST.getNode(11);
646
+ expect(node11).toBeInstanceOf(BSTNode);
647
+
648
+ const dfsInorderNodes = objBST.dfs(node => node, 'in');
649
+ expect(dfsInorderNodes[0].key).toBe(1);
650
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
651
+
652
+ objBST.perfectlyBalance();
653
+ expect(objBST.isPerfectlyBalanced()).toBe(true);
654
+
655
+ const bfsNodesAfterBalanced: BSTNode<{key: number; keyA: number}>[] = [];
656
+ objBST.bfs(node => bfsNodesAfterBalanced.push(node));
657
+ expect(bfsNodesAfterBalanced[0].key).toBe(8);
658
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
659
+
660
+ const removed11 = objBST.delete(11);
661
+ expect(removed11).toBeInstanceOf(Array);
662
+ expect(removed11[0]).toBeDefined();
663
+ expect(removed11[0].deleted).toBeDefined();
664
+
665
+ if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
666
+
667
+ expect(objBST.isAVLBalanced()).toBe(true);
668
+
669
+ expect(node15 && objBST.getHeight(node15)).toBe(2);
670
+
671
+ const removed1 = objBST.delete(1);
672
+ expect(removed1).toBeInstanceOf(Array);
673
+ expect(removed1[0]).toBeDefined();
674
+ expect(removed1[0].deleted).toBeDefined();
675
+ if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
676
+
677
+ expect(objBST.isAVLBalanced()).toBe(true);
678
+
679
+ expect(objBST.getHeight()).toBe(4);
680
+
681
+ const removed4 = objBST.delete(4);
682
+ expect(removed4).toBeInstanceOf(Array);
683
+ expect(removed4[0]).toBeDefined();
684
+ expect(removed4[0].deleted).toBeDefined();
685
+ if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
686
+ expect(objBST.isAVLBalanced()).toBe(true);
687
+ expect(objBST.getHeight()).toBe(4);
688
+
689
+ const removed10 = objBST.delete(10);
690
+ expect(removed10).toBeInstanceOf(Array);
691
+ expect(removed10[0]).toBeDefined();
692
+ expect(removed10[0].deleted).toBeDefined();
693
+ if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
694
+ expect(objBST.isAVLBalanced()).toBe(false);
695
+ expect(objBST.getHeight()).toBe(4);
696
+
697
+ const removed15 = objBST.delete(15);
698
+ expect(removed15).toBeInstanceOf(Array);
699
+ expect(removed15[0]).toBeDefined();
700
+ expect(removed15[0].deleted).toBeDefined();
701
+ if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
702
+
703
+ expect(objBST.isAVLBalanced()).toBe(true);
704
+ expect(objBST.getHeight()).toBe(3);
705
+
706
+ const removed5 = objBST.delete(5);
707
+ expect(removed5).toBeInstanceOf(Array);
708
+ expect(removed5[0]).toBeDefined();
709
+ expect(removed5[0].deleted).toBeDefined();
710
+ if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
711
+
712
+ expect(objBST.isAVLBalanced()).toBe(true);
713
+ expect(objBST.getHeight()).toBe(3);
714
+
715
+ const removed13 = objBST.delete(13);
716
+ expect(removed13).toBeInstanceOf(Array);
717
+ expect(removed13[0]).toBeDefined();
718
+ expect(removed13[0].deleted).toBeDefined();
719
+ if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
720
+ expect(objBST.isAVLBalanced()).toBe(true);
721
+ expect(objBST.getHeight()).toBe(3);
722
+
723
+ const removed3 = objBST.delete(3);
724
+ expect(removed3).toBeInstanceOf(Array);
725
+ expect(removed3[0]).toBeDefined();
726
+ expect(removed3[0].deleted).toBeDefined();
727
+ if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
728
+ expect(objBST.isAVLBalanced()).toBe(false);
729
+ expect(objBST.getHeight()).toBe(3);
730
+
731
+ const removed8 = objBST.delete(8);
732
+ expect(removed8).toBeInstanceOf(Array);
733
+ expect(removed8[0]).toBeDefined();
734
+ expect(removed8[0].deleted).toBeDefined();
735
+ if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
736
+ expect(objBST.isAVLBalanced()).toBe(true);
737
+ expect(objBST.getHeight()).toBe(3);
738
+
739
+ const removed6 = objBST.delete(6);
740
+ expect(removed6).toBeInstanceOf(Array);
741
+ expect(removed6[0]).toBeDefined();
742
+ expect(removed6[0].deleted).toBeDefined();
743
+ if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
744
+ expect(objBST.delete(6).length).toBe(0);
745
+ expect(objBST.isAVLBalanced()).toBe(false);
746
+ expect(objBST.getHeight()).toBe(3);
747
+
748
+ const removed7 = objBST.delete(7);
749
+ expect(removed7).toBeInstanceOf(Array);
750
+ expect(removed7[0]).toBeDefined();
751
+ expect(removed7[0].deleted).toBeDefined();
752
+ if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
753
+ expect(objBST.isAVLBalanced()).toBe(false);
754
+ expect(objBST.getHeight()).toBe(3);
755
+
756
+ const removed9 = objBST.delete(9);
757
+ expect(removed9).toBeInstanceOf(Array);
758
+ expect(removed9[0]).toBeDefined();
759
+ expect(removed9[0].deleted).toBeDefined();
760
+ if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
761
+ expect(objBST.isAVLBalanced()).toBe(false);
762
+ expect(objBST.getHeight()).toBe(3);
763
+
764
+ const removed14 = objBST.delete(14);
765
+ expect(removed14).toBeInstanceOf(Array);
766
+ expect(removed14[0]).toBeDefined();
767
+ expect(removed14[0].deleted).toBeDefined();
768
+ if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
769
+ expect(objBST.isAVLBalanced()).toBe(false);
770
+ expect(objBST.getHeight()).toBe(2);
771
+
772
+ expect(objBST.isAVLBalanced()).toBe(false);
773
+
774
+ const bfsIDs: number[] = [];
775
+ objBST.bfs(node => bfsIDs.push(node.key));
776
+ expect(bfsIDs[0]).toBe(2);
777
+ expect(bfsIDs[1]).toBe(12);
778
+ expect(bfsIDs[2]).toBe(16);
779
+
780
+ const bfsNodes: BSTNode<{key: number; keyA: number}>[] = [];
781
+ objBST.bfs(node => bfsNodes.push(node));
782
+ expect(bfsNodes[0].key).toBe(2);
783
+ expect(bfsNodes[1].key).toBe(12);
784
+ expect(bfsNodes[2].key).toBe(16);
785
+ });
786
+ });
787
+
788
+ describe('BST Performance test', function () {
789
+ const bst = new BST<BSTNode<number>>();
790
+ const inputSize = 10000; // Adjust input sizes as needed
791
+
792
+ beforeEach(() => {
793
+ bst.clear();
794
+ });
795
+
796
+ it(`Observe the time consumption of BST.dfs be good`, function () {
797
+ const startDFS = performance.now();
798
+ const dfs = bst.dfs(node => node);
799
+ isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
800
+ });
801
+
802
+ it('Should the time consumption of lesserOrGreaterTraverse fitting O(n log n)', function () {
803
+ const nodes: number[] = [];
804
+ for (let i = 0; i < inputSize; i++) {
805
+ nodes.push(i);
806
+ }
807
+ const start = performance.now();
808
+ bst.addMany(nodes);
809
+ isDebug && console.log('---add', performance.now() - start);
810
+ const startL = performance.now();
811
+ bst.lesserOrGreaterTraverse(
812
+ node => {
813
+ node.key - 1;
814
+ },
815
+ CP.lt,
816
+ inputSize / 2
817
+ );
818
+ isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
819
+ });
820
+
821
+ it('Should the time consumption of listLevels fitting well', function () {
822
+ const nodes: number[] = [];
823
+ for (let i = 0; i < inputSize; i++) {
824
+ nodes.push(i);
825
+ }
826
+ const start = performance.now();
827
+ bst.addMany(nodes);
828
+ isDebug && console.log('---add', performance.now() - start);
829
+ const startL = performance.now();
830
+ const arr: number[][] = bst.listLevels(node => node.key);
831
+ isDebug && console.log('---listLevels', arr);
832
+ isDebug && console.log('---listLevels', performance.now() - startL);
833
+ });
834
+
835
+ it('should the lastKey of a BST to be the largest key', function () {
836
+ const bst = new BST();
837
+ bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], undefined, false);
838
+ expect(bst.lastKey()).toBe(9);
839
+ });
840
+ });