3
3
An auto-balanced binary tree!
4
4
'''
5
5
import math
6
+ import random
6
7
class my_queue :
7
8
def __init__ (self ):
8
9
self .data = []
@@ -65,6 +66,7 @@ def my_max(a,b):
65
66
66
67
67
68
def leftrotation (node ):
69
+ print ("left rotation node:" ,node .getdata ())
68
70
ret = node .getleft ()
69
71
node .setleft (ret .getright ())
70
72
ret .setright (node )
@@ -75,6 +77,7 @@ def leftrotation(node):
75
77
return ret
76
78
77
79
def rightrotation (node ):
80
+ print ("right rotation node:" ,node .getdata ())
78
81
ret = node .getright ()
79
82
node .setright (ret .getleft ())
80
83
ret .setleft (node )
@@ -113,34 +116,96 @@ def insert_node(node,data):
113
116
node .setheight (h1 )
114
117
return node
115
118
119
+ def getRightMost (root ):
120
+ while root .getright () is not None :
121
+ root = root .getright ()
122
+ return root .getdata ()
123
+ def getLeftMost (root ):
124
+ while root .getleft () is not None :
125
+ root = root .getleft ()
126
+ return root .getdata ()
127
+
128
+ def del_node (root ,data ):
129
+ if root .getdata () == data :
130
+ if root .getleft () is not None and root .getright () is not None :
131
+ temp_data = getLeftMost (root .getright ())
132
+ root .setdata (temp_data )
133
+ root .setright (del_node (root .getright (),temp_data ))
134
+ elif root .getleft () is not None :
135
+ root = root .getleft ()
136
+ else :
137
+ root = root .getright ()
138
+ elif root .getdata () > data :
139
+ if root .getleft () is None :
140
+ print ("No such data" )
141
+ return root
142
+ else :
143
+ root .setleft (del_node (root .getleft (),data ))
144
+ elif root .getdata () < data :
145
+ if root .getright () is None :
146
+ return root
147
+ else :
148
+ root .setright (del_node (root .getright (),data ))
149
+ if root is None :
150
+ return root
151
+ if getheight (root .getright ()) - getheight (root .getleft ()) == 2 :
152
+ if getheight (root .getright ().getright ()) > getheight (root .getright ().getleft ()):
153
+ root = rightrotation (root )
154
+ else :
155
+ root = lrrotation (root )
156
+ elif getheight (root .getright ()) - getheight (root .getleft ()) == - 2 :
157
+ if getheight (root .getleft ().getleft ()) > getheight (root .getleft ().getright ()):
158
+ root = leftrotation (root )
159
+ else :
160
+ root = rlrotation (root )
161
+ height = my_max (getheight (root .getright ()),getheight (root .getleft ())) + 1
162
+ root .setheight (height )
163
+ return root
164
+
116
165
class AVLtree :
117
166
def __init__ (self ):
118
167
self .root = None
119
168
def getheight (self ):
120
169
# print("yyy")
121
170
return getheight (self .root )
122
171
def insert (self ,data ):
172
+ print ("insert:" + str (data ))
123
173
self .root = insert_node (self .root ,data )
174
+
175
+ def del_node (self ,data ):
176
+ print ("delete:" + str (data ))
177
+ if self .root is None :
178
+ print ("Tree is empty!" )
179
+ return
180
+ self .root = del_node (self .root ,data )
124
181
def traversale (self ):
125
182
q = my_queue ()
126
183
q .push (self .root )
127
184
layer = self .getheight ()
185
+ if layer == 0 :
186
+ return
128
187
cnt = 0
129
188
while not q .isEmpty ():
130
189
node = q .pop ()
131
- space = " " * int (math .pow (2 ,layer ) - 1 )
132
- print (space ,end = " " )
190
+ space = " " * int (math .pow (2 ,layer - 1 ) )
191
+ print (space ,end = "" )
133
192
if node is None :
134
- print ("*" ,end = " " )
193
+ print ("*" ,end = "" )
194
+ q .push (None )
195
+ q .push (None )
135
196
else :
136
- print (node .getdata (),end = " " )
197
+ print (node .getdata (),end = "" )
137
198
q .push (node .getleft ())
138
199
q .push (node .getright ())
139
- print (space ,end = " " )
200
+ print (space ,end = "" )
140
201
cnt = cnt + 1
141
202
for i in range (100 ):
142
203
if cnt == math .pow (2 ,i ) - 1 :
143
204
layer = layer - 1
205
+ if layer == 0 :
206
+ print ()
207
+ print ("*************************************" )
208
+ return
144
209
print ()
145
210
break
146
211
print ()
@@ -168,27 +233,59 @@ def test(self):
168
233
t = AVLtree ()
169
234
t .traversale ()
170
235
# t.insert(7)
236
+ ## t.traversale()
237
+ #
238
+ # t.insert(8)
171
239
# t.traversale()
172
-
173
- t .insert (8 )
174
- t .traversale ()
175
- t .insert (3 )
176
- t .traversale ()
177
- t .insert (6 )
178
- t .traversale ()
179
- t .insert (1 )
180
- t .traversale ()
181
- t .insert (10 )
182
- t .traversale ()
183
- t .insert (14 )
184
- t .traversale ()
185
- t .insert (13 )
186
- t .traversale ()
240
+ # t.insert(3)
187
241
# t.traversale()
188
- t .insert (4 )
189
- t .traversale ()
190
- t .insert (7 )
191
- t .traversale ()
242
+ # t.insert(6)
243
+ # t.traversale()
244
+ # t.insert(1)
245
+ # t.traversale()
246
+ # t.insert(10)
247
+ # t.traversale()
248
+ # t.insert(14)
249
+ # t.traversale()
250
+ # t.insert(13)
251
+ # t.traversale()
252
+ ## t.traversale()
253
+ # t.insert(4)
254
+ # t.traversale()
255
+ # t.insert(7)
256
+ # t.traversale()
257
+ #
258
+ #
259
+ # t.del_node(8)
260
+ # t.traversale()
261
+ # t.del_node(3)
262
+ # t.traversale()
263
+ # t.del_node(6)
264
+ # t.traversale()
265
+ # t.del_node(1)
266
+ # t.traversale()
267
+ # t.del_node(10)
268
+ # t.traversale()
269
+ # t.del_node(14)
270
+ # t.traversale()
271
+ # t.del_node(13)
272
+ # t.traversale()
273
+ ## t.traversale()
274
+ # t.del_node(4)
275
+ # t.traversale()
276
+ # t.del_node(7)
277
+ # t.traversale()
278
+ l = list (range (10 ))
279
+ random .shuffle (l )
280
+ for i in l :
281
+ t .insert (i )
282
+ t .traversale ()
283
+
284
+ random .shuffle (l )
285
+ for i in l :
286
+ t .del_node (i )
287
+ t .traversale ()
288
+
192
289
193
290
194
291
0 commit comments