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