Drzewa poszukiwań binarnych (ukorzenione drzewa, każdy węzeł ma dwóch potomków, liście mają zero potomków) są strukturami danych, na których można wykonywać różne operacje na zbiorach dynamicznych takie jak Search,Minimum,Maximum,Predecessor,Successor,Insert,Delete.
Węzeł drzewa
Węzeł drzewa składa się z:
key - wartość ze zbioru dynamicznego A, którą możemy porównać z każdym innym elementem należącym do A
left - wskaźnik na lewego potomka
right - wskaźnik na prawego potomka
parent - wskaźnik na rodzica (opcjonalny)
Porządek w BST
Niech x będzie węzłem BST T. Jeśli y∈ lewe pod-drzewo x wtedy y.key≤x.key, w przeciwnym przypadku y.key≥x.key.
Wysokość BST
Istotnym parametrem BST jest jego wysokość h, czyli najdłuższa ścieżka między korzeniem drzewa, a liściem.
Operacje dla BST
InorderTreeWalk
Operacja pozwalająca na przechodzenie drzewa w uporządkowany sposób. Operacja ta wywołana na drzewie o n węzłach ma złożoność obliczeniową Θ(n).
Search(x)
Operacja pozwalająca wyszukać węzeł w drzewie BST, którego pole key==x.
Jeśli taki element nie istnieje to zwraca null.
Operacja ta ma złożoność obliczeniową O(h) gdzie h to wysokość BST.
Insert(x)
Operacja wstawiająca nowy węzeł do BST, którego pole key:=x.
Operacja ta zachowuje oczywiście porządek w BST do którego wstawiany jest nowy element.
Operacja ta ma złożoność obliczeniową O(h).
Delete(x)
Operacja usuwająca element x z BST.
Operacja ta jest bardziej złożona niż poprzednie, należy w niej rozpatrzeć czy usuwany węzeł jest:
liściem drzewa
ma jedno pod-drzewo, które nie jest węzłem nullowym
ma dwa pod-drzewa, które nie są węzłami nullowymi
Operacja ta zachowuje oczywiście porządek w BST, z którego usuwany jest węzeł x.
Operacja ta ma złożoność obliczeniową O(h).
Minimum
Operacja zwraca element BST o najmniejszej wartości pola key, czyli element „najbardziej po lewej stronie w drzewie”.
Operacja ta ma złożoność obliczeniową O(h).
Maximum
Operacja zwraca element BST o największej wartości pola key, czyli element „najbardziej po prawej stronie w drzewie”.
Operacja ta ma złożoność obliczeniową O(h).
Successor(x)
Operacja zwraca węzeł BST, którego wartość pola key jest następnikiem węzła x, czyli węzeł o najmniejszej wartości pola key większej niż x.key(zakładając, że wszystkie klucze w drzewie są różne). Operacja ta ma złożoność obliczeniową O(h).
Predecessor(x)
Operacja analogiczna do Successor, zwracająca poprzednika węzła x.
BSTSort
Rozpatrzmy operację BSTSort, która wstawia do BST wszystkie elementy zbioru A=(a1,…,an), a następnie wykonuje na tym drzewie InorderTreeWalk.
Wynikiem będzie wypisanie posortowanego ciągu elementów ze zbioru A. Warto zauważyć, że BSTSort wykonuje te same porównania co QuickSort wykonany na zbiorze A(tylko może w innej kolejności).
Załóżmy, że wejściem do naszego algorytmu jest losowa permutacja elementów tablicy A.
Wiedząc z wcześniejszego wykładu, że w QuickSortcie E(#poroˊwnanˊ)=Θ(nlogn).
W takim razie dla BST: E(sˊrednia głębokosˊcˊ węzła w drzewie BST)=Θ(logn) gdzie głębokością węzła x w BST jest jego odległość od korzenia drzewa.
Niestety, z tego faktu nie możemy wywnioskować, że wysokość drzewa jest również logarytmiczna (istnieje drzewo o średniej głębokości węzła Θ(logn) oraz wysokości Θ(n)
Własność #2
Zauważmy, że jeśli do BST wstawimy n elementów w uporządkowanej kolejności to jego wysokość będzie wynosić h=n.
Twierdzenie #1
E(wysokosˊci BST o n węzłach)=O(logn) zakładając, że kolejność wstawianych elementów do drzewa jest zadana przez losową permutację.
D-d Twierdzenia #1
Zamiast analizować zmienną losową wysokości drzewa Hn, analizujemy zmienną Yn=2Hn.
Wykorzystując indukcję dowodzimy, że E(Yn)=O(n3)
Wykorzystując nierówność Jensena oraz powyżej udowodnioną równość na wartości oczekiwanej Yn otrzymujemy E(Hn)≤3log(n)+O(1). Luc Devroye w 1986r pokazał, że E(Hn)=2.9882…log(n)+o(logn)