forked from hofmannol/AlgoDatSoSe25
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
from vorlesung.L05_binaere_baeume.avl_tree_node import AVLTreeNode
|
|
from vorlesung.L05_binaere_baeume.bin_tree import BinaryTree
|
|
|
|
|
|
class AVLTree(BinaryTree):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
def new_node(self, value):
|
|
return AVLTreeNode(value)
|
|
|
|
|
|
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
|
|
# self.check_circle(self.root)
|
|
|
|
def insert(self, value):
|
|
node, parent = super().insert(value)
|
|
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 check_circle(self, node: AVLTreeNode, check_nodes = []):
|
|
if node is None:
|
|
return
|
|
if id(node) in check_nodes:
|
|
print("Circle detected")
|
|
return
|
|
self.check_circle(node.left, check_nodes + [id(node)])
|
|
self.check_circle(node.right, check_nodes + [id(node)])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
def print_node(node, indent=0, level=0):
|
|
print((indent * 3) * " ", node.value)
|
|
|
|
tree = AVLTree()
|
|
values = [5, 3, 7, 2, 4, 6, 5, 8]
|
|
|
|
for value in values:
|
|
tree.insert(value)
|
|
|
|
|
|
print("In-order traversal:")
|
|
tree.in_order_traversal(print_node)
|
|
print("\nLevel-order traversal:")
|
|
tree.level_order_traversal(print_node)
|
|
print("\nTree structure traversal:")
|
|
tree.tree_structure_traversal(print_node)
|
|
print("\nGraph traversal:")
|
|
tree.graph_traversal()
|
|
|
|
tree.insert(9)
|
|
tree.graph_traversal()
|
|
|
|
print("\nDeleting 5:")
|
|
tree.delete(5)
|
|
|
|
print("In-order traversal after deletion:")
|
|
tree.in_order_traversal(print_node)
|
|
print("\nLevel-order traversal after deletion:")
|
|
tree.level_order_traversal(print_node)
|
|
print("\nTree structure traversal after deletion:")
|
|
tree.tree_structure_traversal(print_node)
|