data-structure-typed 1.33.9 → 1.33.10

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 (139) hide show
  1. package/package.json +1 -1
  2. package/src/data-structures/binary-tree/aa-tree.ts +1 -0
  3. package/src/data-structures/binary-tree/abstract-binary-tree.ts +1608 -0
  4. package/src/data-structures/binary-tree/avl-tree.ts +307 -0
  5. package/src/data-structures/binary-tree/b-tree.ts +1 -0
  6. package/src/data-structures/binary-tree/binary-indexed-tree.ts +76 -0
  7. package/src/data-structures/binary-tree/binary-tree.ts +47 -0
  8. package/src/data-structures/binary-tree/bst.ts +537 -0
  9. package/src/data-structures/binary-tree/index.ts +12 -0
  10. package/src/data-structures/binary-tree/rb-tree.ts +366 -0
  11. package/src/data-structures/binary-tree/segment-tree.ts +260 -0
  12. package/src/data-structures/binary-tree/splay-tree.ts +1 -0
  13. package/src/data-structures/binary-tree/tree-multiset.ts +700 -0
  14. package/src/data-structures/binary-tree/two-three-tree.ts +1 -0
  15. package/src/data-structures/graph/abstract-graph.ts +1040 -0
  16. package/src/data-structures/graph/directed-graph.ts +470 -0
  17. package/src/data-structures/graph/index.ts +4 -0
  18. package/src/data-structures/graph/map-graph.ts +129 -0
  19. package/src/data-structures/graph/undirected-graph.ts +274 -0
  20. package/src/data-structures/hash/coordinate-map.ts +67 -0
  21. package/src/data-structures/hash/coordinate-set.ts +56 -0
  22. package/src/data-structures/hash/hash-map.ts +203 -0
  23. package/src/data-structures/hash/hash-table.ts +277 -0
  24. package/src/data-structures/hash/index.ts +7 -0
  25. package/src/data-structures/hash/pair.ts +1 -0
  26. package/src/data-structures/hash/tree-map.ts +1 -0
  27. package/src/data-structures/hash/tree-set.ts +1 -0
  28. package/src/data-structures/heap/heap.ts +212 -0
  29. package/src/data-structures/heap/index.ts +3 -0
  30. package/src/data-structures/heap/max-heap.ts +31 -0
  31. package/src/data-structures/heap/min-heap.ts +32 -0
  32. package/src/data-structures/index.ts +11 -0
  33. package/src/data-structures/linked-list/doubly-linked-list.ts +636 -0
  34. package/src/data-structures/linked-list/index.ts +3 -0
  35. package/src/data-structures/linked-list/singly-linked-list.ts +501 -0
  36. package/src/data-structures/linked-list/skip-linked-list.ts +166 -0
  37. package/src/data-structures/matrix/index.ts +4 -0
  38. package/src/data-structures/matrix/matrix.ts +27 -0
  39. package/src/data-structures/matrix/matrix2d.ts +213 -0
  40. package/src/data-structures/matrix/navigator.ts +121 -0
  41. package/src/data-structures/matrix/vector2d.ts +316 -0
  42. package/src/data-structures/priority-queue/index.ts +3 -0
  43. package/src/data-structures/priority-queue/max-priority-queue.ts +56 -0
  44. package/src/data-structures/priority-queue/min-priority-queue.ts +57 -0
  45. package/src/data-structures/priority-queue/priority-queue.ts +359 -0
  46. package/src/data-structures/queue/deque.ts +297 -0
  47. package/src/data-structures/queue/index.ts +2 -0
  48. package/src/data-structures/queue/queue.ts +191 -0
  49. package/src/data-structures/stack/index.ts +1 -0
  50. package/src/data-structures/stack/stack.ts +98 -0
  51. package/src/data-structures/tree/index.ts +1 -0
  52. package/src/data-structures/tree/tree.ts +69 -0
  53. package/src/data-structures/trie/index.ts +1 -0
  54. package/src/data-structures/trie/trie.ts +225 -0
  55. package/src/index.ts +4 -0
  56. package/src/interfaces/abstract-binary-tree.ts +189 -0
  57. package/src/interfaces/abstract-graph.ts +31 -0
  58. package/src/interfaces/avl-tree.ts +25 -0
  59. package/src/interfaces/binary-tree.ts +6 -0
  60. package/src/interfaces/bst.ts +31 -0
  61. package/src/interfaces/directed-graph.ts +20 -0
  62. package/src/interfaces/doubly-linked-list.ts +1 -0
  63. package/src/interfaces/heap.ts +1 -0
  64. package/src/interfaces/index.ts +15 -0
  65. package/src/interfaces/navigator.ts +1 -0
  66. package/src/interfaces/priority-queue.ts +1 -0
  67. package/src/interfaces/rb-tree.ts +9 -0
  68. package/src/interfaces/segment-tree.ts +1 -0
  69. package/src/interfaces/singly-linked-list.ts +1 -0
  70. package/src/interfaces/tree-multiset.ts +7 -0
  71. package/src/interfaces/undirected-graph.ts +6 -0
  72. package/src/types/data-structures/abstract-binary-tree.ts +50 -0
  73. package/src/types/data-structures/abstract-graph.ts +11 -0
  74. package/src/types/data-structures/avl-tree.ts +5 -0
  75. package/src/types/data-structures/binary-tree.ts +5 -0
  76. package/src/types/data-structures/bst.ts +13 -0
  77. package/src/types/data-structures/directed-graph.ts +8 -0
  78. package/src/types/data-structures/doubly-linked-list.ts +1 -0
  79. package/src/types/data-structures/hash.ts +1 -0
  80. package/src/types/data-structures/heap.ts +5 -0
  81. package/src/types/data-structures/index.ts +16 -0
  82. package/src/types/data-structures/map-graph.ts +1 -0
  83. package/src/types/data-structures/navigator.ts +13 -0
  84. package/src/types/data-structures/priority-queue.ts +9 -0
  85. package/src/types/data-structures/rb-tree.ts +8 -0
  86. package/src/types/data-structures/segment-tree.ts +1 -0
  87. package/src/types/data-structures/singly-linked-list.ts +1 -0
  88. package/src/types/data-structures/tree-multiset.ts +6 -0
  89. package/src/types/helpers.ts +1 -0
  90. package/src/types/index.ts +3 -0
  91. package/src/types/utils/index.ts +2 -0
  92. package/src/types/utils/utils.ts +6 -0
  93. package/src/types/utils/validate-type.ts +35 -0
  94. package/src/utils/index.ts +1 -0
  95. package/src/utils/utils.ts +79 -0
  96. package/test/integration/avl-tree.test.ts +108 -0
  97. package/test/integration/bst.test.ts +380 -0
  98. package/test/integration/heap.test.js +16 -0
  99. package/test/integration/index.html +52 -0
  100. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +108 -0
  101. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +142 -0
  102. package/test/unit/data-structures/binary-tree/bst.test.ts +380 -0
  103. package/test/unit/data-structures/binary-tree/overall.test.ts +65 -0
  104. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +43 -0
  105. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +50 -0
  106. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +461 -0
  107. package/test/unit/data-structures/graph/abstract-graph.test.ts +5 -0
  108. package/test/unit/data-structures/graph/directed-graph.test.ts +519 -0
  109. package/test/unit/data-structures/graph/index.ts +2 -0
  110. package/test/unit/data-structures/graph/map-graph.test.ts +45 -0
  111. package/test/unit/data-structures/graph/overall.test.ts +49 -0
  112. package/test/unit/data-structures/graph/undirected-graph.test.ts +59 -0
  113. package/test/unit/data-structures/hash/coordinate-map.test.ts +54 -0
  114. package/test/unit/data-structures/hash/coordinate-set.test.ts +41 -0
  115. package/test/unit/data-structures/hash/hash-map.test.ts +104 -0
  116. package/test/unit/data-structures/hash/hash-table.test.ts +184 -0
  117. package/test/unit/data-structures/heap/heap.test.ts +55 -0
  118. package/test/unit/data-structures/heap/max-heap.test.ts +44 -0
  119. package/test/unit/data-structures/heap/min-heap.test.ts +82 -0
  120. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +364 -0
  121. package/test/unit/data-structures/linked-list/index.ts +4 -0
  122. package/test/unit/data-structures/linked-list/linked-list.test.ts +35 -0
  123. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +451 -0
  124. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +13 -0
  125. package/test/unit/data-structures/linked-list/skip-list.test.ts +55 -0
  126. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  127. package/test/unit/data-structures/matrix/matrix2d.test.ts +138 -0
  128. package/test/unit/data-structures/matrix/navigator.test.ts +79 -0
  129. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +106 -0
  130. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +105 -0
  131. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +27 -0
  132. package/test/unit/data-structures/queue/deque.test.ts +130 -0
  133. package/test/unit/data-structures/queue/queue.test.ts +199 -0
  134. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  135. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  136. package/test/unit/data-structures/trie/trie.test.ts +95 -0
  137. package/test/utils/index.ts +2 -0
  138. package/test/utils/magnitude.ts +21 -0
  139. package/test/utils/number.ts +3 -0
