@@ -7,34 +7,42 @@ class Node:
7
7
8
8
def __init__ (self , label ):
9
9
self .label = label
10
+ self ._parent = None
11
+ self ._left = None
12
+ self ._right = None
10
13
self .height = 0
11
14
12
15
@property
13
16
def right (self ):
14
- return self .right
17
+ return self ._right
15
18
16
19
@right .setter
17
20
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
20
24
21
25
@property
22
26
def left (self ):
23
- return self .left
27
+ return self ._left
24
28
25
29
@left .setter
26
30
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
29
34
30
35
@property
31
36
def parent (self ):
32
- return self .parent
37
+ return self ._parent
33
38
34
39
@parent .setter
35
40
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
38
46
39
47
40
48
class AVL :
@@ -45,7 +53,7 @@ def __init__(self):
45
53
46
54
def insert (self , value ):
47
55
node = Node (value )
48
-
56
+
49
57
if self .root is None :
50
58
self .root = node
51
59
self .root .height = 0
@@ -65,65 +73,72 @@ def insert(self, value):
65
73
else :
66
74
curr_node = curr_node .right
67
75
else :
76
+ node .height = dad_node .height
77
+ dad_node .height += 1
68
78
if node .label < dad_node .label :
69
79
dad_node .left = node
70
80
else :
71
81
dad_node .right = node
72
-
73
- self .rebalance (dad_node )
82
+ self .rebalance (node )
74
83
self .size += 1
75
84
break
76
85
77
86
def rebalance (self , node ):
78
- height_right = 0
79
- height_left = 0
80
87
n = node
88
+
81
89
while n is not None :
82
- height_right = 0
83
- height_left = 0
90
+ height_right = n . height
91
+ height_left = n . height
84
92
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
87
95
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
90
98
91
99
if abs (height_left - height_right ) > 1 :
92
100
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 ):
95
108
self .rotate_left (n )
96
109
break
97
110
else :
98
111
self .double_rotate_right (n )
99
112
break
100
113
else :
101
- right_child = node .right
114
+ right_child = n .right
102
115
if right_child is not None :
103
116
h_right = (right_child .right .height
104
117
if (right_child .right is not None ) else 0 )
105
118
h_left = (right_child .left .height
106
119
if (right_child .left is not None ) else 0 )
107
-
108
120
if (h_left > h_right ):
109
121
self .double_rotate_left (n )
110
122
break
111
123
else :
112
124
self .rotate_right (n )
113
125
break
114
- n = n .getParent ()
126
+ n = n .parent
115
127
116
128
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
118
134
119
- def rotate_right (self , node ):
120
- aux = node .parent
121
- node .parent = node
122
- node .left = aux
123
135
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
127
142
128
143
def double_rotate_left (self , node ):
129
144
self .rotate_right (node .getRight ().getRight ())
@@ -140,96 +155,26 @@ def empty(self):
140
155
141
156
def preShow (self , curr_node ):
142
157
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 )
146
161
147
- def preorden (self , curr_node ):
162
+ def preorder (self , curr_node ):
148
163
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 = " " )
152
167
153
168
def getRoot (self ):
154
169
return self .root
155
170
156
171
t = 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())
174
172
t .insert (1 )
175
173
t .insert (2 )
176
174
t .insert (3 )
177
- # t.insert(4)
178
- # t.preShow(t.getRoot())
179
- # print("\n")
180
- # t.preorden(t.getRoot())
175
+ # t.preShow(t.root)
181
176
# print("\n")
177
+ # t.insert(4)
182
178
# 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