Вопрос проверяет понимание алгоритма поворота дерева, который используется для балансировки бинарных деревьев поиска, таких как AVL-деревья, для поддержания эффективности операций вставки, удаления и поиска.
Поворот дерева — это фундаментальная операция в структурах данных, используемая для поддержания баланса в бинарных деревьях поиска (BST). Когда мы добавляем или удаляем узлы в BST, дерево может стать несбалансированным, превратившись в вырожденный список, где операции поиска будут выполняться за O(n). Чтобы избежать этого, применяются самобалансирующиеся деревья, такие как AVL или красно-чёрные, которые используют повороты для корректировки высоты.
Поворот локально меняет связь между узлом и его потомком, сохраняя порядок обхода inorder (что гарантирует, что дерево остаётся BST). Существует два основных типа:
Рассмотрим простую реализацию на Python для узла бинарного дерева:
class TreeNode:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
self.height = 1
def right_rotate(y):
"""Выполняет правый поворот вокруг узла y."""
x = y.left
T2 = x.right
# Выполняем поворот
x.right = y
y.left = T2
# Обновляем высоты (важно для AVL)
y.height = 1 + max(get_height(y.left), get_height(y.right))
x.height = 1 + max(get_height(x.left), get_height(x.right))
return x # Новый корень поддерева
def get_height(node):
if not node:
return 0
return node.heightПовороты активно используются в:
Вывод: Поворот дерева — ключевой механизм для поддержания логарифмической высоты в сбалансированных BST, что критически важно для производительности в базах данных, файловых системах и реализациях ассоциативных массивов (например, в стандартных библиотеках C++ или Java). Применяйте его, когда нужны гарантированно быстрые операции поиска в динамически изменяющихся данных.