Skip to content

Commit 76f9128

Browse files
committed
add test cases for AVL
1 parent 6750484 commit 76f9128

File tree

1 file changed

+51
-20
lines changed

1 file changed

+51
-20
lines changed

data_structures/binary_tree/avl_tree.py

Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88

99
import math
1010
import random
11+
import unittest
1112
from typing import Any
1213

1314

1415
class my_queue:
15-
def __init__(self):
16+
def __init__(self) -> None:
1617
self.data = []
1718
self.head = 0
1819
self.tail = 0
@@ -39,7 +40,7 @@ def print(self) -> None:
3940

4041

4142
class my_node:
42-
def __init__(self, data: Any):
43+
def __init__(self, data: Any) -> None:
4344
self.data = data
4445
self.left = None
4546
self.right = None
@@ -69,7 +70,7 @@ def set_right(self, node: "my_node") -> None:
6970
self.right = node
7071
return
7172

72-
def set_height(self, height) -> None:
73+
def set_height(self, height: int) -> None:
7374
self.height = height
7475
return
7576

@@ -257,7 +258,7 @@ class AVLtree:
257258
*************************************
258259
"""
259260

260-
def __init__(self):
261+
def __init__(self) -> None:
261262
self.root = None
262263

263264
def get_height(self) -> int:
@@ -274,7 +275,7 @@ def del_node(self, data: Any) -> None:
274275
return
275276
self.root = del_node(self.root, data)
276277

277-
def __str__(self):
278+
def __str__(self) -> str:
278279
"""
279280
A level traversale, gives a more intuitive look on the tree
280281
"""
@@ -311,21 +312,51 @@ def __str__(self):
311312
return output
312313

313314

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))
318359

319360

320361
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

Comments
 (0)