Operacje insert/delete na drzewach BST

Transkrypt

Operacje insert/delete na drzewach BST
Operacje insert/delete na drzewach BST
Paweł Woźniak
8 lutego 2006
Rozdział 1
Operacje insert/delete na
drzewach BST
1.1
Drzewa BST
Drzewem wyszukiwań binarnych (ang. Binary Search Tree) nazywamy drzewo binarne, w którym z każdym wierzchołkiem wiążemy pewną wartość
zwaną kluczem oraz spełnia następujące własnosci:
jeżeli wierzchołek x należy do lewego poddrzewa wierzchołka y to związany z nim klucz jest mniejszy od klucza związanego z y
jeżeli wierzchołek x należy do prawego poddrzewa wierzchołka y to
związany z nim klucz jest większy od klucza związanego z y
Rysunek 1.1: Przykładowe drzewo BST
W korzeniu drzewa (rys.1.1 ) znajduje się wartość 10, klucze (3,5,7) w
jego lewym poddrzewie są mniejsze od 10 oraz klucze (3,15,18) znajdujące
się w prawym poddrzewie są większe od 10. Ta sama własność jest spełniona
w każdym węźle drzewa. Ten sam zbiór wartości może myć przedstawiony za
pomocą wielu różnych drzew BST o innych wysokościach. Wygląd drzewa
zależy od kolejności wprowadzanych danych. Czas działanie większości ope1
racji na drzewach BST w pesymistycznym przypadku jest proporcjonalny
do wysokości drzewa.
1.2
Insert
Procedura Insert rozpoczyna przeglądanie w korzeniu a następnie przebiega
po ścieżce w dół drzewa. Zmienna x zawiera wskaźnik na aktualnie przeglądany wieszchołek, a y zawiera zawsze wskaźnik na ojca x. Po zainicjowaniu
wartosci zmiennych w pętli while wskaźniki x i y są przesuwane w dół drzewa
w lewo lub prawo w zależności od wyniku porównania kluczy aż do momenty
gdy x przyjmie wartość null. Jest to właśnie miejsce w drzewie gdzie należy
umieścić wskaźnik na węzeł z.
procedure insert(T, z){
y = null;
x = root[T];
while x <> null do y = x;
if (key[z] < key[x]) then x = left[x];
else x = right[x];
parent[z] = y;
if (y == null) then root[T] = z;
else if (key[z] < key[y] then left[y] = z;
else right[y] =z;
}
10
15
5
7
3
6
13
18
8
Rysunek 1.2: Wstawianie węzła z kluczem 6
Oczekiwana złożoność algorytmu insert w drzewie BST wynosi ok 1.4logn
+ O(1), a pesymistyczna - O(n).
2
1.3
Delete
W procedurze usuwania węzła z drzewa BST rozpatrywane są trzy przypadki:
1. Jeśli usuwany element w nie ma synów to w jego ojcu zamiast wskaźnika do niego wstawiamy null
10
5
15
13
3
1
10
5
18
13
3
11
4
15
18
11
4
2. Jeśli węzeł w ma tylko jednego syna x to usuwamy go przez ustawienie
wskaźnika miedzy jego ojcem a x
10
5
15
13
3
1
10
3
18
15
11
4
18
13
4
1
11
3. Jeśli wezeł w ma dwóch synów, to usuwamy następnik y wezła w, o
którym wiadomo że nie ma lewego syna
10
10
5
13
3
1
4
5
15
13
3
18
1
16
16
4
18
17
17
procedure delete(T, w){
if left[w] == null or right[w] == null then y = w;
else y = succ[w];
3
if left[y] <> null then x = left[y];
else x = right[y];
if x <> null then parent[x] = parent[y];
if parent[y] == null then root[T] = x;
else if y = left[parent[y]] then left[parent[y]] = x;
else right[parent[y]] = x;
if y <> w then key[w] = key[y];
}
Czas działania procedury delete w drzewach o wysokości h wynosi O(h).
4