2026-03-30 13:09:16 +02:00

82 lines
2.2 KiB
Python

from vorlesung.L05_binaere_baeume.avl_tree_node import AVLTreeNode
from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree
from utils.algo_context import AlgoContext
from utils.algo_array import Array
class AVLTree(BinaryTree):
def __init__(self, ctx: AlgoContext):
super().__init__(ctx)
def new_node(self, value):
return AVLTreeNode(value, self.ctx)
def balance(self, node: AVLTreeNode):
node.update_balance()
if node.balance == -2:
if node.left.balance <= 0:
node = node.right_rotate()
else:
node = node.left_right_rotate()
elif node.balance == 2:
if node.right.balance >= 0:
node = node.left_rotate()
else:
node = node.right_left_rotate()
if node.parent:
self.balance(node.parent)
else:
self.root = node
def insert(self, value):
insert_generator = self.insert_stepwise(value)
node, parent = None, None
while True:
try:
node, parent = next(insert_generator)
except StopIteration:
break
return node, parent
def insert_stepwise(self, value):
node, parent = super().insert(value)
yield None, None
node.parent = parent
if parent:
self.balance(parent)
return node, parent
def delete(self, value):
node, parent = super().delete(value)
if node:
node.parent = parent
if parent:
self.balance(parent)
def graph_filename(self):
return "AVLTree"
if __name__ == "__main__":
ctx = AlgoContext()
tree = AVLTree(ctx)
values = Array.from_file("data/seq2.txt", ctx)
for cell in values:
tree.insert(cell.value)
def print_node(node, indent=0, level=0):
print((indent * 3) * " ", node.value)
print("In-order traversal:")
tree.in_order_traversal(print_node)
print("\nTree structure traversal:")
tree.tree_structure_traversal(print_node)
tree.insert(9)
print("\nDeleting 5:")
tree.delete(5)
print("In-order traversal after deletion:")
tree.in_order_traversal(print_node)