Algorytmy i Struktury Danych. Drzewa poszukiwań binarnych. Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 10 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 1 / 47 Plan wykładu Drzewiaste struktury danych Dlaczego ich potrzebujemy Podstawowe definicje Dynamiczne realizacje Drzewa poszukiwań binarnych (BST) Definicja Odwiedzanie wierzchołków Wyszukiwanie danego elementu, wyszukiwanie maksimum i minimum Wstawianie nowego elementu do drzewa Usuwanie elementu z drzewa Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 2 / 47 Wstawianie i wyszukiwanie kluczy Tablice nieposortowane Tablice posortowane Drzewa poszukiwań binarnych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 3 / 47 Tablice nieposortowane Operacja wstawiania na koniec – Złożoność O(1) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47 Tablice nieposortowane Operacja wstawiania na koniec – Złożoność O(1) Operacja wstawiania na poczatek ˛ – Złożoność O(n) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47 Tablice nieposortowane Operacja wstawiania na koniec – Złożoność O(1) Operacja wstawiania na poczatek ˛ – Złożoność O(n) Operacja wyszukiwania elementu (wyszukiwanie liniowe) – Złożoność O(n) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47 Tablice nieposortowane Operacja wstawiania na koniec – Złożoność O(1) Operacja wstawiania na poczatek ˛ – Złożoność O(n) Operacja wyszukiwania elementu (wyszukiwanie liniowe) – Złożoność O(n) A może jest coś lepszego ... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 4 / 47 Tablice posortowane Operacja wstawiania – równoważne sortowaniu przez wstawianie, złożoność O(n2 ). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47 Tablice posortowane Operacja wstawiania – równoważne sortowaniu przez wstawianie, złożoność O(n2 ). Operacja wyszukiwania elementu (wyszukiwanie binarne) – Złożoność O(log(n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47 Tablice posortowane Algorytm bisekcji (Tab,n,x): 1: i := 0; j := n − 1; 2: while (j − i > 1) do Operacja wstawiania – 3: m := (i + j)div2; równoważne sortowaniu przez 4: if Tab[m] ≤ x then wstawianie, złożoność O(n2 ). 5: i := m; Operacja wyszukiwania 6: else elementu (wyszukiwanie 7: j := m; binarne) – Złożoność 8: end if O(log(n)) 9: end while 10: if Tab[i] = x then 11: return true; 12: else 13: return false; 14: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47 Tablice posortowane Algorytm bisekcji (Tab,n,x): 1: i := 0; j := n − 1; 2: while (j − i > 1) do Operacja wstawiania – 3: m := (i + j)div2; równoważne sortowaniu przez 4: if Tab[m] ≤ x then wstawianie, złożoność O(n2 ). 5: i := m; Operacja wyszukiwania 6: else elementu (wyszukiwanie 7: j := m; binarne) – Złożoność 8: end if O(log(n)) 9: end while 10: if Tab[i] = x then Potrzebujemy czegoś 11: return true; lepszego ... 12: else 13: return false; 14: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 5 / 47 Drzewa Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Drzewa poszukiwań binarnych (BST) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Drzewa poszukiwań binarnych (BST) Kopce Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Drzewa poszukiwań binarnych (BST) Kopce Drzewa AVL - nazwa AVL pochodzi od nazwisk rosyjskich matematyków: Gieorgij Adelson-Wielskij i Jewgienij Łandis Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Drzewa poszukiwań binarnych (BST) Kopce Drzewa AVL - nazwa AVL pochodzi od nazwisk rosyjskich matematyków: Gieorgij Adelson-Wielskij i Jewgienij Łandis Drzewa Czerwono-Czarne Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Drzewa poszukiwań binarnych (BST) Kopce Drzewa AVL - nazwa AVL pochodzi od nazwisk rosyjskich matematyków: Gieorgij Adelson-Wielskij i Jewgienij Łandis Drzewa Czerwono-Czarne B-drzewa ... Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 6 / 47 Drzewa Definicja Drzewem nazywamy spójny i acykliczny graf nieskierowany. Graf jest spójny, gdy dowolne dwa wierzchołki sa˛ połaczone ˛ droga. ˛ Graf jest acykliczny, jeśli nie posiada cyklu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 7 / 47 Drzewa Definicja Drzewem nazywamy spójny i acykliczny graf nieskierowany. Graf jest spójny, gdy dowolne dwa wierzchołki sa˛ połaczone ˛ droga. ˛ Graf jest acykliczny, jeśli nie posiada cyklu. Drzewo, w którym wyróżniony jest jeden, charakterystyczny wierzchołek nazywamy drzewem z korzeniem. Korzeń jest jedynym elementem drzewa, który nie posiada poprzednika (rodzica). Dla każdego innego wierzchołka określony jest dokładnie jeden rodzic. Wierzchołki znajdujace ˛ sie˛ bezpośrednio pod danym wezłem ˛ nazywamy synami (lub dziećmi). Wierzchołki, które nie maja˛ potomków nazywane sa˛ liśćmi. Jeżeli liczba nastepników ˛ dla każdego wierzchołka wynosi co najwyżej dwa, to takie drzewo nazywamy binarnym. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 7 / 47 Drzewa Zupełne drzewo binarne - Każdy wezeł, ˛ z wyjatkiem ˛ liści, ma dokładnie dwa nastepniki; ˛ Drzewo poszukiwań binarnych (BST) - Dla każdego wezła ˛ (nie bed ˛ acego ˛ liściem) wszystkie wartości przechowywane w lewym poddrzewie sa˛ mniejsze od wartości tego wezła, ˛ natomiast wszystkie wartości przechowywane w prawym poddrzewie sa˛ wieksze ˛ od wartości w tym weźle. ˛ Kopiec (sterta) - Wartości przechowywane w nastepnikach ˛ każdego wezła ˛ sa˛ mniejsze od wartości w danym weźle ˛ (tzw. kopiec maksymalny) lub wartości przechowywane w nastepnikach ˛ każdego wezła ˛ sa˛ wieksze ˛ od wartości w danym weźle ˛ (tzw. kopiec minimalny). Drzewo jest szczelnie wypełniane (zrównoważone) od lewego poddrzewa Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 8 / 47 Zupełne drzewo binarne 1 3 2 4 Bożena Woźna-Szcześniak (AJD) 5 6 Algorytmy i Struktury Danych. 7 Wykład 10 9 / 47 Drzewo poszukiwań binarnych 15 7 13 4 2 Bożena Woźna-Szcześniak (AJD) 30 NIL 25 NIL Algorytmy i Struktury Danych. 34 27 Wykład 10 10 / 47 Drzewo poszukiwań binarnych 2 3 NIL NILL 4 NILL NILL Bożena Woźna-Szcześniak (AJD) 5 6 Algorytmy i Struktury Danych. Wykład 10 11 / 47 Drzewo poszukiwań binarnych 2 2 3 NIL NILL 4 NILL NILL Bożena Woźna-Szcześniak (AJD) 3 1 NILL 5 4 5 NILL 6 Algorytmy i Struktury Danych. NILL Wykład 10 6 11 / 47 Drzewo binarne, ale nie poszukiwań binarnych 2 3 NIL 0 NILL NILL NILL Bożena Woźna-Szcześniak (AJD) 5 6 Algorytmy i Struktury Danych. Wykład 10 12 / 47 Drzewo binarne, ale nie poszukiwań binarnych 2 2 3 NIL 10 0 NILL NILL NILL Bożena Woźna-Szcześniak (AJD) 3 NILL 5 4 5 NILL 6 Algorytmy i Struktury Danych. NILL Wykład 10 6 12 / 47 Kopiec (sterta) 1 5 2 9 7 3 4 10 Bożena Woźna-Szcześniak (AJD) 6 8 NIL Algorytmy i Struktury Danych. Wykład 10 13 / 47 Drzewa Dla każdego drzewa można określić: głeboko ˛ ść wierzchołka u - liczba wierzchołków, przez które należy przejść od korzenia do wierzchołka u. wysokość u - maksymalna liczba wierzchołków na drodze od u do pewnego liścia. wysokość drzewa = głeboko ˛ ść = wysokość korzenia +1 ścieżka z u do v- zbiór wierzchołków, przez które należy przejść z wierzchołka u do v. droga = ścieżka skierowana. stopień wierzchołka - liczba jego bezpośrednich nastepników. ˛ Stopień drzewa - maksymalny stopień wierzchołka. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 14 / 47 Drzewa Drzewo AVL (1962 - Adelson-Velskii, Landis) - Drzewo BST jest drzewem AVL wtedy, kiedy dla każdego wierzchołka wysokości dwóch jego poddrzew różnia˛ sie˛ o co najwyżej jeden poziom; Drzewo Czerwono-Czarne Sa˛ to drzewa poszukiwań binarnych Każdy w˛ezeł jest czerwony lub czarny Korzeń jest czarny Czerwony w˛ezeł ma zawsze czarnego ojca Ilość czarnych w˛ezłów na dowolnej ścieżce od korzenia do liścia jest taka sama Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 15 / 47 Drzewo AVL 15 7 13 4 2 Bożena Woźna-Szcześniak (AJD) 30 NIL 25 NIL Algorytmy i Struktury Danych. 34 27 Wykład 10 16 / 47 Drzewo Czerwono-Czarne 11 2 14 7 1 5 Bożena Woźna-Szcześniak (AJD) NIL 15 8 Algorytmy i Struktury Danych. Wykład 10 17 / 47 Podstawowe operacje na strukturach drzewiastych Przechodzenie po drzewie - metoda wszerz (BFS), metoda w głab ˛ (DFS) Wyszukanie elementu w drzewie Dodawanie nowego elementu do drzewa Usuniecie ˛ wskazanego elementu z drzewa Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 18 / 47 Algorytm przechodzenia po drzewie binarnym Cel: jednokrotne “odwiedzenie” każdego elementu drzewa; linearyzacja drzewa; Dane wejściowe: dowiazanie ˛ do korzenia drzewa “Root”; Uwagi: kolejność przejścia dowolna - liczba możliwych ścieżek w drzewie o n w˛ezłach wynosi n! (permutacja); najcześciej ˛ stosowane sposoby przegladania: ˛ wszerz i w głab; ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 19 / 47 Metody przechodzenia po drzewie binarnym: BFS (wszerz) Przechodzenie wszerz polega na odwiedzaniu kolejno każdego wezła ˛ od najwyższego (najniższego) poziomu i przechodzeniu kolejno po tych poziomach od góry w dół (od dołu do góry) i od lewej do prawej lub od prawej do lewej. 15 7 Bożena Woźna-Szcześniak (AJD) 13 4 2 Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 20 / 47 Metody przechodzenia po drzewie binarnym: BFS (wszerz) Przechodzenie wszerz polega na odwiedzaniu kolejno każdego wezła ˛ od najwyższego (najniższego) poziomu i przechodzeniu kolejno po tych poziomach od góry w dół (od dołu do góry) i od lewej do prawej lub od prawej do lewej. 15 7 30 13 4 25 34 Wynik: 15, 7, 30, 4, 13, 25, 34, 2, 27. 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. NIL NIL 27 Wykład 10 20 / 47 Metody przechodzenia po drzewie binarnym: BFS (wszerz) Przechodzenie wszerz polega na odwiedzaniu kolejno każdego wezła ˛ od najwyższego (najniższego) poziomu i przechodzeniu kolejno po tych poziomach od góry w dół (od dołu do góry) i od lewej do prawej lub od prawej do lewej. 15 7 30 13 4 25 34 Wynik: 15, 7, 30, 4, 13, 25, 34, 2, 27. Wynik: 27, 2, 34, 25, 13, 4, 30, 7, 15. Bożena Woźna-Szcześniak (AJD) 2 Algorytmy i Struktury Danych. NIL NIL 27 Wykład 10 20 / 47 BFS - algorytm Niech w˛ezeł pewnego drzewa binarnego bedzie ˛ postaci: typedef struct NODE { Typ data; // dane elementarne struct NODE *left; // dowiazanie ˛ do lewego potomka struct NODE *right; //dowiazanie ˛ do prawgo potomka } Node; Algorytm BFS(root): 1: enqueuq(q, root); //q jest kolejka˛ 2: while not empty (q) do 3: v := first(q); print(v .data); dequeuq(q); 4: if not empty (v .left) then 5: enqueuq(q, v .left); 6: end if 7: if not empty (v .right) then 8: enqueuq(q, v .right); 9: end if 10: end while Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 21 / 47 Metody przechodzenia po drzewie binarnym: DFS (w głab) ˛ Wersja “inorder” - LVR (porzadek ˛ symetryczny) Przejście do lewego poddrzewa (L); Odwiedzenie w˛ezła (V); Przejście do prawego poddrzewa (R); Wersja “preorder” - VLR (porzadek ˛ prosty) Odwiedzenie w˛ezła (V); Przejście do lewego poddrzewa (L); Przejście do prawego poddrzewa (R); Wersja “postorder” - LRV (porzadek ˛ odwrotny) Przejście do lewego poddrzewa (L); Przejście do prawego poddrzewa (R); Odwiedzenie w˛ezła (V); Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 22 / 47 DFS - przykład 15 7 13 4 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 23 / 47 DFS - przykład 15 Inorder: 2, 4, 7, 13, 15, 25, 27, 30, 34 . 7 13 4 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 23 / 47 DFS - przykład 15 Inorder: 2, 4, 7, 13, 15, 25, 27, 30, 34 . 7 Preorder: 15, 7, 4, 2, 13, 30, 25, 27, 34. 13 4 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 23 / 47 DFS - przykład 15 Inorder: 2, 4, 7, 13, 15, 25, 27, 30, 34 . 7 Preorder: 15, 7, 4, 2, 13, 30, 25, 27, 34. Postorder: 2, 4, 13, 7, 27, 25, 34, 30, 15. Bożena Woźna-Szcześniak (AJD) 13 4 2 Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 23 / 47 DFS - przykład + + * a b c * d Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. g + * f e Wykład 10 24 / 47 DFS - przykład + + Inorder: a+b*c + (d*e+f)*g . * a b c * d Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. g + * f e Wykład 10 24 / 47 DFS - przykład + + Inorder: a+b*c + (d*e+f)*g . Postorder: abc*+de*f+g*+. * a b c * d Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. g + * f e Wykład 10 24 / 47 void preOrder(Node const* root); void preOrder(const Node* localRoot) { if (localRoot != NULL) { printf("%ld ", localRoot->data); preOrder(localRoot->left); preOrder(localRoot->right); } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 25 / 47 void inOrder(Node const* root); void inOrder(const Node* localRoot) { if (localRoot != NULL) { inOrder(localRoot->left); printf("%ld ", localRoot->data); inOrder(localRoot->right); } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 26 / 47 void postOrder(Node const* root); void postOrder(const Node* localRoot) { if (localRoot != NULL) { postOrder(localRoot->left); postOrder(localRoot->right); printf("%ld ", localRoot->data); } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 27 / 47 Nierekurencyjny DFS - algorytm preOrder Niech w˛ezeł pewnego drzewa binarnego bedzie ˛ postaci: typedef struct NODE { Typ data; // dane elementarne struct NODE *left; // dowiazanie ˛ do lewego potomka struct NODE *right; //dowiazanie ˛ do prawgo potomka } Node; Algorytm preOrder(root): 1: push(q, root); //q jest stosem 2: while not empty (q) do 3: v := top(q); print(v .data); pop(q); 4: if not empty (v .left) then 5: push(q, v .left); 6: end if 7: if not empty (v .right) then 8: push(q, v .right); 9: end if 10: end while Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 28 / 47 Nierekurencyjny DFS - algorytm inOrder, implementacja w C void IterativeInOrder(Node const* localRoot){ Stack globalStack; initStack(&globalStack); while (true){ while(localRoot!=NULL){ push(&globalStack, (Node*)localRoot); localRoot=localRoot->left; } if (stackEmpty(&globalStack)) return; localRoot = (Node*) top(&globalStack); printf("%ld ", localRoot->data); pop(&globalStack); localRoot=localRoot->right; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 29 / 47 Nierekurencyjny DFS - algorytm postOrder, implementacja w C void IterativePostOrder(Node const* localRoot){ Stack globalStack; Node *v; initStack(&globalStack); while(!(stackEmpty(&globalStack))||(localRoot!=NULL)){ while(localRoot!=NULL){ v = (Node*)localRoot; v->visit = false; push(&globalStack, v); localRoot = localRoot->left; } v = (Node*)top(&globalStack); pop(&globalStack); if (!(v->visit)) { v->visit = true; push(&globalStack, v); localRoot = v->right; } else { printf("%ld ", v->data); localRoot=NULL; } } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 30 / 47 Operacja wyszukiwania elementu w BST Cel: uzyskanie dowiazania ˛ do w˛ezła; można je interpretować jako identyfikacje˛ w˛ezła; Dane wejściowe: dowiazanie ˛ do korzenia drzewa “Root”; Kryterium poszukiwania, np. wartość danej elementarnej; Uwagi: kolejność przeszukiwania dowolna - w skrajnym przypadku należy przejrzeć wszystkie w˛ezły w drzewie (złożoność O(n)); stosowane rozwiazania: ˛ petla ˛ lub rekurencja; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 31 / 47 Algorytm wyszukiwania elementu w BST Niech w˛ezeł pewnego drzewa binarnego bedzie ˛ postaci: typedef struct NODE { Typ data; // dane elementarne struct NODE *left; // dowiazanie ˛ do lewego potomka struct NODE *right; //dowiazanie ˛ do prawgo potomka } Node; Algorytm find(root, value): 1: while node! = NIL do 2: if Value == node.data then 3: return node; 4: else if Value < node.data then 5: node = node.left; 6: else if Value > node.data then 7: node = node.right; 8: end if 9: end while 10: return NIL; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 32 / 47 Algorytm wyszukiwania elementu w BST - przykład poszukiwanie klucza 3 Korzeń 6, Klucz < 6, Idź na lewo, 6 Wierzchołek 2, Klucz > 2, Idź na prawo, Wierzchołek 4, Klucz < 4, Idź na lewo, 8 2 Wierzchołek 3, Klucz == 3. Stop Czasy operacji: Porównanie: O(1) Poszukiwanie klucza: O(głebokość), ˛ jeśli klucz jest O(wysokość drzewa), jeśli klucza nie ma Złożoność czasowa: O(wysokość drzewa) Bożena Woźna-Szcześniak (AJD) 1 7 4 3 Algorytmy i Struktury Danych. NIL NIL Wykład 10 33 / 47 Node* find (int Value, Node* node) – wersja iteracyjna Node* find (int Value, Node* node) { while (node) { if (Value == node->data) return node; else { if (Value < node->data) node = node->left; else if (Value > node->data) node = node->right; } }//end while return NULL; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 34 / 47 Node* find (int Value, Node* node) – wersja rekurencyjna Node* find (int Value, Node* node) { if (node) { if (Value == node->data) return node; else if (Value < node->data) return find (Value, node->left); else if (Value > node->data) return find (Value, node->right); } else return NULL; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 35 / 47 BST - wyszukiwanie elementu maksymalnego i minimalnego Jeżeli chcemy znaleźć element minimalny (maksymalny) w drzewie to poruszamy sie˛ maksymalnie w lewo (prawo). 15 7 13 4 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 36 / 47 BST - wyszukiwanie elementu maksymalnego i minimalnego Jeżeli chcemy znaleźć element minimalny (maksymalny) w drzewie to poruszamy sie˛ maksymalnie w lewo (prawo). 15 Na rysunku obok niebieska droga to poszukiwanie minimum, czerwona - maksimum. 7 13 4 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 36 / 47 BST - wyszukiwanie elementu maksymalnego i minimalnego Jeżeli chcemy znaleźć element minimalny (maksymalny) w drzewie to poruszamy sie˛ maksymalnie w lewo (prawo). 15 Na rysunku obok niebieska droga to poszukiwanie minimum, czerwona - maksimum. Specyficzne rozmieszczenie elementów w drzewie sprawia, że element minimalny znajduje sie˛ zawsze w najbardziej “wysunietym ˛ na lewo” w˛eźle, a element maksymalny w najbardziej “wysunietym ˛ na prawo” w˛eźle drzewa. Bożena Woźna-Szcześniak (AJD) 7 13 4 2 Algorytmy i Struktury Danych. 30 NIL 25 NIL 34 27 Wykład 10 36 / 47 Wstawienie nowego elementu do BST Cel: dodanie nowego elementu do drzewa; Dane wejściowe: Dowiazanie ˛ do korzenia drzewa ‘Root’; Nowe dane elementarne; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 37 / 47 Wstawienie nowego elementu do BST - idea Utwórz element i ustal dane elementarne; Znajdź miejsce wstawienia elementu w drzewie: Aby znaleźć miejsce na nowy element w drzewie BST, to poczawszy ˛ od korzenia należy porównywać nowy element z w˛ezłem i jeżeli jest on mniejszy od wartości przechowywanej w tym w˛eźle to poruszać sie˛ w lewo po drzewie, w przeciwnym wypadku poruszać sie˛ w prawo. W˛edrujemy tak długo, aż dojdziemy do miejsca, w którym napotkany wskaźnik do potomka w w˛eźle bedzie ˛ wskazywał na NULL. Wstaw nowy wezeł ˛ w wskazane miejsce, a wspomniany wyżej wskaźnik ustaw tak, aby wskazywał na nowy wezeł. ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 38 / 47 void Insert (int Value, Node**next) - wersja rekurencyjna void Insert (int Value, Node* *next) { if (*next == NULL ) { *next = (Node *)malloc(sizeof(Node)); (*next)->left = NULL; (*next)->right = NULL; (*next)->data = Value; } else if (Value < (*next)->data ) Insert( Value, (*next)->left ) ; else if (Value > (*next)->data ) Insert(Value, (*next)->right ); } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 39 / 47 Wstawienie nowego elementu do BST - idea 6 Wierzchołek 6, Klucz < 6, Idź na lewo, Wierzchołek 2, Klucz > 2, Idź na prawo, 8 2 Wierzchołek 4, Klucz > 4, Idź prawo, 1 NULL, Wstaw 5. Złożoność czasowa: O(wysokość drzewa) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 7 4 3 NIL 5 Wykład 10 40 / 47 void insert(Node** tree, int data) void insert(Node** tree, int data) { Node* newNode = malloc(sizeof(Node)); newNode->data = data; newNode->left = newNode->right = NULL; if (*tree == NULL) *tree = newNode; else { Node* curr = *tree; // zaczynamy poszukiwania od korzenia Node* parent; while(true) { parent = curr; if (data < curr->data) { curr = curr->left; if (curr == NULL) {parent->left = newNode; return;} } else { curr = curr->right; if (curr == NULL) {parent->right = newNode; return;}} } // while }//else } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 41 / 47 Usuwanie danego elementu do BST - idea Cel: Usuniecie ˛ wezła ˛ z drzewa; Dane wejściowe: Dowiazanie ˛ do korzenia drzewa ‘Root’; Opis elementu usuwanego, np. wartość danej elementarnej; Uwagi: Przypadek 1: w˛ezeł jest liściem; Przypadek 2: w˛ezeł ma jednego potomka; Przypadek 3: w˛ezeł ma dwóch potomków; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 42 / 47 Przypadek 1: w˛ezeł jest liściem; 6 Usuwany w˛ezeł nie ma potomstwa, np. w˛ezeł 5. Jest to najprostsza sytuacja. Należy usunać ˛ ten element (zwolnić pamieć) i zadbać o to, aby jego rodzic wskazywał na NULL. 8 2 1 7 4 NIL Złożoność czasowa: O(wysokość drzewa) 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 5 Wykład 10 43 / 47 Przypadek 2: w˛ezeł ma jednego potomka; 6 Usuwany w˛ezeł posiada jednego potomka, np. 8 Należy tutaj zadbać (oprócz zwolnienia pamieci) ˛ o to, aby rodzic usuwanego elementu wskazywał teraz zamiast na usuwany element, na jego potomka . 1 Złożoność czasowa: O(wysokość drzewa) Bożena Woźna-Szcześniak (AJD) 8 2 3 Algorytmy i Struktury Danych. 7 4 NIL 5 Wykład 10 44 / 47 Przypadek 3: w˛ezeł ma dwóch potomków; Aby usunać ˛ taki w˛ezeł posiadajacy ˛ dwóch potomków, należy zamienić wartość z tego w˛ezła z wartościa˛ minimalna˛ w prawym poddrzewie usuwanego w˛ezła lub z wartościa˛ maksymalna˛ w lewym poddrzewie. Nastepnie, ˛ usuwamy element minimalny w prawym poddrzewie, ewentualnie maksymalny w lewym poddrzewie. Po takiej zamianie element minimalny (maksymalny) nie bedzie ˛ miał potomstwa lub co najwyżej bedzie ˛ miał jedynie prawego (lewego) syna. Bożena Woźna-Szcześniak (AJD) Złożoność czasowa: O(wysokość drzewa) Usuwany wezeł: ˛ 6 6 8 2 1 Algorytmy i Struktury Danych. 7 4 3 NIL 5 Wykład 10 45 / 47 Usuwany w˛ezeł: 6 Usuwany wezeł: ˛ 6 6 8 2 1 7 4 3 NIL 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 46 / 47 Usuwany w˛ezeł: 6 Najpierw szukamy elementu maksymalnego w lewym poddrzewie. Jest nim 5. Usuwany wezeł: ˛ 6 6 6 8 2 8 2 1 7 4 NIL 1 3 7 4 NIL 5 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. 5 Wykład 10 46 / 47 Usuwany w˛ezeł: 6 Nastepnie ˛ zamieniamy usuwany element (6) ze znalezionym. elementem maksymalnym w lewym poddrzewie (5). 6->5 8 2 1 7 4 3 NIL 5->6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 10 47 / 47 Usuwany w˛ezeł: 6 Nastepnie ˛ zamieniamy usuwany element (6) ze znalezionym. elementem maksymalnym w lewym poddrzewie (5). 6->5 7 4 3 5->6 Bożena Woźna-Szcześniak (AJD) 8 2 8 2 1 Usuwamy wezeł, ˛ który zawierał element maksymalny (5) w lewym poddrzewie. Teraz wezeł ˛ ten zawiera wartość 6. 5 NIL 1 7 4 3 Algorytmy i Struktury Danych. NIL 6 Wykład 10 47 / 47