Skip to content

Commit 9f96c15

Browse files
committed
Update AVLtree.py
add delete function add demo with shuffled list add print lines to trace the addition or deletion
1 parent 6001215 commit 9f96c15

File tree

1 file changed

+121
-24
lines changed

1 file changed

+121
-24
lines changed

data_structures/binary tree/AVLtree.py

+121-24
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
An auto-balanced binary tree!
44
'''
55
import math
6+
import random
67
class my_queue:
78
def __init__(self):
89
self.data = []
@@ -65,6 +66,7 @@ def my_max(a,b):
6566

6667

6768
def leftrotation(node):
69+
print("left rotation node:",node.getdata())
6870
ret = node.getleft()
6971
node.setleft(ret.getright())
7072
ret.setright(node)
@@ -75,6 +77,7 @@ def leftrotation(node):
7577
return ret
7678

7779
def rightrotation(node):
80+
print("right rotation node:",node.getdata())
7881
ret = node.getright()
7982
node.setright(ret.getleft())
8083
ret.setleft(node)
@@ -113,34 +116,96 @@ def insert_node(node,data):
113116
node.setheight(h1)
114117
return node
115118

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+
116165
class AVLtree:
117166
def __init__(self):
118167
self.root = None
119168
def getheight(self):
120169
# print("yyy")
121170
return getheight(self.root)
122171
def insert(self,data):
172+
print("insert:"+str(data))
123173
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)
124181
def traversale(self):
125182
q = my_queue()
126183
q.push(self.root)
127184
layer = self.getheight()
185+
if layer == 0:
186+
return
128187
cnt = 0
129188
while not q.isEmpty():
130189
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 = "")
133192
if node is None:
134-
print("*",end = " ")
193+
print("*",end = "")
194+
q.push(None)
195+
q.push(None)
135196
else:
136-
print(node.getdata(),end = " ")
197+
print(node.getdata(),end = "")
137198
q.push(node.getleft())
138199
q.push(node.getright())
139-
print(space,end = " ")
200+
print(space,end = "")
140201
cnt = cnt + 1
141202
for i in range(100):
142203
if cnt == math.pow(2,i) - 1:
143204
layer = layer -1
205+
if layer == 0:
206+
print()
207+
print("*************************************")
208+
return
144209
print()
145210
break
146211
print()
@@ -168,27 +233,59 @@ def test(self):
168233
t = AVLtree()
169234
t.traversale()
170235
# t.insert(7)
236+
## t.traversale()
237+
#
238+
# t.insert(8)
171239
# 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)
187241
# 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+
192289

193290

194291

0 commit comments

Comments
 (0)