Балансирование деревьев — это процесс реорганизации дерева для поддержания его сбалансированной формы, что гарантирует оптимальную производительность операций поиска, вставки и удаления.
В несбалансированном дереве (например, вырожденном в список) операции деградируют до O(n), тогда как в сбалансированном остаются O(log n).
AVL-деревья:
Красно-черные деревья:
B-деревья и B+-деревья:
class AVLNode {
public int Key;
public AVLNode Left, Right;
public int Height;
}
AVLNode RightRotate(AVLNode y) {
AVLNode x = y.Left;
AVLNode T2 = x.Right;
x.Right = y;
y.Left = T2;
y.Height = Max(Height(y.Left), Height(y.Right)) + 1;
x.Height = Max(Height(x.Left), Height(x.Right)) + 1;
return x;
}
После каждой модификации дерева:
Высотная сбалансированность:
Весовая сбалансированность:
Случайные деревья:
Пример для AVL-дерева:
private Node Balance(Node node) {
int balanceFactor = GetBalanceFactor(node);
// Left Left Case
if (balanceFactor > 1 && GetBalanceFactor(node.Left) >= 0)
return RightRotate(node);
// Right Right Case
if (balanceFactor < -1 && GetBalanceFactor(node.Right) <= 0)
return LeftRotate(node);
// Left Right Case
if (balanceFactor > 1 && GetBalanceFactor(node.Left) < 0) {
node.Left = LeftRotate(node.Left);
return RightRotate(node);
}
// Right Left Case
if (balanceFactor < -1 && GetBalanceFactor(node.Right) > 0) {
node.Right = RightRotate(node.Right);
return LeftRotate(node);
}
return node;
}
Операция | Несбалансированное | Сбалансированное |
---|---|---|
Поиск | O(n) | O(log n) |
Вставка | O(n) | O(log n) |
Удаление | O(n) | O(log n) |
Память | O(n) | O(n) |
балансирование деревьев — ключевая техника для поддержания эффективности древовидных структур. Разные алгоритмы балансировки предлагают компромисс между строгостью баланса и частотой перестроений, позволяя выбирать оптимальное решение для конкретной задачи.