Skip to content

Commit 67f23f5

Browse files
committed
rotate left almost working
1 parent 8384cbb commit 67f23f5

File tree

1 file changed

+132
-51
lines changed

1 file changed

+132
-51
lines changed

data_structures/AVL/AVL.py

+132-51
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,24 @@ def getLeft(self):
2323

2424
def setLeft(self, left):
2525
self.left = left
26-
26+
self.left.setParent(self)
27+
self.left.setHeight(self.height + 1)
28+
2729
def getRight(self):
2830
return self.rigt
2931

3032
def setRight(self, right):
3133
self.rigt = right
34+
self.rigt.setParent(self)
35+
self.rigt.setHeight(self.height + 1)
3236

3337
def getParent(self):
3438
return self.parent
3539

3640
def setParent(self, parent):
3741
self.parent = parent
42+
self.height = (self.parent.getHeight() + 1 if
43+
(self.parent is not None) else 0)
3844

3945
def setHeight(self, height):
4046
self.height = height
@@ -53,6 +59,7 @@ def insert(self, value):
5359
node = Node(value)
5460
if self.root is None:
5561
self.root = node
62+
self.root.setHeight(0)
5663
self.size = 1
5764
else:
5865
# Same as Binary Tree
@@ -71,54 +78,59 @@ def insert(self, value):
7178
else:
7279
if node.getLabel() < dad_node.getLabel():
7380
dad_node.setLeft(node)
74-
dad_node.setHeight(dad_node.getHeight() + 1)
7581
else:
7682
dad_node.setRight(node)
77-
dad_node.setHeight(dad_node.getHeight() + 1)
83+
self.rebalance(dad_node)
7884
break
7985

8086
def rebalance(self, node):
8187
height_right = 0
8288
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
103109
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()
105125

106126
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
114128

115129
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
122134

123135
def double_rotate_left(self, node):
124136
self.rotate_right(node.getRight().getRight())
@@ -139,23 +151,92 @@ def preShow(self, curr_node):
139151
print(curr_node.getLabel(), end=" ")
140152
self.preShow(curr_node.getRight())
141153

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+
142160
def getRoot(self):
143161
return self.root
144162

145163
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())
156181
t.insert(1)
157-
t.insert(12)
158-
t.insert(13)
159182
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

Comments
 (0)