Изменения

Перейти к: навигация, поиск

АВЛ-дерево

83 байта добавлено, 19:22, 5 июня 2015
Балансировка
!Когда используется
!Расстановка балансов
!Псевдокод
|-
|'''Малое левое вращение''' (''Small left rotation'')
<tex>diff[a] = -1</tex> и <tex>diff[b] = 1</tex>
|node* rotateleft(node* a) {
node* b = a->right;
a->right = b->left;
b->left = a;
fixheight(a);
fixheight(b);
return b;
}
|-
|'''Большое левое вращение''' (Big left rotation'')
<tex>diff[a] = 0</tex>, <tex>diff[b] = 0</tex> и <tex>diff[c] = 0</tex>
|node* bigrotateleft(node* a) {
rotateright(a->right);
rotateleft(a);
return a;
}
|}
Малый левый поворот:
rotateleft(node a) {
node b = a.right
a.right = b.left
b.left = a
fixheight(a)
fixheight(b)
}
Большой правый поворот пишется проще:
bigrotateleft(node a) {
rotateright(a.right)
rotateleft(a)
}
Малое правое и большое правое вращение определяются симметрично малому левому и большому левому вращению.
В каждом случае операция приводит к нужному результату, а полная высота уменьшается не более чем на <tex>1 </tex> и не может увеличиться.
Все операции вращения, очевидно, требуют <tex>O(1)</tex> операций.
Анонимный участник

Навигация