@@ -0,0 +1,380 @@
1
+ import {BST, BSTNode} from 'bst-typed';
2
+
3
+ describe('Individual package BST operations test', () => {
4
+ it('should perform various operations on a Binary Search Tree with numeric values', () => {
5
+ const bst = new BST();
6
+ expect(bst).toBeInstanceOf(BST);
7
+ bst.add(11, 11);
8
+ bst.add(3, 3);
9
+ const idsOrVals = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
10
+ bst.addMany(idsOrVals, idsOrVals);
11
+ expect(bst.root).toBeInstanceOf(BSTNode);
12
+
13
+ if (bst.root) expect(bst.root.id).toBe(11);
14
+
15
+ expect(bst.size).toBe(16);
16
+
17
+ expect(bst.has(6)).toBe(true);
18
+
19
+ const node6 = bst.get(6);
20
+ expect(node6 && bst.getHeight(6)).toBe(2);
21
+ expect(node6 && bst.getDepth(6)).toBe(3);
22
+
23
+ const nodeId10 = bst.get(10);
24
+ expect(nodeId10?.id).toBe(10);
25
+
26
+ const nodeVal9 = bst.get(9, 'val');
27
+ expect(nodeVal9?.id).toBe(9);
28
+
29
+ const leftMost = bst.getLeftMost();
30
+ expect(leftMost?.id).toBe(1);
31
+
32
+ const node15 = bst.get(15);
33
+ const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
34
+ expect(minNodeBySpecificNode?.id).toBe(12);
35
+
36
+ const subTreeSum = node15 && bst.subTreeSum(15);
37
+ expect(subTreeSum).toBe(70);
38
+
39
+ const lesserSum = bst.lesserSum(10);
40
+ expect(lesserSum).toBe(45);
41
+
42
+ expect(node15).toBeInstanceOf(BSTNode);
43
+
44
+ const node11 = bst.get(11);
45
+ expect(node11).toBeInstanceOf(BSTNode);
46
+
47
+ const dfsInorderNodes = bst.DFS('in', 'node');
48
+ expect(dfsInorderNodes[0].id).toBe(1);
49
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].id).toBe(16);
50
+
51
+ bst.perfectlyBalance();
52
+ expect(bst.isPerfectlyBalanced()).toBe(true);
53
+
54
+ const bfsNodesAfterBalanced = bst.BFS('node');
55
+ expect(bfsNodesAfterBalanced[0].id).toBe(8);
56
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
57
+
58
+ const removed11 = bst.remove(11);
59
+ expect(removed11).toBeInstanceOf(Array);
60
+ expect(removed11[0]).toBeDefined();
61
+ expect(removed11[0].deleted).toBeDefined();
62
+
63
+ if (removed11[0].deleted) expect(removed11[0].deleted.id).toBe(11);
64
+
65
+ expect(bst.isAVLBalanced()).toBe(true);
66
+
67
+ expect(bst.getHeight(15)).toBe(1);
68
+
69
+ const removed1 = bst.remove(1);
70
+ expect(removed1).toBeInstanceOf(Array);
71
+ expect(removed1[0]).toBeDefined();
72
+ expect(removed1[0].deleted).toBeDefined();
73
+ if (removed1[0].deleted) expect(removed1[0].deleted.id).toBe(1);
74
+
75
+ expect(bst.isAVLBalanced()).toBe(true);
76
+
77
+ expect(bst.getHeight()).toBe(4);
78
+
79
+ const removed4 = bst.remove(4);
80
+ expect(removed4).toBeInstanceOf(Array);
81
+ expect(removed4[0]).toBeDefined();
82
+ expect(removed4[0].deleted).toBeDefined();
83
+ if (removed4[0].deleted) expect(removed4[0].deleted.id).toBe(4);
84
+ expect(bst.isAVLBalanced()).toBe(true);
85
+ expect(bst.getHeight()).toBe(4);
86
+
87
+ const removed10 = bst.remove(10);
88
+ expect(removed10).toBeInstanceOf(Array);
89
+ expect(removed10[0]).toBeDefined();
90
+ expect(removed10[0].deleted).toBeDefined();
91
+ if (removed10[0].deleted) expect(removed10[0].deleted.id).toBe(10);
92
+ expect(bst.isAVLBalanced()).toBe(false);
93
+ expect(bst.getHeight()).toBe(4);
94
+
95
+ const removed15 = bst.remove(15);
96
+ expect(removed15).toBeInstanceOf(Array);
97
+ expect(removed15[0]).toBeDefined();
98
+ expect(removed15[0].deleted).toBeDefined();
99
+ if (removed15[0].deleted) expect(removed15[0].deleted.id).toBe(15);
100
+
101
+ expect(bst.isAVLBalanced()).toBe(true);
102
+ expect(bst.getHeight()).toBe(3);
103
+
104
+ const removed5 = bst.remove(5);
105
+ expect(removed5).toBeInstanceOf(Array);
106
+ expect(removed5[0]).toBeDefined();
107
+ expect(removed5[0].deleted).toBeDefined();
108
+ if (removed5[0].deleted) expect(removed5[0].deleted.id).toBe(5);
109
+
110
+ expect(bst.isAVLBalanced()).toBe(true);
111
+ expect(bst.getHeight()).toBe(3);
112
+
113
+ const removed13 = bst.remove(13);
114
+ expect(removed13).toBeInstanceOf(Array);
115
+ expect(removed13[0]).toBeDefined();
116
+ expect(removed13[0].deleted).toBeDefined();
117
+ if (removed13[0].deleted) expect(removed13[0].deleted.id).toBe(13);
118
+ expect(bst.isAVLBalanced()).toBe(true);
119
+ expect(bst.getHeight()).toBe(3);
120
+
121
+ const removed3 = bst.remove(3);
122
+ expect(removed3).toBeInstanceOf(Array);
123
+ expect(removed3[0]).toBeDefined();
124
+ expect(removed3[0].deleted).toBeDefined();
125
+ if (removed3[0].deleted) expect(removed3[0].deleted.id).toBe(3);
126
+ expect(bst.isAVLBalanced()).toBe(false);
127
+ expect(bst.getHeight()).toBe(3);
128
+
129
+ const removed8 = bst.remove(8);
130
+ expect(removed8).toBeInstanceOf(Array);
131
+ expect(removed8[0]).toBeDefined();
132
+ expect(removed8[0].deleted).toBeDefined();
133
+ if (removed8[0].deleted) expect(removed8[0].deleted.id).toBe(8);
134
+ expect(bst.isAVLBalanced()).toBe(true);
135
+ expect(bst.getHeight()).toBe(3);
136
+
137
+ const removed6 = bst.remove(6);
138
+ expect(removed6).toBeInstanceOf(Array);
139
+ expect(removed6[0]).toBeDefined();
140
+ expect(removed6[0].deleted).toBeDefined();
141
+ if (removed6[0].deleted) expect(removed6[0].deleted.id).toBe(6);
142
+ expect(bst.remove(6).length).toBe(0);
143
+ expect(bst.isAVLBalanced()).toBe(false);
144
+ expect(bst.getHeight()).toBe(3);
145
+
146
+ const removed7 = bst.remove(7);
147
+ expect(removed7).toBeInstanceOf(Array);
148
+ expect(removed7[0]).toBeDefined();
149
+ expect(removed7[0].deleted).toBeDefined();
150
+ if (removed7[0].deleted) expect(removed7[0].deleted.id).toBe(7);
151
+ expect(bst.isAVLBalanced()).toBe(false);
152
+ expect(bst.getHeight()).toBe(3);
153
+
154
+ const removed9 = bst.remove(9);
155
+ expect(removed9).toBeInstanceOf(Array);
156
+ expect(removed9[0]).toBeDefined();
157
+ expect(removed9[0].deleted).toBeDefined();
158
+ if (removed9[0].deleted) expect(removed9[0].deleted.id).toBe(9);
159
+ expect(bst.isAVLBalanced()).toBe(false);
160
+ expect(bst.getHeight()).toBe(3);
161
+
162
+ const removed14 = bst.remove(14);
163
+ expect(removed14).toBeInstanceOf(Array);
164
+ expect(removed14[0]).toBeDefined();
165
+ expect(removed14[0].deleted).toBeDefined();
166
+ if (removed14[0].deleted) expect(removed14[0].deleted.id).toBe(14);
167
+ expect(bst.isAVLBalanced()).toBe(false);
168
+ expect(bst.getHeight()).toBe(2);
169
+
170
+ expect(bst.isAVLBalanced()).toBe(false);
171
+
172
+ const bfsIDs = bst.BFS();
173
+ expect(bfsIDs[0]).toBe(2);
174
+ expect(bfsIDs[1]).toBe(12);
175
+ expect(bfsIDs[2]).toBe(16);
176
+
177
+ const bfsNodes = bst.BFS('node');
178
+ expect(bfsNodes[0].id).toBe(2);
179
+ expect(bfsNodes[1].id).toBe(12);
180
+ expect(bfsNodes[2].id).toBe(16);
181
+ });
182
+
183
+ it('should perform various operations on a Binary Search Tree with object values', () => {
184
+ const objBST = new BST<BSTNode<{id: number; keyA: number}>>();
185
+ expect(objBST).toBeInstanceOf(BST);
186
+ objBST.add(11, {id: 11, keyA: 11});
187
+ objBST.add(3, {id: 3, keyA: 3});
188
+ const values = [
189
+ {id: 15, keyA: 15},
190
+ {id: 1, keyA: 1},
191
+ {id: 8, keyA: 8},
192
+ {id: 13, keyA: 13},
193
+ {id: 16, keyA: 16},
194
+ {id: 2, keyA: 2},
195
+ {id: 6, keyA: 6},
196
+ {id: 9, keyA: 9},
197
+ {id: 12, keyA: 12},
198
+ {id: 14, keyA: 14},
199
+ {id: 4, keyA: 4},
200
+ {id: 7, keyA: 7},
201
+ {id: 10, keyA: 10},
202
+ {id: 5, keyA: 5}
203
+ ];
204
+
205
+ objBST.addMany(
206
+ values.map(item => item.id),
207
+ values
208
+ );
209
+
210
+ expect(objBST.root).toBeInstanceOf(BSTNode);
211
+
212
+ if (objBST.root) expect(objBST.root.id).toBe(11);
213
+
214
+ expect(objBST.has(6)).toBe(true);
215
+
216
+ const node6 = objBST.get(6);
217
+ expect(node6 && objBST.getHeight(node6)).toBe(2);
218
+ expect(node6 && objBST.getDepth(node6)).toBe(3);
219
+
220
+ const nodeId10 = objBST.get(10, 'id');
221
+ expect(nodeId10?.id).toBe(10);
222
+
223
+ const nodeVal9 = objBST.get(9, 'id');
224
+ expect(nodeVal9?.id).toBe(9);
225
+
226
+ const leftMost = objBST.getLeftMost();
227
+ expect(leftMost?.id).toBe(1);
228
+
229
+ const node15 = objBST.get(15);
230
+ expect(node15?.val).toEqual({id: 15, keyA: 15});
231
+ const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
232
+ expect(minNodeBySpecificNode?.id).toBe(12);
233
+
234
+ const subTreeSum = node15 && objBST.subTreeSum(node15);
235
+ expect(subTreeSum).toBe(70);
236
+
237
+ const lesserSum = objBST.lesserSum(10);
238
+ expect(lesserSum).toBe(45);
239
+
240
+ expect(node15).toBeInstanceOf(BSTNode);
241
+
242
+ const node11 = objBST.get(11);
243
+ expect(node11).toBeInstanceOf(BSTNode);
244
+
245
+ const dfsInorderNodes = objBST.DFS('in', 'node');
246
+ expect(dfsInorderNodes[0].id).toBe(1);
247
+ expect(dfsInorderNodes[dfsInorderNodes.length - 1].id).toBe(16);
248
+
249
+ objBST.perfectlyBalance();
250
+ expect(objBST.isPerfectlyBalanced()).toBe(true);
251
+
252
+ const bfsNodesAfterBalanced = objBST.BFS('node');
253
+ expect(bfsNodesAfterBalanced[0].id).toBe(8);
254
+ expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].id).toBe(16);
255
+
256
+ const removed11 = objBST.remove(11);
257
+ expect(removed11).toBeInstanceOf(Array);
258
+ expect(removed11[0]).toBeDefined();
259
+ expect(removed11[0].deleted).toBeDefined();
260
+
261
+ if (removed11[0].deleted) expect(removed11[0].deleted.id).toBe(11);
262
+
263
+ expect(objBST.isAVLBalanced()).toBe(true);
264
+
265
+ expect(node15 && objBST.getHeight(node15)).toBe(2);
266
+
267
+ const removed1 = objBST.remove(1);
268
+ expect(removed1).toBeInstanceOf(Array);
269
+ expect(removed1[0]).toBeDefined();
270
+ expect(removed1[0].deleted).toBeDefined();
271
+ if (removed1[0].deleted) expect(removed1[0].deleted.id).toBe(1);
272
+
273
+ expect(objBST.isAVLBalanced()).toBe(true);
274
+
275
+ expect(objBST.getHeight()).toBe(4);
276
+
277
+ const removed4 = objBST.remove(4);
278
+ expect(removed4).toBeInstanceOf(Array);
279
+ expect(removed4[0]).toBeDefined();
280
+ expect(removed4[0].deleted).toBeDefined();
281
+ if (removed4[0].deleted) expect(removed4[0].deleted.id).toBe(4);
282
+ expect(objBST.isAVLBalanced()).toBe(true);
283
+ expect(objBST.getHeight()).toBe(4);
284
+
285
+ const removed10 = objBST.remove(10);
286
+ expect(removed10).toBeInstanceOf(Array);
287
+ expect(removed10[0]).toBeDefined();
288
+ expect(removed10[0].deleted).toBeDefined();
289
+ if (removed10[0].deleted) expect(removed10[0].deleted.id).toBe(10);
290
+ expect(objBST.isAVLBalanced()).toBe(false);
291
+ expect(objBST.getHeight()).toBe(4);
292
+
293
+ const removed15 = objBST.remove(15);
294
+ expect(removed15).toBeInstanceOf(Array);
295
+ expect(removed15[0]).toBeDefined();
296
+ expect(removed15[0].deleted).toBeDefined();
297
+ if (removed15[0].deleted) expect(removed15[0].deleted.id).toBe(15);
298
+
299
+ expect(objBST.isAVLBalanced()).toBe(true);
300
+ expect(objBST.getHeight()).toBe(3);
301
+
302
+ const removed5 = objBST.remove(5);
303
+ expect(removed5).toBeInstanceOf(Array);
304
+ expect(removed5[0]).toBeDefined();
305
+ expect(removed5[0].deleted).toBeDefined();
306
+ if (removed5[0].deleted) expect(removed5[0].deleted.id).toBe(5);
307
+
308
+ expect(objBST.isAVLBalanced()).toBe(true);
309
+ expect(objBST.getHeight()).toBe(3);
310
+
311
+ const removed13 = objBST.remove(13);
312
+ expect(removed13).toBeInstanceOf(Array);
313
+ expect(removed13[0]).toBeDefined();
314
+ expect(removed13[0].deleted).toBeDefined();
315
+ if (removed13[0].deleted) expect(removed13[0].deleted.id).toBe(13);
316
+ expect(objBST.isAVLBalanced()).toBe(true);
317
+ expect(objBST.getHeight()).toBe(3);
318
+
319
+ const removed3 = objBST.remove(3);
320
+ expect(removed3).toBeInstanceOf(Array);
321
+ expect(removed3[0]).toBeDefined();
322
+ expect(removed3[0].deleted).toBeDefined();
323
+ if (removed3[0].deleted) expect(removed3[0].deleted.id).toBe(3);
324
+ expect(objBST.isAVLBalanced()).toBe(false);
325
+ expect(objBST.getHeight()).toBe(3);
326
+
327
+ const removed8 = objBST.remove(8);
328
+ expect(removed8).toBeInstanceOf(Array);
329
+ expect(removed8[0]).toBeDefined();
330
+ expect(removed8[0].deleted).toBeDefined();
331
+ if (removed8[0].deleted) expect(removed8[0].deleted.id).toBe(8);
332
+ expect(objBST.isAVLBalanced()).toBe(true);
333
+ expect(objBST.getHeight()).toBe(3);
334
+
335
+ const removed6 = objBST.remove(6);
336
+ expect(removed6).toBeInstanceOf(Array);
337
+ expect(removed6[0]).toBeDefined();
338
+ expect(removed6[0].deleted).toBeDefined();
339
+ if (removed6[0].deleted) expect(removed6[0].deleted.id).toBe(6);
340
+ expect(objBST.remove(6).length).toBe(0);
341
+ expect(objBST.isAVLBalanced()).toBe(false);
342
+ expect(objBST.getHeight()).toBe(3);
343
+
344
+ const removed7 = objBST.remove(7);
345
+ expect(removed7).toBeInstanceOf(Array);
346
+ expect(removed7[0]).toBeDefined();
347
+ expect(removed7[0].deleted).toBeDefined();
348
+ if (removed7[0].deleted) expect(removed7[0].deleted.id).toBe(7);
349
+ expect(objBST.isAVLBalanced()).toBe(false);
350
+ expect(objBST.getHeight()).toBe(3);
351
+
352
+ const removed9 = objBST.remove(9);
353
+ expect(removed9).toBeInstanceOf(Array);
354
+ expect(removed9[0]).toBeDefined();
355
+ expect(removed9[0].deleted).toBeDefined();
356
+ if (removed9[0].deleted) expect(removed9[0].deleted.id).toBe(9);
357
+ expect(objBST.isAVLBalanced()).toBe(false);
358
+ expect(objBST.getHeight()).toBe(3);
359
+
360
+ const removed14 = objBST.remove(14);
361
+ expect(removed14).toBeInstanceOf(Array);
362
+ expect(removed14[0]).toBeDefined();
363
+ expect(removed14[0].deleted).toBeDefined();
364
+ if (removed14[0].deleted) expect(removed14[0].deleted.id).toBe(14);
365
+ expect(objBST.isAVLBalanced()).toBe(false);
366
+ expect(objBST.getHeight()).toBe(2);
367
+
368
+ expect(objBST.isAVLBalanced()).toBe(false);
369
+
370
+ const bfsIDs = objBST.BFS();
371
+ expect(bfsIDs[0]).toBe(2);
372
+ expect(bfsIDs[1]).toBe(12);
373
+ expect(bfsIDs[2]).toBe(16);
374
+
375
+ const bfsNodes = objBST.BFS('node');
376
+ expect(bfsNodes[0].id).toBe(2);
377
+ expect(bfsNodes[1].id).toBe(12);
378
+ expect(bfsNodes[2].id).toBe(16);
379
+ });
380
+ });
@@ -0,0 +1,16 @@
1
+ const {MinHeap} = require('heap-typed');
2
+
3
+ describe('JS Heap Operation Test', () => {
4
+ it('should numeric heap work well', function () {
5
+ const minNumHeap = new MinHeap();
6
+ minNumHeap.add(1).add(6).add(2).add(0).add(5).add(9);
7
+ expect(minNumHeap.poll()).toBe(0);
8
+ expect(minNumHeap.poll()).toBe(1);
9
+ expect(minNumHeap.peek()).toBe(2);
10
+ expect(minNumHeap.toArray().length).toBe(4);
11
+ expect(minNumHeap.toArray()[0]).toBe(2);
12
+ expect(minNumHeap.toArray()[1]).toBe(5);
13
+ expect(minNumHeap.toArray()[2]).toBe(9);
14
+ expect(minNumHeap.toArray()[3]).toBe(6);
15
+ });
16
+ });
@@ -0,0 +1,52 @@
1
+ <!DOCTYPE html>
2
+ <html lang='en'>
3
+ <head>
4
+ <meta charset='UTF-8'>
5
+ <title>CDN Test</title>
6
+ <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/umd/bundle.min.js'></script>
7
+ </head>
8
+ <body>
9
+ <div id='app'>
10
+ <ul class='modules'>
11
+
12
+ </ul>
13
+ </div>
14
+ <script defer>
15
+ const $modules = document.querySelector('.modules');
16
+
17
+
18
+ try {
19
+ const {AVLTree, Queue} = window.dataStructureTyped;
20
+ const avlTree = new AVLTree();
21
+ const $avlTree = document.createElement('li');
22
+ const $avlTreeSpan = document.createElement('span');
23
+ $avlTreeSpan.innerText = 'AVLTree';
24
+ $avlTree.append($avlTreeSpan);
25
+ avlTree.add(1, 1);
26
+ console.log(avlTree.BFS());
27
+ $modules.append($avlTree);
28
+
29
+
30
+ const queue = new Queue();
31
+ for (let i = 0; i < 1000000; i++) {
32
+ queue.enqueue(i);
33
+ }
34
+ let last = 0;
35
+ const startTime = performance.now();
36
+
37
+ for (let i = 0; i < 1000000; i++) {
38
+ last = queue.dequeue();
39
+ }
40
+
41
+ console.log(performance.now() - startTime);
42
+
43
+ }
44
+ catch (e) {
45
+ console.error(e);
46
+ }
47
+
48
+ </script>
49
+
50
+ </body>
51
+ </html>
52
+
@@ -0,0 +1,108 @@
1
+ import {AVLTree} from '../../../../src';
2
+
3
+ describe('AVL Tree Test', () => {
4
+ it('should perform various operations on a AVL Tree', () => {
5
+ const arr = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
6
+ const tree = new AVLTree();
7
+
8
+ for (const i of arr) tree.add(i, i);
9
+
10
+ const node6 = tree.get(6);
11
+
12
+ expect(node6 && tree.getHeight(node6)).toBe(3);
13
+ expect(node6 && tree.getDepth(node6)).toBe(1);
14
+
15
+ const getNodeById = tree.get(10, 'id');
16
+ expect(getNodeById?.id).toBe(10);
17
+
18
+ const getMinNodeByRoot = tree.getLeftMost();
19
+ expect(getMinNodeByRoot?.id).toBe(1);
20
+
21
+ const node15 = tree.get(15);
22
+ const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15);
23
+ expect(getMinNodeBySpecificNode?.id).toBe(12);
24
+
25
+ const subTreeSum = node15 && tree.subTreeSum(node15);
26
+ expect(subTreeSum).toBe(70);
27
+
28
+ const lesserSum = tree.lesserSum(10);
29
+ expect(lesserSum).toBe(45);
30
+
31
+ // node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
32
+ expect(node15?.val).toBe(15);
33
+
34
+ const dfs = tree.DFS('in', 'node');
35
+ expect(dfs[0].id).toBe(1);
36
+ expect(dfs[dfs.length - 1].id).toBe(16);
37
+
38
+ tree.perfectlyBalance();
39
+ const bfs = tree.BFS('node');
40
+ expect(tree.isPerfectlyBalanced()).toBe(true);
41
+ expect(bfs[0].id).toBe(8);
42
+ expect(bfs[bfs.length - 1].id).toBe(16);
43
+
44
+ expect(tree.remove(11)[0].deleted?.id).toBe(11);
45
+ expect(tree.isAVLBalanced()).toBe(true);
46
+ expect(node15 && tree.getHeight(node15)).toBe(2);
47
+
48
+ expect(tree.remove(1)[0].deleted?.id).toBe(1);
49
+ expect(tree.isAVLBalanced()).toBe(true);
50
+ expect(tree.getHeight()).toBe(4);
51
+
52
+ expect(tree.remove(4)[0].deleted?.id).toBe(4);
53
+ expect(tree.isAVLBalanced()).toBe(true);
54
+ expect(tree.getHeight()).toBe(4);
55
+
56
+ expect(tree.remove(10)[0].deleted?.id).toBe(10);
57
+ expect(tree.isAVLBalanced()).toBe(true);
58
+ expect(tree.getHeight()).toBe(3);
59
+
60
+ expect(tree.remove(15)[0].deleted?.id).toBe(15);
61
+ expect(tree.isAVLBalanced()).toBe(true);
62
+
63
+ expect(tree.getHeight()).toBe(3);
64
+
65
+ expect(tree.remove(5)[0].deleted?.id).toBe(5);
66
+ expect(tree.isAVLBalanced()).toBe(true);
67
+ expect(tree.getHeight()).toBe(3);
68
+
69
+ expect(tree.remove(13)[0].deleted?.id).toBe(13);
70
+ expect(tree.isAVLBalanced()).toBe(true);
71
+ expect(tree.getHeight()).toBe(3);
72
+
73
+ expect(tree.remove(3)[0].deleted?.id).toBe(3);
74
+ expect(tree.isAVLBalanced()).toBe(true);
75
+ expect(tree.getHeight()).toBe(3);
76
+
77
+ expect(tree.remove(8)[0].deleted?.id).toBe(8);
78
+ expect(tree.isAVLBalanced()).toBe(true);
79
+ expect(tree.getHeight()).toBe(3);
80
+
81
+ expect(tree.remove(6)[0].deleted?.id).toBe(6);
82
+ expect(tree.remove(6).length).toBe(0);
83
+ expect(tree.isAVLBalanced()).toBe(true);
84
+ expect(tree.getHeight()).toBe(2);
85
+
86
+ expect(tree.remove(7)[0].deleted?.id).toBe(7);
87
+ expect(tree.isAVLBalanced()).toBe(true);
88
+ expect(tree.getHeight()).toBe(2);
89
+
90
+ expect(tree.remove(9)[0].deleted?.id).toBe(9);
91
+ expect(tree.isAVLBalanced()).toBe(true);
92
+ expect(tree.getHeight()).toBe(2);
93
+ expect(tree.remove(14)[0].deleted?.id).toBe(14);
94
+ expect(tree.isAVLBalanced()).toBe(true);
95
+ expect(tree.getHeight()).toBe(1);
96
+
97
+ expect(tree.isAVLBalanced()).toBe(true);
98
+ const lastBFSIds = tree.BFS();
99
+ expect(lastBFSIds[0]).toBe(12);
100
+ expect(lastBFSIds[1]).toBe(2);
101
+ expect(lastBFSIds[2]).toBe(16);
102
+
103
+ const lastBFSNodes = tree.BFS('node');
104
+ expect(lastBFSNodes[0].id).toBe(12);
105
+ expect(lastBFSNodes[1].id).toBe(2);
106
+ expect(lastBFSNodes[2].id).toBe(16);
107
+ });
108
+ });
@@ -0,0 +1,142 @@
1
+ import {BinaryTreeNode} from '../../../../src';
2
+ import {BinaryTree} from 'binary-tree-typed';
3
+
4
+ describe('BinaryTreeNode', () => {
5
+ it('should create an instance of BinaryTreeNode', () => {
6
+ const node = new BinaryTreeNode<number>(1);
7
+ expect(node).toBeInstanceOf(BinaryTreeNode);
8
+ });
9
+
10
+ it('should set and get the ID correctly', () => {
11
+ const node = new BinaryTreeNode<number>(1);
12
+ expect(node.id).toBe(1);
13
+
14
+ node.id = 2;
15
+ expect(node.id).toBe(2);
16
+ });
17
+
18
+ it('should set and get the value correctly', () => {
19
+ const node = new BinaryTreeNode<number>(1, 42);
20
+ expect(node.val).toBe(42);
21
+
22
+ node.val = 55;
23
+ expect(node.val).toBe(55);
24
+ });
25
+
26
+ it('should set and get the left child correctly', () => {
27
+ const node1 = new BinaryTreeNode<number>(1);
28
+ const node2 = new BinaryTreeNode<number>(2);
29
+
30
+ node1.left = node2;
31
+
32
+ expect(node1.left).toBe(node2);
33
+ expect(node2.parent).toBe(node1);
34
+ });
35
+
36
+ it('should set and get the right child correctly', () => {
37
+ const node1 = new BinaryTreeNode<number>(1);
38
+ const node2 = new BinaryTreeNode<number>(2);
39
+
40
+ node1.right = node2;
41
+
42
+ expect(node1.right).toBe(node2);
43
+ expect(node2.parent).toBe(node1);
44
+ });
45
+
46
+ it('should set and get the parent correctly', () => {
47
+ const node1 = new BinaryTreeNode<number>(1);
48
+ const node2 = new BinaryTreeNode<number>(2);
49
+
50
+ node1.left = node2;
51
+
52
+ expect(node2.parent).toBe(node1);
53
+ expect(node1.left).toBe(node2);
54
+ });
55
+
56
+ it('should set and get the height correctly', () => {
57
+ const node = new BinaryTreeNode<number>(1);
58
+ expect(node.height).toBe(0);
59
+
60
+ node.height = 3;
61
+ expect(node.height).toBe(3);
62
+ });
63
+
64
+ it('should determine family position correctly', () => {
65
+ const root = new BinaryTreeNode<number>(1);
66
+ const leftChild = new BinaryTreeNode<number>(2);
67
+ const rightChild = new BinaryTreeNode<number>(3);
68
+
69
+ root.left = leftChild;
70
+ root.right = rightChild;
71
+
72
+ expect(leftChild.familyPosition).toBe('LEFT');
73
+ expect(rightChild.familyPosition).toBe('RIGHT');
74
+ expect(root.familyPosition).toBe('ROOT');
75
+ });
76
+ });
77
+
78
+ describe('BinaryTree', () => {
79
+ let binaryTree: BinaryTree;
80
+
81
+ beforeEach(() => {
82
+ binaryTree = new BinaryTree();
83
+ });
84
+
85
+ afterEach(() => {
86
+ binaryTree.clear();
87
+ });
88
+
89
+ test('should add a node', () => {
90
+ const node = binaryTree.add(1);
91
+ expect(node).not.toBeNull();
92
+ expect(binaryTree.size).toBe(1);
93
+ });
94
+
95
+ test('should remove a node', () => {
96
+ const node = binaryTree.add(1);
97
+ expect(binaryTree.size).toBe(1);
98
+
99
+ if (node) {
100
+ const result = binaryTree.remove(node);
101
+ expect(result).toHaveLength(1);
102
+ expect(binaryTree.size).toBe(0);
103
+ }
104
+ });
105
+
106
+ test('should add and find nodes', () => {
107
+ binaryTree.add(1);
108
+ binaryTree.add(2);
109
+ binaryTree.add(3);
110
+
111
+ expect(binaryTree.has(1)).toBe(true);
112
+ expect(binaryTree.has(2)).toBe(true);
113
+ expect(binaryTree.has(3)).toBe(true);
114
+ expect(binaryTree.has(4)).toBe(false);
115
+ });
116
+
117
+ test('should traverse in-order', () => {
118
+ binaryTree.add(4);
119
+ binaryTree.add(2);
120
+ binaryTree.add(6);
121
+ binaryTree.add(1);
122
+ binaryTree.add(3);
123
+ binaryTree.add(5);
124
+ binaryTree.add(7);
125
+
126
+ const inOrder = binaryTree.DFS('in');
127
+
128
+ expect(inOrder).toEqual([1, 2, 3, 4, 5, 6, 7]);
129
+ });
130
+
131
+ test('should clear the tree', () => {
132
+ binaryTree.add(1);
133
+ binaryTree.add(2);
134
+
135
+ expect(binaryTree.size).toBe(2);
136
+
137
+ binaryTree.clear();
138
+
139
+ expect(binaryTree.size).toBe(0);
140
+ expect(binaryTree.root).toBeNull();
141
+ });
142
+ });