Разбираемся в работе с АВЛ деревями на C#

Приветствую всех, тема довольно сложна для понимания, и требует вашей концентрации внимания.

АВЛ-дерево – сбалансированное по высоте двоичное дерево поиска. Было названо в честь советских учёных Адельсона-Вельского Георгия Максимовича и Ландиса Евгения  Михайловича, которые впервые описали алгоритм и его структуру. Правила построения двоичных деревьев поиска:

  • каждый узел может иметь не более двух потомков (левый и правый);
  • значения которые меньше текущего размещаются в левом поддереве;
  • значения которые больше или равные текущему размещаются в правом поддереве;

Дополнительное условие для АВЛ-дерева:

  • для любого узла дерева, высота его правого поддерева никогда не превышает высоты его
    левого поддерева более чем на единицу.
    *Этого свойства достаточно, чтобы высота дерева имела логарифмическую зависимость от
    числа его узлов.

Узел «6» не имеет родительского узла, поэтому он является корнем дерева и находится на первом уровне. Узлы «4» и «8» это братские узлы, которые находятся на втором уровне. Узлы «3» и «5» находятся на третьем уровне. Используя эти уровни, можно найти расстояние между узлами «6» и «3», оно равно двум.

Не сбалансированное дерево

Минимальная высота левого и правого поддерева не может отличатся больше чем на единицу и это правило характерно для всех узлов дерева. Если рассмотреть корень узла, то его левое поддерево имеет высоту два, а правое – ноль, поэтому дерево не сбалансировано.

Частично сбалансированное дерево

Дерево называется полностью сбалансированным, если каждый узел дерева сбалансированный. Узел «7» не сбалансированный, поскольку высота правого поддерева два, а левого – ноль.

Алгоритм балансировки

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

  • правое вращение,
  • левое вращение,
  • два смешанных алгоритма, которые базируются на первых двух.

Существуют четыре типа вращения:

  • вращение влево,
  • вращение вправо,
  • вращение влево,
  • а потом в право и в обратной последовательности.

Вращение узла вправо

Алгоритм вращения вправо имеет три шага:

  • земенить текущий корень на его левого потомка; узел B становится корнем, а узел А занимает его место.
  • переместить правого потомка нового корня на место левого потомка старого корня. B -> C to D -> C.
  • Присвоить новому корню (B) в качестве правого потомка старый корень (D).

Вращение узла влево

Алгоритм вращения влево осуществляется в три шага:

  • земенить текущий корень на его правого потомка; узел «С» становится корнем, а узел «А» его левым потомком.
  • переместить левого потомка нового корня (B) на место правого потомка старого корня. «С» -> «B» to «A» -> «B».
  • Присвоить новому корню (С) в качестве правого узла значение старого корня (D).

Вращение вправо и влево

Данная ситуация отличается от предыдущих, поскольку правый потомок корня имеет левого потомка, но не имеет правого.

Вращение влево и вправо

Когда корень дерева имеет левого потомка, который в свою очередь имеет правого потомка, но не имеет левого, применяют последовательной вращения влево, а затем вправо.

 

 

 

Обновлено: 04.08.2018 — 10:43

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.