@@ -170,4 +170,150 @@ type AVLTreeTests() =
170
170
|> verifyProperties
171
171
172
172
Assert.AreEqual( tree1.Root |> Option.map ( fun n -> n.Value),
173
- tree2.Root |> Option.map ( fun n -> n.Value))
173
+ tree2.Root |> Option.map ( fun n -> n.Value))
174
+ [<TestMethod>]
175
+ member _. ``Delete maintains AVL properties`` () =
176
+ let tree =
177
+ empty
178
+ |> insert 5
179
+ |> verifyProperties
180
+ |> insert 3
181
+ |> verifyProperties
182
+ |> insert 7
183
+ |> verifyProperties
184
+ |> insert 1
185
+ |> verifyProperties
186
+ |> insert 9
187
+ |> verifyProperties
188
+ |> insert 4
189
+ |> verifyProperties
190
+ |> insert 6
191
+ |> verifyProperties
192
+ |> insert 8
193
+ |> verifyProperties
194
+ |> insert 2
195
+ |> verifyProperties
196
+ |> delete 5 // Delete root
197
+ |> verifyProperties
198
+ |> delete 1 // Delete leaf
199
+ |> verifyProperties
200
+ |> delete 7 // Delete node with one child
201
+ |> verifyProperties
202
+ |> delete 3 // Delete node with two children
203
+ |> verifyProperties
204
+
205
+ Assert.IsTrue( tree.Root.IsSome)
206
+
207
+ [<TestMethod>]
208
+ member _. ``Delete from empty tree returns empty tree`` () =
209
+ let tree =
210
+ empty
211
+ |> delete 1
212
+ |> verifyProperties
213
+
214
+ Assert.IsTrue( tree.Root.IsNone)
215
+
216
+ [<TestMethod>]
217
+ member _. ``Delete non - existent value maintains tree structure`` () =
218
+ let tree1 =
219
+ empty
220
+ |> insert 2
221
+ |> verifyProperties
222
+ |> insert 1
223
+ |> verifyProperties
224
+ |> insert 3
225
+ |> verifyProperties
226
+
227
+ let tree2 =
228
+ tree1
229
+ |> delete 4
230
+ |> verifyProperties
231
+
232
+ Assert.AreEqual(
233
+ tree1.Root |> Option.map ( fun n -> n.Value),
234
+ tree2.Root |> Option.map ( fun n -> n.Value)
235
+ )
236
+
237
+ [<TestMethod>]
238
+ member _. ``Complex deletion cases maintain balance`` () =
239
+ let tree =
240
+ empty
241
+ |> insert 50 // Create a more complex tree
242
+ |> verifyProperties
243
+ |> insert 25
244
+ |> verifyProperties
245
+ |> insert 75
246
+ |> verifyProperties
247
+ |> insert 10
248
+ |> verifyProperties
249
+ |> insert 35
250
+ |> verifyProperties
251
+ |> insert 60
252
+ |> verifyProperties
253
+ |> insert 90
254
+ |> verifyProperties
255
+ |> insert 5
256
+ |> verifyProperties
257
+ |> insert 15
258
+ |> verifyProperties
259
+ |> insert 30
260
+ |> verifyProperties
261
+ |> insert 40
262
+ |> verifyProperties
263
+ |> insert 55
264
+ |> verifyProperties
265
+ |> insert 65
266
+ |> verifyProperties
267
+ |> insert 80
268
+ |> verifyProperties
269
+ |> insert 95
270
+ |> verifyProperties
271
+
272
+ // Test various deletion patterns
273
+ |> delete 50 // Delete root with two children
274
+ |> verifyProperties
275
+ |> delete 25 // Delete inner node with two children
276
+ |> verifyProperties
277
+ |> delete 5 // Delete leaf
278
+ |> verifyProperties
279
+ |> delete 95 // Delete leaf on opposite side
280
+ |> verifyProperties
281
+ |> delete 35 // Delete node with one child
282
+ |> verifyProperties
283
+ |> delete 75 // Delete node requiring rebalancing
284
+ |> verifyProperties
285
+
286
+ Assert.IsTrue( tree.Root.IsSome)
287
+
288
+ [<TestMethod>]
289
+ member _. ``Sequential deletion maintains balance`` () =
290
+ let mutable tree = empty
291
+
292
+ // Build tree with sequential inserts
293
+ for i in 1 .. 10 do
294
+ tree <- insert i tree
295
+ tree <- verifyProperties tree
296
+
297
+ // Delete in reverse order
298
+ for i in seq { 10 ..(- 1 ).. 1 } do
299
+ tree <- delete i tree
300
+ tree <- verifyProperties tree
301
+
302
+ Assert.IsTrue( tree.Root.IsNone)
303
+
304
+ [<TestMethod>]
305
+ member _. ``Random operations maintain AVL properties`` () =
306
+ let rng = System.Random( 42 )
307
+ let mutable tree = empty
308
+
309
+ // Random inserts
310
+ for _ in 1 .. 20 do
311
+ let value = rng.Next( 1 , 100 )
312
+ tree <- insert value tree
313
+ tree <- verifyProperties tree
314
+
315
+ // Random deletes
316
+ for _ in 1 .. 10 do
317
+ let value = rng.Next( 1 , 100 )
318
+ tree <- delete value tree
319
+ tree <- verifyProperties tree
0 commit comments