Operacje insert/delete na drzewach AVL

Transkrypt

Operacje insert/delete na drzewach AVL
Operacje insert/delete na drzewach AVL
Błażej Kucharczyk
1 lutego 2006
1
1
Wstęp
Drzewo AVL jest drzewem wyszukiwań binarnych (BST), z tym że wysokość
jego lewego i prawego poddrzewa różni się o co najwyżej 1.
Wyszukiwanie elementu w drzewach AVL wykonuje się tak samo jak w normalnych BST, jednak operacje Insert i Delete mogą zaburzyć strukturę drzewa więc wymagają pewnych zmian.
2
Operacja Insert - wstawianie elementu
Podczas wstawiania elementu do drzewa AVL początkowo postepujemy tak
jak byśmy wstawiali element do normalnego drzewa BST. Jednak wykonie tej operacji może spowodować że naruszona zostanie struktura drzewa
AVL, dlatego należy wykonać jeszcze kilka dodatkowych czynności. Procedura wstawiania nowego elementu będzie więc dwuetapowa.
W pierwszym etapie węzeł wstawiany jest do drzewa w taki sam sposób, w
jaki jest wstawiany do drzewa BST - nowy węzeł zostaje dodany jako liść w
odpowiednim miejscu tak, by nie naruszyć własności drzewa BST. Dodanie
nowego węzła może spowodować, że dla niektórych węzłów, należących do
ścieżki przebytej podczas dodawania nowego węzła, nie będzie już spełniona
własność zrównoważenia AVL. W drugim etapie, by naprawić ewentualne
naruszenia własności AVL, algorytm powraca po tej samej ścieżce do korzenia, porównując wysokość lewego i prawego poddrzewa każdego węzła,
przez który przechodzi. Jeśli różnica jest większa niż 1, wykonywana jest
rotacja przywracająca własność AVL. Rotacja zmienia topologię drzewa w
taki sposób, że przywrócona zostaje własność zrównoważenia drzewa AVL
przy równoczesnym zachowaniu własności drzewa wyszukiwań binarnych.
2.1
Rotacje
Istnieją 4 typy rotacji:
pojedyńcza prawa rotacja
pojedyńcza lewa rotacja
wykonywana jest symetrycznie do pojedyńczej prawej rotacji.
podwójna prawa rotacja
podwójna lewa rotacja
wykonywana analogicznie do podwójnej prawej rotacji
Rotacja pozostawia drzewo o tej samej wysokości co przed dodaniem elementu, zatem cała operacja nie narusza własności AVL z punktu widzenia
nadrzędnych elementów w drzewie.
2.2
Przykład
Na rysunku przedstawione jest drzewo AVL do którego chcemy wstawić
nowy element o wartości 3.
Po wstawieniu okazało się że nowe drzewo nie spełnia własności drzewa
AVL (węzeł o wartości 5 ma balans równy 2). W tym przypadku wykonamy
pojedyńczą prawą rotacje aby naprawić drzewo.
2
W wyniku otrzymujemy naprawione drzewo AVL.
3
Operacja Delete - usuwanie elementu
Usuwanie elementu z drzewa AVL jest zrealizowane analogicznie jednak może wymagać nieco więcej rotacji. Element jest usuwany procedurą rekurencyjną, i po powrocie z wywołań rekurencyjnych na kolejnych poziomach
aktualizowane jest pole balans, a w razie potrzeby wykonywana jest odpowiednia rotacja. Jednak w przypadku usuwania węzłów rotacja nie pozostawia drzewa o tej samej wysokości, co przed usunięciem węzła, a o 1 niższe.
Dlatego jednorazowe wykonanie rotacji nie kasuje do końca zaburzenia, które propaguje się dalej i na wyższych poziomach mogą byą konieczne kolejne
rotacje.
Skrajnym przykładem takiej sytuacji jest ”ekstremalne” drzewo AVL, które
na każdym poziomie posiada maksymalne niezrównoważenie dopuszczalne
przez własność AVL. Usunięcie w tym drzewie węzła z niższej gałęzi drzewa
powoduje kaskadę rotacji na wszystkich poziomach.
Usunięcie elementu ”A” spowoduje naruszenie równowagi w węźle ”B”. Aby
to skorygować należy wykonać lewą rotację wynoszącą element ”C” w górę, a
element ”B” w dół, i zmniejszającą w efekcie wysokość drzewa ”B-C-D”. To
jednak powoduje naruszenie równowagi w węźle ”E” i konieczność ponownej
lewej rotacji wynoszącej do góry węzeł ”H”. Wysokość tego poddrzewa maleje, i może z kolei spowodować naruszenie równowagi w następnym węźle
”M” co znów zmusza algorytm do wykonania rotacji...
3
4
Podsumowanie
Drzewa AVL nie są prosta strukturą. Implementacja algroytmów wstawiania
i usuwania wymaga trochę wysiłku, jednak w zamian drzewa AVL gwarantują że wszystkie operacje słownikowe wykonywane będą w czasie ograniczonym funkcją liniową od wysokości drzewa czyli O(log n).
4