Porządek symetryczny: x lef t(x) right(x) Własność drzewa BST: W drzewach BST mamy porządek symetryczny. Dla każdego węzła x spełniony jest warunek: jeżeli węzeł y leży w lewym poddrzewie x, to key(y) key(x); jeżeli węzeł y leży w prawym poddrzewie x, to key(x) key(y). Drzewem poszukiwań binarnych (drzewem BST) nazywamy dowolne drzewo binarne, w którym wartości kluczy wpisane są do węzłów zgodnie z porządkiem symetrycznym. Następnik węzła następny węzeł odwiedzany w czasie przechodzenia drzewa w porządku Inorder. Twierdzenie 13.1 [T. H. Cormen] Następujące operacje na zbiorach dynamicznych: SEARCH, MINIMUM, MAXIMUM, SUCCESSOR oraz PREDECESSOR są wykonywane na drzewie binarnym o wysokości h w czasie O(h). 1
Zadanie 1 1. Należy narysować drzewa BST o wysokości 2, 3,, 5 oraz zawierające następujący zbiór kluczy: {1,, 5,,,, }. wysokość = 2 1 5 wysokość = 3 5 1 5 1 5 1 5 1 1 1 5 5 2
1 1 5 5 2. Należy przejść te drzewa w porządku Inorder. Przy każdym przejściu należy wypisać ciąg następników. 3. Zwróć uwagę, że przy przechodzeniu drzewa w takim porządku, ciąg wartości kluczy następników jest w porządku rosnącym.. Wykaż, że czas przechodzenia drzewa w porządku Inorder jest liniowy. Rozwiązanie. Przechodzenie drzewa binarnego: T (n) = T (k) + T (n k 1) + d. Metoda zgadywania: T (n) = An + B = Ak + B + A(n k 1) + B + d = A(n 1) + 2B + d. Stąd wynika, że A = B + d. Z warunku początkowego T (1) = c mamy A + B = c, czyli 2B + d = c, B = c d, A = c+d. Ostatecznie 2 2 T (n) = c + d 2 n + c d 2. 3
Zadanie 2 Szukanie minimum procedure TreeMin(r : node); {r korzeń drzewa} begin x := r; if x (NIL) then while (Left(x) (NIL)) do x := Left(x); end if return x; end Złożoność czasowa: liniowa ze względu na wysokość drzewa. Zadanie 3 Szukanie maksimum procedure TreeMax(r : node); {r korzeń drzewa} begin x := r; if x (NIL) then while (Right(x) (NIL)) do x := Right(x); end if return x; end Złożoność czasowa: liniowa ze względu na wysokość drzewa. Zadanie Szukanie klucza k w drzewie BST procedure Znajdz(k : key; r : node); var x : node; begin x := r; while (x (NIL)) and (key(x) k) if k < key(x) then x := Left(x); else x := Right(x); end if return x; end {r korzeń drzewa}
Zadanie 5 Procedura wstawiania opiera się na procedurze wyszukiwania. Jeżeli klucz k nie występował w drzewie, podczas procedura wyszukiwania doprowadzi nas do liścia. Jest to węzeł, do którego dowiążemy nowy węzeł z kluczem k. Oczywiście musimy znać dowiązanie do tego węzła. 13 18 20 1 W którym miejscu wstawimy nowy węzeł z kluczem 11? Rozwiązanie. 13 18 20 11 1 Zadanie Mając zadany ciąg kluczy konstrukcja drzewa BST polega na wstawianiu ich do pustego drzewa binarnego. Należy skonstruować drzewo BST mając zadany zbiór kluczy: {,, 12, 7, 9, 2,,,, 1, 15}. Rozwiązanie. 7 2 9 12 15 5
Zadanie 7 Załóżmy, że w drzewie BST znajdują się liczby od 1 do 00 i chcemy wyszukać liczbę 33. Które z poniższych ciągów węzłów nie mogą wystąpić w procedurze Search? a) 2, 252, 01, 398, 330, 3, 397, 33 b) 92, 220, 911, 2, 898, 258, 32, 33 c) 925, 202, 911, 20, 912, 25, 33 Rozwiązanie 911, 20, 912 d) 2, 399, 387, 9, 2, 382, 381, 278, 33 e) 935, 278, 37,, 299, 392, 358, 33 Rozwiązanie 37,, 299 Rozwiązanie. Warunek aby ciąg był ścieżką przeszukiwań w drzewie BST jest następujący: i 0 (a i+1 > a i j>i+1 a j > a i ) (a i+1 < a i j>i+1 a j < a i ). Zaprzeczenie tego warunku ma postać: i 0 (a i+1 > a i j>i+1 a j < a i ) (a i+1 < a i j>i+1 a j > a i ). Zadanie 8 Należy pokazać, że jeżeli węzeł w drzewie BST ma dwóch synów, to jego następnik nie ma lewego syna (bo to on byłby następnikiem), a jego poprzednik nie ma prawego syna (bo to on byłby poprzednikiem). 15 18 3 7 20 2 13 9 Następnikiem węzła z kluczem 15 jest węzeł z kluczem, a następnikiem węzła z kluczem 13 jest węzeł z kluczem 15. Następnikiem węzła z kluczem jest węzeł z kluczem 7, a poprzednikiem węzła z kluczem jest węzeł z kluczem.
Zadanie 9 Przypuśćmy, że ścieżka poszukiwania klucza k w drzewie BST kończy się na liściu. Rozważmy trzy zbiory: A klucze po lewej stronie ścieżki poszukiwań; B klucze na scieżce poszukiwań; C klucze na prawo od ścieżki poszukiwań. Czy prawdziwe jest twierdzenie, że dla dowolnych trzech kluczy a A, b B, c C spełniony musi być warunek a b c? 1 0 5 3 2 Zadanie Niech T będzie drzewem BST, x liściem w tym drzewie, a y jego ojcem. a) Należy wykazać, że key(y) jest albo najmniejszym kluczem w T większym niż key(x), albo największym kluczem w T mniejszym niż key(x). Dowód a.a. Założmy, że key(y) jest większy niż key(x), oraz istnieje węzeł z taki, że key(y) > key(z) > key(x). Rozpatrzmy dwa przypadki: 1. węzeł z znajduje się na ścieżce wiodącej z korzenia drzewa do węzła y. Oznacza to, że y musiałby być w prawym poddrzewie z, a x w lewym poddrzewie. Jest to sprzeczne z warunkiem, że x jest synem y. 2. węzły z i y mają wspólnego przodka w i znajdują się w oddzielnych jego poddrzewach. Ponieważ key(y) > key(z), więc y znajduje się w prawym podrzewie w, a z w lewym. Oznacza to, że key(w) > key(z). Ponieważ x jest synem y więc też znajduje się w prawym poddrzewie w, czyli key(x) > key(w) > key(z). Jest to sprzeczne z warunkiem key(y) > key(x). Wykluczenie drugiej możliwości, czyli przypadku, że key(y) jest mniejszy niż key(x), oraz istnieje węzeł z taki, że key(y) < key(z) < key(x) przebiega podobnie. 7
b) Należy pokazać, że warunek, że x jest liściem jest znaczący. Zadanie 11 Czy operacja usuwania węzłów w drzewie BST jest przemienna, tzn. czy po usunięciu węzłów x oraz y z drzewa BST otrzymamy takie samo drzewo niezależnie od kolejności usuwania tych węzłów? Zadanie 12 Jaka jest różnica pomiędzy własnością drzewa BST, a własnością kopca? czy własność kopca umożliwia wypisywanie kluczy drzewa o n węzłach w czasie O(n) we właściwej kolejności? 8