Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по АиСД 2023 / Baraeva_Elizaveta_lb3.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
130 Кб
Скачать

Тестирование.

Результаты тестирования представлены в табл. 1.

Таблица 1 – Результаты тестирования

№ п/п

Входные данные

Выходные данные

Комментарии

1.

root = main.Node(4)

root = main.insert(5, root)

root = main.insert(7, root)

root = main.insert(2, root)

root = main.insert(1, root)

root = main.insert(3, root)

a = main.delete_max_node(root)

print(a.val)

7

Проверка вставки.

Верно.

2.

root = Node(5)

print(diff(root))

inf

Проверка функции diff.

Верно.

3.

root = main.Node(23)

root.left = main.Node(15)

root.right = main.Node(56)

root.left.left = main.Node(43)

root.left.right = main.Node(24)

assert main.check(root)

ok

Проверка функции check.

Верно.

Вывод.

Были реализованы основные операции АВЛ-дерева, такие как вставка, удаление и балансировка. Исходя из проведённого исследования можно заметить логарифмическую зависимость времени операции от количества элементов в структуре данных.

ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ

Название файла: main.py

class Node:

def __init__(self, val, left=None, right=None):

self.val = val

self.left = left

self.right = right

def height(node):

if node is None:

return 0

return 1 + max(height(node.left), height(node.right))

def check(node):

if node is None:

return True

if abs(height(node.left) - height(node.right)) > 1:

return False

return check(node.left) and check(node.right)

def diff(root):

min_diff = float('inf')

if root is None:

return min_diff

if root.left is not None:

min_diff = min(min_diff, abs(root.val - root.left.val))

if root.right is not None:

min_diff = min(min_diff, abs(root.val - root.right.val))

min_diff = min(min_diff, diff(root.left))

min_diff = min(min_diff, diff(root.right))

return min_diff

def balance(node):

if node is None:

return 0

else:

return height(node.left) - height(node.right)

def min_val_node(node):

if node is None or node.left is None:

return node

else:

return min_val_node(node.left)

def right_rotate(node):

a = node.left

b = a.right

a.right = node

node.left = b

node.height = 1 + max(height(node.left), height(node.right))

a.height = 1 + max(height(a.left), height(a.right))

return a

def left_rotate(node):

a = node.right

b = a.left

a.left = node

node.right = b

node.height = 1 + max(height(node.left), height(node.right))

a.height = 1 + max(height(a.left), height(a.right))

return a

def insert(val, root):

if root is None:

return Node(val)

elif val <= root.val:

root.left = insert(val, root.left)

elif val > root.val:

root.right = insert(val, root.right)

root.height = 1 + max(height(root.left), height(root.right))

balance_coefficient = balance(root)

if balance_coefficient > 1 and root.left.val > val:

return right_rotate(root)

if balance_coefficient < -1 and val > root.right.val:

return left_rotate(root)

if balance_coefficient > 1 and val > root.left.val:

root.left = left_rotate(root.left)

return right_rotate(root)

if balance_coefficient < -1 and val < root.right.val:

root.right = right_rotate(root.right)

return left_rotate(root)

return root

def delete(val, node):

if node is None:

return node

elif val < node.val:

node.left = delete(val, node.left)

elif val > node.val:

node.right = delete(val, node.right)

else:

if node.left is None and node.right is None:

temp = node

node = None

return temp

if node.left is None:

return node.right

elif node.right is None:

return node.left

rgt = min_val_node(node.right)

node.value = rgt.value

node.right = delete(rgt.value, node.right)

if node is None:

return node

node.height = 1 + max(height(node.left), height(node.right))

balance_coefficient = balance(node)

if balance_coefficient > 1 and balance(node.left) >= 0:

return right_rotate(node)

if balance_coefficient < -1 and balance(node.right) <= 0:

return left_rotate(node)

if balance_coefficient > 1 and balance(node.left) < 0:

node.left = left_rotate(node.left)

return right_rotate(node)

if balance_coefficient < -1 and balance(node.right) > 0:

node.right = right_rotate(node.right)

return left_rotate(node)

return node

def find_node(val, root):

if root is None:

return None

elif val < root.val:

return find_node(val, root.left)

elif val > root.key:

return find_node(val, root.right)

else:

return root

def find_min(root):

if root.left is not None:

return find_min(root.left)

else:

return root

def find_max(root):

if root.right is not None:

return find_max(root.right)

else:

return root

def delete_min_node(root):

node = find_min(root)

value = node.val

return delete(value, node)

def delete_max_node(root):

node = find_max(root)

value = node.val

return delete(value, node)

Название файла: test.py

import main

def test_is_balance_check():

root = main.Node(23)

root.left = main.Node(15)

root.right = main.Node(56)

root.left.left = main.Node(43)

root.left.right = main.Node(24)

assert main.check(root)

def test_one_diff():

root = main.Node(5)

assert main.diff(root) == float('inf')

def test_none_diff():

root = None

assert main.diff(root) == float('inf')

def test_five_diff():

root = main.Node(2)

root.left = main.Node(1000)

root.right = main.Node(50)

root.left.left = main.Node(20)

root.left.right = main.Node(90)

assert main.diff(root) == 48

def test_one_insert():

root = None

root = main.insert(0, root)

assert root.val == 0

def test_two_insert():

root = main.Node(9)

root = main.insert(3, root)

assert root.val == 9

assert root.left.val == 3

def test_insert_balancing():

root = main.Node(3)

root = main.insert(40, root)

root = main.insert(29, root)

root = main.insert(123, root)

root = main.insert(10, root)

root = main.insert(65, root)

root = main.insert(17, root)

assert root.val == 29

assert root.left.val == 10

assert root.right.val == 65

assert root.right.right.val == 123

assert root.right.left.val == 40

assert root.left.right.val == 17

assert root.left.left.val == 3

def test_delete_max():

root = main.Node(4)

root = main.insert(5, root)

root = main.insert(7, root)

root = main.insert(2, root)

root = main.insert(1, root)

root = main.insert(3, root)

a = main.delete_max_node(root)

assert a.val == 7

assert root.left.val == 2

assert root.right.val == 5

assert root.left.left.val == 1

assert root.left.right.val == 3

def test_delete_min():

root = main.Node(68)

root = main.insert(65, root)

root = main.insert(87, root)

root = main.insert(31, root)

root = main.insert(18, root)

a = main.delete_min_node(root)

assert a.val == 18

assert root.val == 68

assert root.left.val == 31

assert root.right.val == 87

assert root.left.right.val == 65

Соседние файлы в папке Лабы по АиСД 2023