@@ -7,40 +7,42 @@ class Node:
77
88 def __init__ (self , label ):
99 self .label = label
10- self .left = None
11- self .rigt = None
12- self .parent = None
10+ self ._parent = None
11+ self ._left = None
12+ self ._right = None
1313 self .height = 0
1414
15- def getLabel (self ):
16- return self .label
17-
18- def setLabel (self , label ):
19- self .label = label
20-
21- def getLeft (self ):
22- return self .left
23-
24- def setLeft (self , left ):
25- self .left = left
26-
27- def getRight (self ):
28- return self .rigt
29-
30- def setRight (self , right ):
31- self .rigt = right
32-
33- def getParent (self ):
34- return self .parent
35-
36- def setParent (self , parent ):
37- self .parent = parent
38-
39- def setHeight (self , height ):
40- self .height = height
41-
42- def getHeight (self , height ):
43- return self .height
15+ @property
16+ def right (self ):
17+ return self ._right
18+
19+ @right .setter
20+ def right (self , node ):
21+ if node is not None :
22+ node ._parent = self
23+ self ._right = node
24+
25+ @property
26+ def left (self ):
27+ return self ._left
28+
29+ @left .setter
30+ def left (self , node ):
31+ if node is not None :
32+ node ._parent = self
33+ self ._left = node
34+
35+ @property
36+ def parent (self ):
37+ return self ._parent
38+
39+ @parent .setter
40+ def parent (self , node ):
41+ if node is not None :
42+ self ._parent = node
43+ self .height = self .parent .height + 1
44+ else :
45+ self .height = 0
4446
4547
4648class AVL :
@@ -51,8 +53,10 @@ def __init__(self):
5153
5254 def insert (self , value ):
5355 node = Node (value )
56+
5457 if self .root is None :
5558 self .root = node
59+ self .root .height = 0
5660 self .size = 1
5761 else :
5862 # Same as Binary Tree
@@ -64,63 +68,77 @@ def insert(self, value):
6468
6569 dad_node = curr_node
6670
67- if node .getLabel () < curr_node .getLabel () :
68- curr_node = curr_node .getLeft ()
71+ if node .label < curr_node .label :
72+ curr_node = curr_node .left
6973 else :
70- curr_node = curr_node .getRight ()
74+ curr_node = curr_node .right
7175 else :
72- if node .getLabel () < dad_node .getLabel ():
73- dad_node .setLeft (node )
74- dad_node .setHeight (dad_node .getHeight () + 1 )
75-
76- if (dad_node .getRight ().getHeight () -
77- dad_node .getLeft .getHeight () > 1 ):
78- self .rebalance (dad_node )
79-
76+ node .height = dad_node .height
77+ dad_node .height += 1
78+ if node .label < dad_node .label :
79+ dad_node .left = node
8080 else :
81- dad_node .setRight (node )
82- dad_node .setHeight (dad_node .getHeight () + 1 )
83-
84- if (dad_node .getRight ().getHeight () -
85- dad_node .getLeft .getHeight () > 1 ):
86- self .rebalance (dad_node )
81+ dad_node .right = node
82+ self .rebalance (node )
83+ self .size += 1
8784 break
8885
8986 def rebalance (self , node ):
90- if (node .getRight ().getHeight () -
91- node .getLeft .getHeight () > 1 ):
92- if (node .getRight ().getHeight () >
93- node .getLeft .getHeight ()):
94- pass
95- else :
96- pass
97- pass
98- elif (node .getRight ().getHeight () -
99- node .getLeft .getHeight () > 2 ):
100- if (node .getRight ().getHeight () >
101- node .getLeft .getHeight ()):
102- pass
103- else :
104- pass
105- pass
106- pass
87+ n = node
88+
89+ while n is not None :
90+ height_right = n .height
91+ height_left = n .height
92+
93+ if n .right is not None :
94+ height_right = n .right .height
95+
96+ if n .left is not None :
97+ height_left = n .left .height
98+
99+ if abs (height_left - height_right ) > 1 :
100+ if height_left > height_right :
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 ):
108+ self .rotate_left (n )
109+ break
110+ else :
111+ self .double_rotate_right (n )
112+ break
113+ else :
114+ right_child = n .right
115+ if right_child is not None :
116+ h_right = (right_child .right .height
117+ if (right_child .right is not None ) else 0 )
118+ h_left = (right_child .left .height
119+ if (right_child .left is not None ) else 0 )
120+ if (h_left > h_right ):
121+ self .double_rotate_left (n )
122+ break
123+ else :
124+ self .rotate_right (n )
125+ break
126+ n = n .parent
107127
108128 def rotate_left (self , node ):
109- # TODO: is this pythonic enought?
110- aux = node .getLabel ()
111- node = aux .getRight ()
112- node .setHeight (node .getHeight () - 1 )
113- node .setLeft (Node (aux ))
114- node .getLeft ().setHeight (node .getHeight () + 1 )
115- node .getRight ().setHeight (node .getRight ().getHeight () - 1 )
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
134+
116135
117136 def rotate_right (self , node ):
118- aux = node .getLabel ()
119- node = aux .getLeft ()
120- node .setHeight (node .getHeight () - 1 )
121- node .setRight (Node (aux ))
122- node .getLeft ().setHeight (node .getHeight () + 1 )
123- node .getLeft ().setHeight (node .getLeft ().getHeight () - 1 )
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
124142
125143 def double_rotate_left (self , node ):
126144 self .rotate_right (node .getRight ().getRight ())
@@ -129,3 +147,34 @@ def double_rotate_left(self, node):
129147 def double_rotate_right (self , node ):
130148 self .rotate_left (node .getLeft ().getLeft ())
131149 self .rotate_right (node )
150+
151+ def empty (self ):
152+ if self .root is None :
153+ return True
154+ return False
155+
156+ def preShow (self , curr_node ):
157+ if curr_node is not None :
158+ self .preShow (curr_node .left )
159+ print (curr_node .label , end = " " )
160+ self .preShow (curr_node .right )
161+
162+ def preorder (self , curr_node ):
163+ if curr_node is not None :
164+ self .preShow (curr_node .left )
165+ self .preShow (curr_node .right )
166+ print (curr_node .label , end = " " )
167+
168+ def getRoot (self ):
169+ return self .root
170+
171+ t = AVL ()
172+ t .insert (1 )
173+ t .insert (2 )
174+ t .insert (3 )
175+ # t.preShow(t.root)
176+ # print("\n")
177+ # t.insert(4)
178+ # t.insert(5)
179+ # t.preShow(t.root)
180+ # t.preorden(t.root)
0 commit comments