Skip to content

Commit 6903d95

Browse files
committed
AVL done
1 parent 8e41aca commit 6903d95

File tree

1 file changed

+59
-114
lines changed

1 file changed

+59
-114
lines changed

data_structures/AVL/AVL.py

+59-114
Original file line numberDiff line numberDiff line change
@@ -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

4048
class 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

156171
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())
174172
t.insert(1)
175173
t.insert(2)
176174
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)
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

Comments
 (0)