Skip to content

Commit 0196e75

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 8fb7946 commit 0196e75

1 file changed

Lines changed: 53 additions & 38 deletions

File tree

data_structures/binary_tree/avl_tree.py

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import doctest
1212
from typing import Any
1313

14+
1415
class MyQueue:
1516
def __init__(self) -> None:
1617
self.data: list[Any] = []
@@ -28,42 +29,46 @@ def pop(self) -> Any:
2829
self.head += 1
2930
return ret
3031

32+
3133
class MyNode:
3234
def __init__(self, data: Any) -> None:
3335
self.data = data
3436
self.left = self.right = None
3537
self.height = 1
3638

37-
def get_data(self) -> Any:
39+
def get_data(self) -> Any:
3840
return self.data
39-
40-
def get_left(self) -> MyNode | None:
41+
42+
def get_left(self) -> MyNode | None:
4143
return self.left
42-
43-
def get_right(self) -> MyNode | None:
44+
45+
def get_right(self) -> MyNode | None:
4446
return self.right
45-
46-
def get_height(self) -> int:
47+
48+
def get_height(self) -> int:
4749
return self.height
48-
49-
def set_data(self, data: Any) -> None:
50+
51+
def set_data(self, data: Any) -> None:
5052
self.data = data
51-
52-
def set_left(self, node: MyNode | None) -> None:
53+
54+
def set_left(self, node: MyNode | None) -> None:
5355
self.left = node
54-
55-
def set_right(self, node: MyNode | None) -> None:
56+
57+
def set_right(self, node: MyNode | None) -> None:
5658
self.right = node
57-
58-
def set_height(self, height: int) -> None:
59+
60+
def set_height(self, height: int) -> None:
5961
self.height = height
6062

61-
def get_height(node: MyNode | None) -> int:
63+
64+
def get_height(node: MyNode | None) -> int:
6265
return node.height if node else 0
6366

64-
def my_max(a: int, b: int) -> int:
67+
68+
def my_max(a: int, b: int) -> int:
6569
return a if a > b else b
6670

71+
6772
def right_rotation(node: MyNode) -> MyNode:
6873
print("left rotation node:", node.data)
6974
ret = node.left
@@ -73,6 +78,7 @@ def right_rotation(node: MyNode) -> MyNode:
7378
ret.height = my_max(get_height(ret.right), get_height(ret.left)) + 1
7479
return ret
7580

81+
7682
def left_rotation(node: MyNode) -> MyNode:
7783
print("right rotation node:", node.data)
7884
ret = node.right
@@ -82,18 +88,21 @@ def left_rotation(node: MyNode) -> MyNode:
8288
ret.height = my_max(get_height(ret.right), get_height(ret.left)) + 1
8389
return ret
8490

91+
8592
def lr_rotation(node: MyNode) -> MyNode:
8693
node.left = left_rotation(node.left)
8794
return right_rotation(node)
8895

96+
8997
def rl_rotation(node: MyNode) -> MyNode:
9098
node.right = right_rotation(node.right)
9199
return left_rotation(node)
92100

101+
93102
def insert_node(node: MyNode | None, data: Any) -> MyNode | None:
94103
if not node:
95104
return MyNode(data)
96-
105+
97106
if data < node.data:
98107
node.left = insert_node(node.left, data)
99108
if get_height(node.left) - get_height(node.right) == 2:
@@ -108,15 +117,17 @@ def insert_node(node: MyNode | None, data: Any) -> MyNode | None:
108117
node = rl_rotation(node)
109118
else:
110119
node = left_rotation(node)
111-
120+
112121
node.height = my_max(get_height(node.right), get_height(node.left)) + 1
113122
return node
114123

124+
115125
def get_extreme(root: MyNode, is_right: bool) -> Any:
116-
while (child := root.right if is_right else root.left):
126+
while child := root.right if is_right else root.left:
117127
root = child
118128
return root.data
119129

130+
120131
def del_node(root: MyNode, data: Any) -> MyNode | None:
121132
if root.data == data:
122133
if root.left and root.right:
@@ -130,11 +141,11 @@ def del_node(root: MyNode, data: Any) -> MyNode | None:
130141
root.left = del_node(root.left, data)
131142
else:
132143
root.right = del_node(root.right, data)
133-
144+
134145
# Handle balancing
135146
right_height = get_height(root.right)
136147
left_height = get_height(root.left)
137-
148+
138149
if right_height - left_height == 2:
139150
if get_height(root.right.right) > get_height(root.right.left):
140151
root = left_rotation(root)
@@ -145,68 +156,72 @@ def del_node(root: MyNode, data: Any) -> MyNode | None:
145156
root = right_rotation(root)
146157
else:
147158
root = lr_rotation(root)
148-
159+
149160
root.height = my_max(get_height(root.right), get_height(root.left)) + 1
150161
return root
162+
163+
151164
class AVLtree:
152-
def __init__(self) -> None:
165+
def __init__(self) -> None:
153166
self.root = None
154-
155-
def get_height(self) -> int:
167+
168+
def get_height(self) -> int:
156169
return get_height(self.root)
157-
170+
158171
def insert(self, data: Any) -> None:
159172
print(f"insert:{data}")
160173
self.root = insert_node(self.root, data)
161-
174+
162175
def del_node(self, data: Any) -> None:
163176
print(f"delete:{data}")
164177
if not self.root:
165178
return
166179
self.root = del_node(self.root, data)
167-
180+
168181
def __str__(self) -> str:
169182
if not self.root:
170183
return ""
171184
q, output, layer, cnt = MyQueue(), "", self.get_height(), 0
172185
q.push(self.root)
173-
186+
174187
while not q.is_empty():
175188
node = q.pop()
176-
space = " " * int(2**(layer-1))
189+
space = " " * int(2 ** (layer - 1))
177190
output += space + (str(node.data) if node else "*") + space
178191
cnt += 1
179-
192+
180193
if node:
181194
q.push(node.left)
182195
q.push(node.right)
183196
else:
184197
q.push(None)
185198
q.push(None)
186-
199+
187200
for i in range(10):
188201
if cnt == 2**i - 1:
189202
layer -= 1
190203
output += "\n"
191204
if layer == 0:
192205
break
193206
break
194-
195-
return output + "\n" + "*"*36
196207

197-
def _test() -> None:
208+
return output + "\n" + "*" * 36
209+
210+
211+
def _test() -> None:
198212
doctest.testmod()
199213

214+
200215
if __name__ == "__main__":
201216
_test()
202217
t = AVLtree()
203218
lst = list(range(10))
204219
random.shuffle(lst)
205-
220+
206221
for i in lst:
207222
t.insert(i)
208223
print(t)
209-
224+
210225
random.shuffle(lst)
211226
for i in lst:
212227
t.del_node(i)

0 commit comments

Comments
 (0)