1111import doctest
1212from typing import Any
1313
14+
1415class MyQueue :
1516 def __init__ (self ) -> None :
1617 self .data : list [Any ] = []
@@ -28,42 +29,46 @@ def pop(self) -> Any:
2829 self .head += 1
2930 return ret
3031
32+
3133class MyNode :
3234 def __init__ (self , data : Any ) -> None :
3335 self .data = data
3436 self .left = self .right = None
3537 self .height = 1
3638
37- def get_data (self ) -> Any :
39+ def get_data (self ) -> Any :
3840 return self .data
39-
40- def get_left (self ) -> MyNode | None :
41+
42+ def get_left (self ) -> MyNode | None :
4143 return self .left
42-
43- def get_right (self ) -> MyNode | None :
44+
45+ def get_right (self ) -> MyNode | None :
4446 return self .right
45-
46- def get_height (self ) -> int :
47+
48+ def get_height (self ) -> int :
4749 return self .height
48-
49- def set_data (self , data : Any ) -> None :
50+
51+ def set_data (self , data : Any ) -> None :
5052 self .data = data
51-
52- def set_left (self , node : MyNode | None ) -> None :
53+
54+ def set_left (self , node : MyNode | None ) -> None :
5355 self .left = node
54-
55- def set_right (self , node : MyNode | None ) -> None :
56+
57+ def set_right (self , node : MyNode | None ) -> None :
5658 self .right = node
57-
58- def set_height (self , height : int ) -> None :
59+
60+ def set_height (self , height : int ) -> None :
5961 self .height = height
6062
61- def get_height (node : MyNode | None ) -> int :
63+
64+ def get_height (node : MyNode | None ) -> int :
6265 return node .height if node else 0
6366
64- def my_max (a : int , b : int ) -> int :
67+
68+ def my_max (a : int , b : int ) -> int :
6569 return a if a > b else b
6670
71+
6772def right_rotation (node : MyNode ) -> MyNode :
6873 print ("left rotation node:" , node .data )
6974 ret = node .left
@@ -73,6 +78,7 @@ def right_rotation(node: MyNode) -> MyNode:
7378 ret .height = my_max (get_height (ret .right ), get_height (ret .left )) + 1
7479 return ret
7580
81+
7682def left_rotation (node : MyNode ) -> MyNode :
7783 print ("right rotation node:" , node .data )
7884 ret = node .right
@@ -82,18 +88,21 @@ def left_rotation(node: MyNode) -> MyNode:
8288 ret .height = my_max (get_height (ret .right ), get_height (ret .left )) + 1
8389 return ret
8490
91+
8592def lr_rotation (node : MyNode ) -> MyNode :
8693 node .left = left_rotation (node .left )
8794 return right_rotation (node )
8895
96+
8997def rl_rotation (node : MyNode ) -> MyNode :
9098 node .right = right_rotation (node .right )
9199 return left_rotation (node )
92100
101+
93102def insert_node (node : MyNode | None , data : Any ) -> MyNode | None :
94103 if not node :
95104 return MyNode (data )
96-
105+
97106 if data < node .data :
98107 node .left = insert_node (node .left , data )
99108 if get_height (node .left ) - get_height (node .right ) == 2 :
@@ -108,15 +117,17 @@ def insert_node(node: MyNode | None, data: Any) -> MyNode | None:
108117 node = rl_rotation (node )
109118 else :
110119 node = left_rotation (node )
111-
120+
112121 node .height = my_max (get_height (node .right ), get_height (node .left )) + 1
113122 return node
114123
124+
115125def get_extreme (root : MyNode , is_right : bool ) -> Any :
116- while ( child := root .right if is_right else root .left ) :
126+ while child := root .right if is_right else root .left :
117127 root = child
118128 return root .data
119129
130+
120131def del_node (root : MyNode , data : Any ) -> MyNode | None :
121132 if root .data == data :
122133 if root .left and root .right :
@@ -130,11 +141,11 @@ def del_node(root: MyNode, data: Any) -> MyNode | None:
130141 root .left = del_node (root .left , data )
131142 else :
132143 root .right = del_node (root .right , data )
133-
144+
134145 # Handle balancing
135146 right_height = get_height (root .right )
136147 left_height = get_height (root .left )
137-
148+
138149 if right_height - left_height == 2 :
139150 if get_height (root .right .right ) > get_height (root .right .left ):
140151 root = left_rotation (root )
@@ -145,68 +156,72 @@ def del_node(root: MyNode, data: Any) -> MyNode | None:
145156 root = right_rotation (root )
146157 else :
147158 root = lr_rotation (root )
148-
159+
149160 root .height = my_max (get_height (root .right ), get_height (root .left )) + 1
150161 return root
162+
163+
151164class AVLtree :
152- def __init__ (self ) -> None :
165+ def __init__ (self ) -> None :
153166 self .root = None
154-
155- def get_height (self ) -> int :
167+
168+ def get_height (self ) -> int :
156169 return get_height (self .root )
157-
170+
158171 def insert (self , data : Any ) -> None :
159172 print (f"insert:{ data } " )
160173 self .root = insert_node (self .root , data )
161-
174+
162175 def del_node (self , data : Any ) -> None :
163176 print (f"delete:{ data } " )
164177 if not self .root :
165178 return
166179 self .root = del_node (self .root , data )
167-
180+
168181 def __str__ (self ) -> str :
169182 if not self .root :
170183 return ""
171184 q , output , layer , cnt = MyQueue (), "" , self .get_height (), 0
172185 q .push (self .root )
173-
186+
174187 while not q .is_empty ():
175188 node = q .pop ()
176- space = " " * int (2 ** (layer - 1 ))
189+ space = " " * int (2 ** (layer - 1 ))
177190 output += space + (str (node .data ) if node else "*" ) + space
178191 cnt += 1
179-
192+
180193 if node :
181194 q .push (node .left )
182195 q .push (node .right )
183196 else :
184197 q .push (None )
185198 q .push (None )
186-
199+
187200 for i in range (10 ):
188201 if cnt == 2 ** i - 1 :
189202 layer -= 1
190203 output += "\n "
191204 if layer == 0 :
192205 break
193206 break
194-
195- return output + "\n " + "*" * 36
196207
197- def _test () -> None :
208+ return output + "\n " + "*" * 36
209+
210+
211+ def _test () -> None :
198212 doctest .testmod ()
199213
214+
200215if __name__ == "__main__" :
201216 _test ()
202217 t = AVLtree ()
203218 lst = list (range (10 ))
204219 random .shuffle (lst )
205-
220+
206221 for i in lst :
207222 t .insert (i )
208223 print (t )
209-
224+
210225 random .shuffle (lst )
211226 for i in lst :
212227 t .del_node (i )
0 commit comments