8
8
9
9
import math
10
10
import random
11
+ from typing import Any , List , Optional
11
12
12
13
13
14
class my_queue :
14
- def __init__ (self ):
15
- self .data = []
16
- self .head = 0
17
- self .tail = 0
15
+ def __init__ (self ) -> None :
16
+ self .data : List [ Any ] = []
17
+ self .head : int = 0
18
+ self .tail : int = 0
18
19
19
- def is_empty (self ):
20
+ def is_empty (self ) -> bool :
20
21
return self .head == self .tail
21
22
22
- def push (self , data ) :
23
+ def push (self , data : Any ) -> None :
23
24
self .data .append (data )
24
25
self .tail = self .tail + 1
25
26
26
- def pop (self ):
27
+ def pop (self ) -> Any :
27
28
ret = self .data [self .head ]
28
29
self .head = self .head + 1
29
30
return ret
30
31
31
- def count (self ):
32
+ def count (self ) -> int :
32
33
return self .tail - self .head
33
34
34
- def print (self ):
35
+ def print (self ) -> None :
35
36
print (self .data )
36
37
print ("**************" )
37
38
print (self .data [self .head : self .tail ])
38
39
39
40
40
41
class my_node :
41
- def __init__ (self , data ) :
42
+ def __init__ (self , data : Any ) -> None :
42
43
self .data = data
43
- self .left = None
44
- self .right = None
45
- self .height = 1
44
+ self .left : Optional [ my_node ] = None
45
+ self .right : Optional [ my_node ] = None
46
+ self .height : int = 1
46
47
47
- def get_data (self ):
48
+ def get_data (self ) -> Any :
48
49
return self .data
49
50
50
- def get_left (self ):
51
+ def get_left (self ) -> Optional [ "my_node" ] :
51
52
return self .left
52
53
53
- def get_right (self ):
54
+ def get_right (self ) -> Optional [ "my_node" ] :
54
55
return self .right
55
56
56
- def get_height (self ):
57
+ def get_height (self ) -> int :
57
58
return self .height
58
59
59
- def set_data (self , data ) :
60
+ def set_data (self , data : Any ) -> None :
60
61
self .data = data
61
62
return
62
63
63
- def set_left (self , node ) :
64
+ def set_left (self , node : Optional [ "my_node" ]) -> None :
64
65
self .left = node
65
66
return
66
67
67
- def set_right (self , node ) :
68
+ def set_right (self , node : Optional [ "my_node" ]) -> None :
68
69
self .right = node
69
70
return
70
71
71
- def set_height (self , height ) :
72
+ def set_height (self , height : int ) -> None :
72
73
self .height = height
73
74
return
74
75
75
76
76
- def get_height (node ) :
77
+ def get_height (node : Optional [ "my_node" ]) -> int :
77
78
if node is None :
78
79
return 0
79
80
return node .get_height ()
80
81
81
82
82
- def my_max (a , b ) :
83
+ def my_max (a : int , b : int ) -> int :
83
84
if a > b :
84
85
return a
85
86
return b
86
87
87
88
88
- def right_rotation (node ) :
89
+ def right_rotation (node : my_node ) -> my_node :
89
90
r"""
90
91
A B
91
92
/ \ / \
@@ -98,6 +99,7 @@ def right_rotation(node):
98
99
"""
99
100
print ("left rotation node:" , node .get_data ())
100
101
ret = node .get_left ()
102
+ assert ret is not None
101
103
node .set_left (ret .get_right ())
102
104
ret .set_right (node )
103
105
h1 = my_max (get_height (node .get_right ()), get_height (node .get_left ())) + 1
@@ -107,12 +109,13 @@ def right_rotation(node):
107
109
return ret
108
110
109
111
110
- def left_rotation (node ) :
112
+ def left_rotation (node : my_node ) -> my_node :
111
113
"""
112
114
a mirror symmetry rotation of the left_rotation
113
115
"""
114
116
print ("right rotation node:" , node .get_data ())
115
117
ret = node .get_right ()
118
+ assert ret is not None
116
119
node .set_right (ret .get_left ())
117
120
ret .set_left (node )
118
121
h1 = my_max (get_height (node .get_right ()), get_height (node .get_left ())) + 1
@@ -122,7 +125,7 @@ def left_rotation(node):
122
125
return ret
123
126
124
127
125
- def lr_rotation (node ) :
128
+ def lr_rotation (node : my_node ) -> my_node :
126
129
r"""
127
130
A A Br
128
131
/ \ / \ / \
@@ -133,33 +136,41 @@ def lr_rotation(node):
133
136
UB Bl
134
137
RR = right_rotation LR = left_rotation
135
138
"""
136
- node .set_left (left_rotation (node .get_left ()))
139
+ left_child = node .get_left ()
140
+ assert left_child is not None
141
+ node .set_left (left_rotation (left_child ))
137
142
return right_rotation (node )
138
143
139
144
140
- def rl_rotation (node ):
141
- node .set_right (right_rotation (node .get_right ()))
145
+ def rl_rotation (node : my_node ) -> my_node :
146
+ right_child = node .get_right ()
147
+ assert right_child is not None
148
+ node .set_right (right_rotation (right_child ))
142
149
return left_rotation (node )
143
150
144
151
145
- def insert_node (node , data ) :
152
+ def insert_node (node : Optional [ "my_node" ] , data : Any ) -> Optional [ "my_node" ] :
146
153
if node is None :
147
154
return my_node (data )
148
155
if data < node .get_data ():
149
156
node .set_left (insert_node (node .get_left (), data ))
150
157
if (
151
158
get_height (node .get_left ()) - get_height (node .get_right ()) == 2
152
159
): # an unbalance detected
160
+ left_child = node .get_left ()
161
+ assert left_child is not None
153
162
if (
154
- data < node . get_left () .get_data ()
163
+ data < left_child .get_data ()
155
164
): # new node is the left child of the left child
156
165
node = right_rotation (node )
157
166
else :
158
167
node = lr_rotation (node )
159
168
else :
160
169
node .set_right (insert_node (node .get_right (), data ))
161
170
if get_height (node .get_right ()) - get_height (node .get_left ()) == 2 :
162
- if data < node .get_right ().get_data ():
171
+ right_child = node .get_right ()
172
+ assert right_child is not None
173
+ if data < right_child .get_data ():
163
174
node = rl_rotation (node )
164
175
else :
165
176
node = left_rotation (node )
@@ -168,52 +179,59 @@ def insert_node(node, data):
168
179
return node
169
180
170
181
171
- def get_rightMost (root ):
172
- while root .get_right () is not None :
173
- root = root .get_right ()
182
+ def get_rightMost (root : my_node ) -> Any :
183
+ while True :
184
+ right_child = root .get_right ()
185
+ if right_child is None :
186
+ break
187
+ root = right_child
174
188
return root .get_data ()
175
189
176
190
177
- def get_leftMost (root ):
178
- while root .get_left () is not None :
179
- root = root .get_left ()
191
+ def get_leftMost (root : my_node ) -> Any :
192
+ while True :
193
+ left_child = root .get_left ()
194
+ if left_child is None :
195
+ break
196
+ root = left_child
180
197
return root .get_data ()
181
198
182
199
183
- def del_node (root , data ):
200
+ def del_node (root : my_node , data : Any ) -> Optional ["my_node" ]:
201
+ left_child = root .get_left ()
202
+ right_child = root .get_right ()
184
203
if root .get_data () == data :
185
- if root . get_left () is not None and root . get_right () is not None :
186
- temp_data = get_leftMost (root . get_right () )
204
+ if left_child is not None and right_child is not None :
205
+ temp_data = get_leftMost (right_child )
187
206
root .set_data (temp_data )
188
- root .set_right (del_node (root .get_right (), temp_data ))
189
- elif root .get_left () is not None :
190
- root = root .get_left ()
207
+ root .set_right (del_node (right_child , temp_data ))
208
+ elif left_child is not None :
209
+ root = left_child
210
+ elif right_child is not None :
211
+ root = right_child
191
212
else :
192
- root = root . get_right ()
213
+ return None
193
214
elif root .get_data () > data :
194
- if root . get_left () is None :
215
+ if left_child is None :
195
216
print ("No such data" )
196
217
return root
197
218
else :
198
- root .set_left (del_node (root . get_left () , data ))
199
- elif root .get_data () < data :
200
- if root . get_right () is None :
219
+ root .set_left (del_node (left_child , data ))
220
+ else : # root.get_data() < data
221
+ if right_child is None :
201
222
return root
202
223
else :
203
- root .set_right (del_node (root .get_right (), data ))
204
- if root is None :
205
- return root
206
- if get_height (root .get_right ()) - get_height (root .get_left ()) == 2 :
207
- if get_height (root .get_right ().get_right ()) > get_height (
208
- root .get_right ().get_left ()
209
- ):
224
+ root .set_right (del_node (right_child , data ))
225
+
226
+ if get_height (right_child ) - get_height (left_child ) == 2 :
227
+ assert right_child is not None
228
+ if get_height (right_child .get_right ()) > get_height (right_child .get_left ()):
210
229
root = left_rotation (root )
211
230
else :
212
231
root = rl_rotation (root )
213
- elif get_height (root .get_right ()) - get_height (root .get_left ()) == - 2 :
214
- if get_height (root .get_left ().get_left ()) > get_height (
215
- root .get_left ().get_right ()
216
- ):
232
+ elif get_height (right_child ) - get_height (left_child ) == - 2 :
233
+ assert left_child is not None
234
+ if get_height (left_child .get_left ()) > get_height (left_child .get_right ()):
217
235
root = right_rotation (root )
218
236
else :
219
237
root = lr_rotation (root )
@@ -256,25 +274,26 @@ class AVLtree:
256
274
*************************************
257
275
"""
258
276
259
- def __init__ (self ):
260
- self .root = None
277
+ def __init__ (self ) -> None :
278
+ self .root : Optional [ my_node ] = None
261
279
262
- def get_height (self ):
263
- # print("yyy")
280
+ def get_height (self ) -> int :
264
281
return get_height (self .root )
265
282
266
- def insert (self , data ) :
283
+ def insert (self , data : Any ) -> None :
267
284
print ("insert:" + str (data ))
268
285
self .root = insert_node (self .root , data )
269
286
270
- def del_node (self , data ) :
287
+ def del_node (self , data : Any ) -> None :
271
288
print ("delete:" + str (data ))
272
289
if self .root is None :
273
290
print ("Tree is empty!" )
274
291
return
275
292
self .root = del_node (self .root , data )
276
293
277
- def __str__ (self ): # a level traversale, gives a more intuitive look on the tree
294
+ def __str__ (
295
+ self ,
296
+ ) -> str : # a level traversale, gives a more intuitive look on the tree
278
297
output = ""
279
298
q = my_queue ()
280
299
q .push (self .root )
@@ -308,7 +327,7 @@ def __str__(self): # a level traversale, gives a more intuitive look on the tre
308
327
return output
309
328
310
329
311
- def _test ():
330
+ def _test () -> None :
312
331
import doctest
313
332
314
333
doctest .testmod ()
0 commit comments