@@ -23,18 +23,24 @@ def getLeft(self):
23
23
24
24
def setLeft (self , left ):
25
25
self .left = left
26
-
26
+ self .left .setParent (self )
27
+ self .left .setHeight (self .height + 1 )
28
+
27
29
def getRight (self ):
28
30
return self .rigt
29
31
30
32
def setRight (self , right ):
31
33
self .rigt = right
34
+ self .rigt .setParent (self )
35
+ self .rigt .setHeight (self .height + 1 )
32
36
33
37
def getParent (self ):
34
38
return self .parent
35
39
36
40
def setParent (self , parent ):
37
41
self .parent = parent
42
+ self .height = (self .parent .getHeight () + 1 if
43
+ (self .parent is not None ) else 0 )
38
44
39
45
def setHeight (self , height ):
40
46
self .height = height
@@ -53,6 +59,7 @@ def insert(self, value):
53
59
node = Node (value )
54
60
if self .root is None :
55
61
self .root = node
62
+ self .root .setHeight (0 )
56
63
self .size = 1
57
64
else :
58
65
# Same as Binary Tree
@@ -71,54 +78,59 @@ def insert(self, value):
71
78
else :
72
79
if node .getLabel () < dad_node .getLabel ():
73
80
dad_node .setLeft (node )
74
- dad_node .setHeight (dad_node .getHeight () + 1 )
75
81
else :
76
82
dad_node .setRight (node )
77
- dad_node . setHeight (dad_node . getHeight () + 1 )
83
+ self . rebalance (dad_node )
78
84
break
79
85
80
86
def rebalance (self , node ):
81
87
height_right = 0
82
88
height_left = 0
83
-
84
- if node . getRight () is not None :
85
- height_right = node . getRight (). getHeight ()
86
-
87
- if node . getLeft () is not None :
88
- height_left = node .getLeft (). getHeight ()
89
-
90
- if abs ( height_left - height_right ) > 1 :
91
- if height_left > height_right :
92
- right_child = node .getRight ()
93
- if ( right_child . getLeft (). getHeight () >
94
- right_child . getRight (). getHeight ()) :
95
- self . rotate_left ( node )
96
- else :
97
- self . double_rotate_right ( node )
98
- else :
99
- left_child = node . getLeft ()
100
- if ( left_child . getLeft (). getHeight () >
101
- left_child . getRight (). getHeight ()):
102
- self . double_rotate_left ( node )
89
+ n = node
90
+ while n is not None :
91
+ height_right = 0
92
+ height_left = 0
93
+
94
+ if node .getRight () is not None :
95
+ height_right = node . getRight (). getHeight ()
96
+
97
+ if node . getLeft () is not None :
98
+ height_left = node .getLeft (). getHeight ()
99
+
100
+ if abs ( height_left - height_right ) > 1 :
101
+ if height_left > height_right :
102
+ left_child = node . getRight ()
103
+ if ():
104
+ self . rotate_left ( n )
105
+ break
106
+ else :
107
+ self . double_rotate_right ( n )
108
+ break
103
109
else :
104
- self .rotate_right (node )
110
+ right_child = node .getRight ()
111
+ if right_child is not None :
112
+ h_right = (right_child .getRight ().getHeight ()
113
+ if (right_child .getRight () is not None ) else 0 )
114
+ h_left = (right_child .getLeft ().getHeight ()
115
+ if (right_child .getLeft () is not None ) else 0 )
116
+
117
+ if (h_left > h_right ):
118
+ self .double_rotate_left (n )
119
+ break
120
+ else :
121
+ self .rotate_right (n )
122
+ print (n .getLabel ())
123
+ break
124
+ n = n .getParent ()
105
125
106
126
def rotate_left (self , node ):
107
- # TODO: is this pythonic enought?
108
- aux = node .getLabel ()
109
- node = aux .getRight ()
110
- node .setHeight (node .getHeight () - 1 )
111
- node .setLeft (Node (aux ))
112
- node .getLeft ().setHeight (node .getHeight () + 1 )
113
- node .getRight ().setHeight (node .getRight ().getHeight () - 1 )
127
+ pass
114
128
115
129
def rotate_right (self , node ):
116
- aux = node .getLabel ()
117
- node = aux .getLeft ()
118
- node .setHeight (node .getHeight () - 1 )
119
- node .setRight (Node (aux ))
120
- node .getLeft ().setHeight (node .getHeight () + 1 )
121
- node .getLeft ().setHeight (node .getLeft ().getHeight () - 1 )
130
+ n = Node (node .getLabel ())
131
+ n .setRight (node .getRight ())
132
+ n .setLeft (Node (node .getParent ().getLabel ()))
133
+ node = n
122
134
123
135
def double_rotate_left (self , node ):
124
136
self .rotate_right (node .getRight ().getRight ())
@@ -139,23 +151,92 @@ def preShow(self, curr_node):
139
151
print (curr_node .getLabel (), end = " " )
140
152
self .preShow (curr_node .getRight ())
141
153
154
+ def preorden (self , curr_node ):
155
+ if curr_node is not None :
156
+ self .preShow (curr_node .getLeft ())
157
+ self .preShow (curr_node .getRight ())
158
+ print (curr_node .getLabel (), end = " " )
159
+
142
160
def getRoot (self ):
143
161
return self .root
144
162
145
163
t = AVL ()
146
- t .insert (11 )
147
- t .insert (14 )
148
- t .insert (3 )
149
- t .insert (4 )
150
- t .insert (5 )
151
- t .insert (6 )
152
- t .insert (7 )
153
- t .insert (8 )
154
- t .insert (9 )
155
- t .insert (10 )
164
+ # t.insert(1)
165
+ # t.preShow(t.getRoot())
166
+ # print("\n")
167
+ # t.preorden(t.getRoot())
168
+ # print("\n")
169
+ # t.insert(2)
170
+ # t.preShow(t.getRoot())
171
+ # print("\n")
172
+ # t.preorden(t.getRoot())
173
+ # print("\n")
174
+ # t.insert(3)
175
+ # t.preShow(t.getRoot())
176
+ # print("\n")
177
+ # t.preorden(t.getRoot())
178
+ # print("\n")
179
+ # print(t.getRoot().getHeight())
180
+ # print(t.getRoot().getRight().getHeight())
156
181
t .insert (1 )
157
- t .insert (12 )
158
- t .insert (13 )
159
182
t .insert (2 )
160
- t .insert (15 )
161
- t .preShow (t .getRoot ())
183
+ t .insert (3 )
184
+ # t.insert(4)
185
+ # t.preShow(t.getRoot())
186
+ # print("\n")
187
+ # t.preorden(t.getRoot())
188
+ # print("\n")
189
+ # t.insert(5)
190
+ # t.preShow(t.getRoot())
191
+ # print("\n")
192
+ # t.preorden(t.getRoot())
193
+ # print("\n")
194
+ # t.insert(6)
195
+ # t.preShow(t.getRoot())
196
+ # print("\n")
197
+ # t.preorden(t.getRoot())
198
+ # print("\n")
199
+ # t.insert(7)
200
+ # t.preShow(t.getRoot())
201
+ # print("\n")
202
+ # t.preorden(t.getRoot())
203
+ # print("\n")
204
+ # t.insert(8)
205
+ # t.preShow(t.getRoot())
206
+ # print("\n")
207
+ # t.preorden(t.getRoot())
208
+ # print("\n")
209
+ # t.insert(9)
210
+ # t.preShow(t.getRoot())
211
+ # print("\n")
212
+ # t.preorden(t.getRoot())
213
+ # print("\n")
214
+ # t.insert(10)
215
+ # t.preShow(t.getRoot())
216
+ # print("\n")
217
+ # t.preorden(t.getRoot())
218
+ # print("\n")
219
+ # t.insert(11)
220
+ # t.preShow(t.getRoot())
221
+ # print("\n")
222
+ # t.preorden(t.getRoot())
223
+ # print("\n")
224
+ # t.insert(12)
225
+ # t.preShow(t.getRoot())
226
+ # print("\n")
227
+ # t.preorden(t.getRoot())
228
+ # print("\n")
229
+ # t.insert(13)
230
+ # t.preShow(t.getRoot())
231
+ # print("\n")
232
+ # t.preorden(t.getRoot())
233
+ # print("\n")
234
+ # t.insert(14)
235
+ # t.preShow(t.getRoot())
236
+ # print("\n")
237
+ # t.preorden(t.getRoot())
238
+ # print("\n")
239
+ # t.insert(15)
240
+ # t.preShow(t.getRoot())
241
+ # print("\n")
242
+ # t.preorden(t.getRoot())
0 commit comments