8
8
9
9
import math
10
10
import random
11
+ import unittest
11
12
from typing import Any
12
13
13
14
14
15
class my_queue :
15
- def __init__ (self ):
16
+ def __init__ (self ) -> None :
16
17
self .data = []
17
18
self .head = 0
18
19
self .tail = 0
@@ -39,7 +40,7 @@ def print(self) -> None:
39
40
40
41
41
42
class my_node :
42
- def __init__ (self , data : Any ):
43
+ def __init__ (self , data : Any ) -> None :
43
44
self .data = data
44
45
self .left = None
45
46
self .right = None
@@ -69,7 +70,7 @@ def set_right(self, node: "my_node") -> None:
69
70
self .right = node
70
71
return
71
72
72
- def set_height (self , height ) -> None :
73
+ def set_height (self , height : int ) -> None :
73
74
self .height = height
74
75
return
75
76
@@ -257,7 +258,7 @@ class AVLtree:
257
258
*************************************
258
259
"""
259
260
260
- def __init__ (self ):
261
+ def __init__ (self ) -> None :
261
262
self .root = None
262
263
263
264
def get_height (self ) -> int :
@@ -274,7 +275,7 @@ def del_node(self, data: Any) -> None:
274
275
return
275
276
self .root = del_node (self .root , data )
276
277
277
- def __str__ (self ):
278
+ def __str__ (self ) -> str :
278
279
"""
279
280
A level traversale, gives a more intuitive look on the tree
280
281
"""
@@ -311,21 +312,51 @@ def __str__(self):
311
312
return output
312
313
313
314
314
- def _test ():
315
- import doctest
316
-
317
- doctest .testmod ()
315
+ class Test (unittest .TestCase ):
316
+ def _is_balance (self , avl : AVLtree ):
317
+ if avl .root is None :
318
+ return True
319
+ dfs = [avl .root ]
320
+ while dfs :
321
+ now = dfs .pop ()
322
+ if now .left :
323
+ left_height = now .left .height
324
+ dfs .append (now .left )
325
+ else :
326
+ left_height = 0
327
+ if now .right :
328
+ right_height = now .right .height
329
+ dfs .append (now .right )
330
+ else :
331
+ right_height = 0
332
+ if abs (left_height - right_height ) > 1 :
333
+ return False
334
+ return True
335
+
336
+ def test_delete (self ):
337
+ avl = AVLtree ()
338
+ for i in [8 , 7 , 4 , 3 , 9 , 10 , 11 , 13 , 6 , 0 , 2 , 12 , 1 , 14 , 5 ]:
339
+ avl .insert (i )
340
+ self .assertTrue (self ._is_balance (avl ))
341
+
342
+ for v in [8 , 7 , 4 , 3 , 9 , 10 , 11 , 13 , 6 , 0 , 2 , 12 , 1 , 14 , 5 ]:
343
+ avl .del_node (v )
344
+ print (avl )
345
+ self .assertTrue (self ._is_balance (avl ))
346
+
347
+ def test_delete_random (self ):
348
+ avl = AVLtree ()
349
+ random .seed (0 )
350
+ values = list (range (1000 ))
351
+ random .shuffle (values )
352
+ for i in values :
353
+ avl .insert (i )
354
+ self .assertTrue (self ._is_balance (avl ))
355
+ random .shuffle (values )
356
+ for i in values :
357
+ avl .del_node (i )
358
+ self .assertTrue (self ._is_balance (avl ))
318
359
319
360
320
361
if __name__ == "__main__" :
321
- _test ()
322
- t = AVLtree ()
323
- lst = list (range (10 ))
324
- random .shuffle (lst )
325
- for i in lst :
326
- t .insert (i )
327
- print (str (t ))
328
- random .shuffle (lst )
329
- for i in lst :
330
- t .del_node (i )
331
- print (str (t ))
362
+ unittest .main ()
0 commit comments