Шаг 72.
Алгоритмы балансировки. Общие положения

    На этом шаге мы рассмотрим общие операции, выполняемые при включении вершины в сбалансированное дерево.

    Рассмотрим теперь, что может произойти при включении в сбалансированное дерево новой вершины. Если у нас есть корень r, левое (L) и правое (R) поддеревья, то необходимо различать три возможных случая. Предположим, что включение в L новой вершины увеличит на 1 его высоту; тогда возможны три случая:

    Рассмотрим следующее дерево:


Рис.1. Пример дерева

    Вершины с ключами 9 и 11 можно включить в дерево, не нарушив его сбалансированности: дерево с корнем 10 становится односторонним, а дерево с корнем 8 - лучше сбалансированным. Однако включение значений 1, 3, 5 и 7 требует последующей балансировки.

    Алгоритм включения и балансировки существенно зависит от того, каким способом хранится информация о сбалансированности дерева. В дальнейшем мы будем хранить в каждой вершине показатель сбалансированности. Таким образом, структура вершины АВЛ-дерева будет следующей:

  struct node
  {
    int Key; 
    int Count;
    int bal; // Показатель балансированности вершины. 
    node *Left; 
    node *Right;
  };

    Показатель сбалансированности вершины мы в дальнейшем будем интерпретировать как разность между высотой правого и левого поддерева.

    Таким образом, можно сформулировать алгоритм включения вершины в дерево:

    Со следующего шага мы начнем рассматривать алгоритмы балансировки.




Предыдущий шаг Содержание Следующий шаг