Skip to content

Commit 44ad272

Browse files
Merge pull request #2 from TheAlgorithms/master
merge from main.
2 parents 1f8693d + 535cbb7 commit 44ad272

14 files changed

+581
-205
lines changed

Diff for: data_structures/AVL/AVL.py

+128-79
Original file line numberDiff line numberDiff line change
@@ -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

4648
class 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)

Diff for: data_structures/Binary Tree/binary_seach_tree.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def empty(self):
6868
return False
6969

7070
def preShow(self, curr_node):
71-
if curr_node is None:
71+
if curr_node is not None:
7272
print(curr_node.getLabel(), end=" ")
7373

7474
self.preShow(curr_node.getLeft())

Diff for: data_structures/Stacks/Balanced_Parentheses.py

-27
This file was deleted.

Diff for: data_structures/Stacks/Infix_To_Postfix_Conversion.py

-48
This file was deleted.

Diff for: data_structures/Stacks/Stack.py

-50
This file was deleted.

0 commit comments

Comments
 (0)