

27. АВЛ – деревья. Свойства. Вращение. Высота АВЛ-дерева (теорема)
Дерево поиска называется АВЛ – деревом, если для каждой его вершины высоты левого и правого поддеревьев отличаются не более чем на 1.
Высота AVL-деревьев оценивается сверху логарифмически в зависимости от числа вершин: h <= C log2 n .
Высота лежит в диапазоне от log2(n + 1) до 1.44 log2(n + 2)
Повороты при балансировке
r – корень АВЛ-дерева, у которого имеется левое поддерево (ТL) и правое поддерево (TR). Если добавление новой вершины в левое поддерево приведет к увеличению его высоты на 1, то возможны три случая:
1)если hL = hR, то ТL и TR станут разной высоты, но баланс не будет нарушен;
2)если hL < hR, то ТL и TR станут равной высоты, т. е. баланс даже улучшится;
3)если hL > hR, то баланс нарушиться и дерево необходимо перестраивать.
Дополнительный параметр Balance (показатель баланса), принимающий следующие значения:
1.-1, если левое поддерево на единицу выше правого;
2.0, если высоты обоих поддеревьев одинаковы;
3.1, если правое поддерево на единицу выше левого.
Если в какой-либо вершине баланс высот нарушается, то необходимо так перестроить имеющееся дерево, чтобы восстановить баланс в каждой вершине. Для восстановления баланса будем использовать процедуры поворотов АВЛ-дерева.
Алгоритм на псевдокоде LL - поворот
1.q := p→Left
2.q→Balance := 0
3.p→Balance := 0
4.p→Left := q→Right
5.q→Right := p
6.p := q
Алгоритм на псевдокоде LR - поворот
1.q := p→Left, r := q→Right
2.IF (r→Balance<0) p→Balance := +1
3.ELSE p→Balance := 0 FI
4.IF (r→Balance>0) q→Balance := –1
5.ELSE q→Balance := 0 FI
6.r→Balance := 0
7.p→Left := r→Right, q→Right := r→Left
8.r→Left := q, r→Right := p, p := r
Алгоритм на псевдокоде RR - поворот
1.q := p→Right
2.q→Balance := 0
3.p→Balance := 0
4.p→ Right:= q→ Left
5.q→ Left := p
6.p := q
Алгоритм на псевдокоде RL - поворот
1.q := p→ Right, r := q→ Left
2.IF (r→Balance>0) p→Balance := -1 ELSE p→Balance := 0 FI
3.IF (r→Balance<0) q→Balance := 1 ELSE q→Balance := 0 FI
4.r→Balance := 0
5.p→ Right:= r→ Left, q→ Left:= r→ Right
6.r→ Left := p, r→Right := q, p := r