@@ -7,34 +7,42 @@ class Node:
77
88 def __init__ (self , label ):
99 self .label = label
10+ self ._parent = None
11+ self ._left = None
12+ self ._right = None
1013 self .height = 0
1114
1215 @property
1316 def right (self ):
14- return self .right
17+ return self ._right
1518
1619 @right .setter
1720 def right (self , node ):
18- node .parent = self
19- self .right = node
21+ if node is not None :
22+ node ._parent = self
23+ self ._right = node
2024
2125 @property
2226 def left (self ):
23- return self .left
27+ return self ._left
2428
2529 @left .setter
2630 def left (self , node ):
27- node .parent = self
28- self .left = node
31+ if node is not None :
32+ node ._parent = self
33+ self ._left = node
2934
3035 @property
3136 def parent (self ):
32- return self .parent
37+ return self ._parent
3338
3439 @parent .setter
3540 def parent (self , node ):
36- self .parent = node
37- self .height = self .parent .height + 1
41+ if node is not None :
42+ self ._parent = node
43+ self .height = self .parent .height + 1
44+ else :
45+ self .height = 0
3846
3947
4048class AVL :
@@ -45,7 +53,7 @@ def __init__(self):
4553
4654 def insert (self , value ):
4755 node = Node (value )
48-
56+
4957 if self .root is None :
5058 self .root = node
5159 self .root .height = 0
@@ -65,65 +73,72 @@ def insert(self, value):
6573 else :
6674 curr_node = curr_node .right
6775 else :
76+ node .height = dad_node .height
77+ dad_node .height += 1
6878 if node .label < dad_node .label :
6979 dad_node .left = node
7080 else :
7181 dad_node .right = node
72-
73- self .rebalance (dad_node )
82+ self .rebalance (node )
7483 self .size += 1
7584 break
7685
7786 def rebalance (self , node ):
78- height_right = 0
79- height_left = 0
8087 n = node
88+
8189 while n is not None :
82- height_right = 0
83- height_left = 0
90+ height_right = n . height
91+ height_left = n . height
8492
85- if node . getRight () is not None :
86- height_right = node . getRight (). getHeight ()
93+ if n . right is not None :
94+ height_right = n . right . height
8795
88- if node . getLeft () is not None :
89- height_left = node . getLeft (). getHeight ()
96+ if n . left is not None :
97+ height_left = n . left . height
9098
9199 if abs (height_left - height_right ) > 1 :
92100 if height_left > height_right :
93- # left_child = node.getRight()
94- if ():
101+ left_child = n .left
102+ if left_child is not None :
103+ h_right = (right_child .right .height
104+ if (right_child .right is not None ) else 0 )
105+ h_left = (right_child .left .height
106+ if (right_child .left is not None ) else 0 )
107+ if (h_left > h_right ):
95108 self .rotate_left (n )
96109 break
97110 else :
98111 self .double_rotate_right (n )
99112 break
100113 else :
101- right_child = node .right
114+ right_child = n .right
102115 if right_child is not None :
103116 h_right = (right_child .right .height
104117 if (right_child .right is not None ) else 0 )
105118 h_left = (right_child .left .height
106119 if (right_child .left is not None ) else 0 )
107-
108120 if (h_left > h_right ):
109121 self .double_rotate_left (n )
110122 break
111123 else :
112124 self .rotate_right (n )
113125 break
114- n = n .getParent ()
126+ n = n .parent
115127
116128 def rotate_left (self , node ):
117- pass
129+ aux = node .parent .label
130+ node .parent .label = node .label
131+ node .parent .right = Node (aux )
132+ node .parent .right .height = node .parent .height + 1
133+ node .parent .left = node .right
118134
119- def rotate_right (self , node ):
120- aux = node .parent
121- node .parent = node
122- node .left = aux
123135
124- print (node .parent .label )
125- print (node .parent .right .label )
126- print (node .parent .left .label )
136+ def rotate_right (self , node ):
137+ aux = node .parent .label
138+ node .parent .label = node .label
139+ node .parent .left = Node (aux )
140+ node .parent .left .height = node .parent .height + 1
141+ node .parent .right = node .right
127142
128143 def double_rotate_left (self , node ):
129144 self .rotate_right (node .getRight ().getRight ())
@@ -140,96 +155,26 @@ def empty(self):
140155
141156 def preShow (self , curr_node ):
142157 if curr_node is not None :
143- self .preShow (curr_node .getLeft () )
144- print (curr_node .getLabel () , end = " " )
145- self .preShow (curr_node .getRight () )
158+ self .preShow (curr_node .left )
159+ print (curr_node .label , end = " " )
160+ self .preShow (curr_node .right )
146161
147- def preorden (self , curr_node ):
162+ def preorder (self , curr_node ):
148163 if curr_node is not None :
149- self .preShow (curr_node .getLeft () )
150- self .preShow (curr_node .getRight () )
151- print (curr_node .getLabel () , end = " " )
164+ self .preShow (curr_node .left )
165+ self .preShow (curr_node .right )
166+ print (curr_node .label , end = " " )
152167
153168 def getRoot (self ):
154169 return self .root
155170
156171t = AVL ()
157- # t.insert(1)
158- # t.preShow(t.getRoot())
159- # print("\n")
160- # t.preorden(t.getRoot())
161- # print("\n")
162- # t.insert(2)
163- # t.preShow(t.getRoot())
164- # print("\n")
165- # t.preorden(t.getRoot())
166- # print("\n")
167- # t.insert(3)
168- # t.preShow(t.getRoot())
169- # print("\n")
170- # t.preorden(t.getRoot())
171- # print("\n")
172- # print(t.getRoot().getHeight())
173- # print(t.getRoot().getRight().getHeight())
174172t .insert (1 )
175173t .insert (2 )
176174t .insert (3 )
177- # t.insert(4)
178- # t.preShow(t.getRoot())
179- # print("\n")
180- # t.preorden(t.getRoot())
175+ # t.preShow(t.root)
181176# print("\n")
177+ # t.insert(4)
182178# t.insert(5)
183- # t.preShow(t.getRoot())
184- # print("\n")
185- # t.preorden(t.getRoot())
186- # print("\n")
187- # t.insert(6)
188- # t.preShow(t.getRoot())
189- # print("\n")
190- # t.preorden(t.getRoot())
191- # print("\n")
192- # t.insert(7)
193- # t.preShow(t.getRoot())
194- # print("\n")
195- # t.preorden(t.getRoot())
196- # print("\n")
197- # t.insert(8)
198- # t.preShow(t.getRoot())
199- # print("\n")
200- # t.preorden(t.getRoot())
201- # print("\n")
202- # t.insert(9)
203- # t.preShow(t.getRoot())
204- # print("\n")
205- # t.preorden(t.getRoot())
206- # print("\n")
207- # t.insert(10)
208- # t.preShow(t.getRoot())
209- # print("\n")
210- # t.preorden(t.getRoot())
211- # print("\n")
212- # t.insert(11)
213- # t.preShow(t.getRoot())
214- # print("\n")
215- # t.preorden(t.getRoot())
216- # print("\n")
217- # t.insert(12)
218- # t.preShow(t.getRoot())
219- # print("\n")
220- # t.preorden(t.getRoot())
221- # print("\n")
222- # t.insert(13)
223- # t.preShow(t.getRoot())
224- # print("\n")
225- # t.preorden(t.getRoot())
226- # print("\n")
227- # t.insert(14)
228- # t.preShow(t.getRoot())
229- # print("\n")
230- # t.preorden(t.getRoot())
231- # print("\n")
232- # t.insert(15)
233- # t.preShow(t.getRoot())
234- # print("\n")
235- # t.preorden(t.getRoot())
179+ # t.preShow(t.root)
180+ # t.preorden(t.root)
0 commit comments