Drzewa wyszukiwań binarnych (BST)

Podobne dokumenty
Porządek symetryczny: right(x)

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Drzewa poszukiwań binarnych

Wykład 6. Drzewa poszukiwań binarnych (BST)

Wykład 2. Drzewa poszukiwań binarnych (BST)

Listy, kolejki, stosy

Wysokość drzewa Głębokość węzła

Drzewa poszukiwań binarnych

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Algorytmy i Struktury Danych.

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Algorytmy i Struktury Danych.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

Algorytmy i Struktury Danych

Teoretyczne podstawy informatyki

Algorytmy i Struktury Danych

Drzewa czerwono-czarne.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Algorytmy i Struktury Danych

ALGORYTMY I STRUKTURY DANYCH

Drzewo binarne BST. LABORKA Piotr Ciskowski

Podstawy Informatyki. Metody dostępu do danych

Wykład 8. Drzewa AVL i 2-3-4

Teoretyczne podstawy informatyki

Twój wynik: 4 punktów na 6 możliwych do uzyskania (66,67 %).

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

Wstęp do programowania

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Abstrakcyjne struktury danych w praktyce

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Algorytmy i Struktury Danych, 9. ćwiczenia

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Algorytmy i Struktury Danych. (c) Marcin Sydow. Słownik. Tablica mieszająca. Słowniki. Słownik uporządkowany. Drzewo BST.

Tadeusz Pankowski

Wykład 3. Drzewa czerwono-czarne

ALGORYTMY I STRUKTURY DANYCH

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Poprawność semantyczna

Programowanie komputerów. Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Algorytmy i struktury danych Struktury danych - drzewa IS/IO, WIMiIP

Lista liniowa dwukierunkowa

Stos LIFO Last In First Out

Struktury danych. przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych.

Struktury danych: stos, kolejka, lista, drzewo

Programowanie obiektowe i C++ dla matematyków

Struktury Danych i Złożoność Obliczeniowa

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

Plan wykładu. Klucz wyszukiwania. Pojęcie indeksu BAZY DANYCH. Pojęcie indeksu - rodzaje indeksów Metody implementacji indeksów.

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Algorytmy i struktury danych. wykład 5

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Algorytmy i Struktury Danych.

Algorytmy i struktury danych Struktury danych IS/IO, WIMiIP

Algorytmy i struktury danych

Wstęp. #define include include include include include include

Haszowanie. dr inż. Urszula Gałązka

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

Wstęp do programowania

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

KARTA KURSU. Algorytmy, struktury danych i techniki programowania. Algorithms, Data Structures and Programming Techniques

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Koszt zamortyzowany. Potencjał - Fundusz Ubezpieczeń Kosztów Algorytmicznych

Algorytm selekcji Hoare a. Łukasz Miemus

Sortowanie bąbelkowe

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie obiektowe i C++ dla matematyków

Bazy danych. Andrzej Łachwa, UJ, /15

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Podstawy programowania wykład

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

część 16 struktury rekurencyjne i ich zastosowania drzewa binarne, algorytmy rekurencyjne dla drzew binarnych

Algorytmy i struktury danych

Sortowanie - wybrane algorytmy

Ogólne wiadomości o grafach

Algorytmy i Struktury Danych.

PODSTAWY INFORMATYKI wykład 6.

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Matematyka dyskretna - 7.Drzewa

Drzewa podstawowe poj

Algorytmy zachłanne. dr inż. Urszula Gałązka

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

ALGORYTMY I STRUKTURY DANYCH

Rekurencyjne struktury danych

Podstawy informatyki 2

Transkrypt:

Drzewa wyszukiwań binarnych (BST) Krzysztof Grządziel 12 czerwca 2007 roku 1 Drzewa Binarne Drzewa wyszukiwań binarnych, w skrócie BST (od ang. binary search trees), to szczególny przypadek drzew binarnych. Są to struktury, na których można wykonywać różne operacje właściwe dla zbiorów dynamicznych, takie jak SEARCH, MINIMUM, MA- XIMUM, PREDECESSOR, SUCCESSOR, INSERT, DELETE. Drzewo wyszukiwań może więc być użyte zarówno jako słownik, jak i jako kolejka priorytetowa. Podstawowe operacje na drzewach wyszukiwań binarnych wymagają czasu proporcjonalnego do wysokości drzewa. W pełnym drzewie binarnym o n węzłach takie operacje działają w przypadku pesymistyzcznym w czasie θ(lg n). Jeśli jednak drzewo składa się z jednej gałezi o długości n, to te same operacje wymagają w przypadku pesymistycznym czasu θ(n). 1.1 Co to jest drzewo wyszukiwań binarnych? Rysunek 1: Drzewo poszukiwań binarnych o wadze równej 9, a wysokości równej 3; wierzchołek 8 jest tu korzeniem, a wierzchołki 1, 4, 7 i 13, to liście. Drzewo wyszukiwań binarnych, ma strukturę drzewa binarnego. Takie drzewa można zrealizować za pomocą struktury danych z dowiązaniami, w której każdy węzeł jest obiektem. Oprócz pola key (ew. danych dodatkowych), każdy węzeł zawiera pola lef t, right, oraz p (parent), które wskazują, odpowiednio, na jego lewego syna, prawego syna, oraz rodzica. Jeśli węzeł nie ma następnika albo poprzednika, to odpowiednie pole ma wartość 1

N IL. Węzeł w korzeniu drzewa jest jedynym węzłem, którego pole wskazujące na ojca ma wartość NIL. Klucze są przechowywane w drzewie BST w taki sposób, ale spełniona była własność drzewa BST: Niech x będzie węzłem drzewa BST. Jeśli y jest węzłem znajdującym się w lewym poddrzewie węzła x, to key[y] key[x]. Jeśli y jest węzłem znajdującym się w prawym poddrzewie węzła x, to key[y] key[x]. 1.2 Wybrane złożoności Wypisanie drzewa θ(n) Wyszukanie O(h) Znajdowanie minimum O(h) Znajdowanie maksimum O(h) Znajdowanie poprzednika O(h) Znajdowanie następnika O(h) Wstawianie O(h) Usuwanie O(h) gdzie n - ilość węzłów w drzewie, h - wysokość drzewa 2 Funkcje 2.1 echo void echo(bst *root) Wypisuje na standardowe wyjście key danego węzła. 2.2 inorder void inorder(bst *root) Przechodzenie drzewa BST metoda inorder. Klucz drzewa zostaje wypisany między wartościami jego lewego poddrzewa, a wartościami z jego prawego poddrzewa. 2.3 preorder void preorder(bst *root) Przechodzenie drzewa BST metoda preorder. Wypisuje klucz korzenia przed wypisaniem wartości znajduących się w obu poddrzewach. 2

2.4 postorder void postorder(bst *root) Przechodzenie drzewa BST metoda postorder. Wypisuje klucz korzenia po wypisaniu wartości znajduących się w obu poddrzewach. 2.5 postorderinverse void postorderinverse(bst *root) Przechodzenie drzewa BST metoda odwrotną do preorder. Wypisuje klucze korzenia w kolejności odwrotnej do preorder. 2.6 search BST *search(bst *root, int val) Wyszukiwanie węzła (rekurencyjnie), który zawiera klucz val. val - szukany klucz 2.7 isearch BST *isearch(bst *root,int val) Iteracyjne wyszukiwanie węzła, który zawiera klucz val. Uwaga! Efektywniejsze od serach(bst*,int); val - szukany klucz 2.8 min BST *min(bst *root) Znajdowanie najmniejszej wartości w drzewie. 3

2.9 max BST *max(bst *root) Znajdowanie największej wartości w drzewie. 2.10 trace void trace(bst *root, int v1, int v2) Znajduje droge pomiedzy dwoma kluczami. v1 - klucz początkowy v2 - klucz końcowy 2.11 draw void draw(bst* root) Rysuje drzewo. 2.12 nastepnik BST *nastepnik(bst *root) Znajduje następnik danego węzła. root - wskaznik to węzła 2.13 poprzednik BST *poprzednik(bst *root) Znajduje poprzednika danego węzła. root - wskaznik to węzła 2.14 del BST *del(bst *root, int val) Usuwa węzeł o danym kluczu val. val - wartość klucza 4

2.15 add BST *add(bst *root, int val) Dodaje węzeł o kluczu val do drzewa wyszukiwań binarnych. val - wartość klucza 2.16 waga int waga(bst *root) Zwraca ilość węzłów w drzewie. 3 Implementacja 3.1 Plik nagłówkowy 1 #ifndef INC BST H 2 #define INC BST H 3 4 typedef struct drzewo BST; 5 struct drzewo { 6 int key ; 7 BST l e f t ; 8 BST r i g h t ; 9 BST p ; // parent 10 } ; 11 Listing 1: bst.h 12 extern void echo (BST r o o t ) ; 13 extern void i n o r d e r (BST r o o t ) ; 14 extern void p r e o r d e r (BST r o o t ) ; 15 extern void p o s t o r d e r (BST r o o t ) ; 16 extern void p o s t o r d e r i n v e r s e (BST r o o t ) ; 17 extern BST s e a r c h (BST root, int v a l ) ; 18 extern BST i s e a r c h (BST root, int v a l ) ; 19 extern BST min (BST r o o t ) ; 20 extern BST max(bst r o o t ) ; 21 extern void t r a c e (BST root, int v1, int v2 ) ; 22 extern void draw (BST r o o t ) ; 23 extern BST n a s t e p n i k (BST r o o t ) ; 24 extern BST poprzednik (BST r o o t ) ; 25 extern BST d e l (BST root, int v a l ) ; 26 extern BST add (BST root, int v a l ) ; 27 extern int waga (BST r o o t ) ; 28 29 #endif 3.2 Funkcje drzewa BST 1 #include<s t d i o. h> 2 #include<malloc. h> 3 #include bst. h 4 Listing 2: Implementacja operacji na drzewie BST (bst.c) 5 // w y s w i e t l a key z podanego wskaznika 6 void echo (BST r o o t ){ 5

7 i f ( r o o t!= NULL) p r i n t f ( %d\n, root >key ) ; 8 else p r i n t f ( brak \n ) ; 9 return ; 10 } 11 12 // w y p i s u j e drzewo w porzadku inoder ( posortowane rosnaco ) 13 void i n o r d e r (BST r o o t ){ 14 i f ( r o o t!= NULL){ 15 i n o r d e r ( root >l e f t ) ; 16 p r i n t f ( %d, root >key ) ; 17 i n o r d e r ( root >r i g h t ) ; 18 } 19 return ; 20 } 21 22 // wypisywanie drzewa w porzadku preorder 23 void p r e o r d e r (BST r o o t ){ 24 i f ( r o o t!= NULL){ 25 p r i n t f ( %d, root >key ) ; 26 p r e o r d e r ( root >l e f t ) ; 27 p r e o r d e r ( root >r i g h t ) ; 28 } 29 return ; 30 } 31 32 // wypisywanie drzewa w porzadku p o s t o r d e r 33 void p o s t o r d e r (BST r o o t ){ 34 i f ( r o o t!= NULL){ 35 p o s t o r d e r ( root >l e f t ) ; 36 p o s t o r d e r ( root >r i g h t ) ; 37 p r i n t f ( %d, root >key ) ; 38 } 39 return ; 40 } 41 42 // wypisywanie drzewa w porzadku odwrotnym do p o s t o r d e r 43 void p o s t o r d e r i n v e r s e (BST r o o t ){ 44 i f ( r o o t!= NULL){ 45 p r i n t f ( %d, root >key ) ; 46 p o s t o r d e r i n v e r s e ( root >r i g h t ) ; 47 p o s t o r d e r i n v e r s e ( root >l e f t ) ; 48 } 49 return ; 50 } 51 52 // s z u k a n i e r e k u r e n c y j n e 53 BST s e a r c h (BST root, int v a l ){ 54 i f ( ( r o o t == NULL) ( v a l == root >key ) ) return r o o t ; 55 i f ( v a l < root >key ){ 56 return s e a r c h ( root >l e f t, v a l ) ; 57 } 58 else { 59 return s e a r c h ( root >r i g h t, v a l ) ; 60 } 61 return r o o t ; 62 } 63 64 // p r z e s z u k i w a n i e i t e r a c y j n e ( e f e k t y w n i e j s z e ) 65 BST i s e a r c h (BST root, int v a l ){ 66 while ( ( r o o t!= NULL) && ( v a l!= root >key ) ) { 67 i f ( v a l < root >key ) r o o t = root >l e f t ; 68 else r o o t = root >r i g h t ; 69 } 70 return r o o t ; 71 } 72 73 // znajdowanie minimum 74 BST min (BST r o o t ){ 75 while ( root >l e f t!= NULL){ 76 r o o t = root >l e f t ; 77 } 78 return r o o t ; 79 } 6

80 81 // znajdowanie maksimum 82 BST max(bst r o o t ){ 83 while ( root >r i g h t!= NULL){ 84 r o o t = root >r i g h t ; 85 } 86 return r o o t ; 87 } 88 89 // wskazywanie d r o g i pomiedzy dwoma elementami 90 void t r a c e (BST root, int v1, int v2 ){ 91 BST x = i s e a r c h ( root, v1 ) ; 92 BST y = i s e a r c h ( root, v2 ) ; 93 94 i f ( v1 > v2 ){ 95 int tmp=v2 ; 96 v2=v1 ; 97 v1=tmp ; 98 } 99 // p r i n t f ( \ t k e y :%d\n, root >key ) ; 100 i f ( r o o t==null x==null y==null){ 101 p r i n t f ( brak d r o g i ) ; 102 } 103 else { 104 i f ( v1<root >key && v2 < root >key ){ 105 t r a c e ( root >l e f t, v1, v2 ) ; 106 } 107 i f ( v1>root >key && v2 > root >key ){ 108 t r a c e ( root >r i g h t, v1, v2 ) ; 109 } 110 i f ( v1<=root >key && v2 >= root >key ){ 111 while ( x!= r o o t ){ 112 p r i n t f ( %d, x >key ) ; 113 x=x >p ; 114 } 115 p r i n t f ( %d, x >key ) ; 116 while ( r o o t!= y ){ 117 i f ( y >key < root >key ){ 118 r o o t = root >l e f t ; 119 p r i n t f ( %d, root >key ) ; 120 } 121 i f ( y >key > root >key ){ 122 r o o t = root >r i g h t ; 123 p r i n t f ( %d, root >key ) ; 124 } 125 } 126 } 127 } 128 } 129 130 // r y s u j e drzewo 131 void draw (BST r o o t ){ 132 i f ( r o o t!= NULL){ 133 p r i n t f ( % 3d, root >key ) ; 134 i f ( root >l e f t == NULL && root >r i g h t == NULL) ; 135 else { 136 p r i n t f ( ( ) ; 137 i f ( root >l e f t!= NULL) p r i n t f ( % 3d,, root >l e f t >key ) ; else p r i n t f (., ) ; 138 i f ( root >r i g h t!= NULL) p r i n t f ( %3d, root >r i g h t >key ) ; else p r i n t f (. ) ; 139 p r i n t f ( ) ) ; 140 } 141 p r i n t f ( \n ) ; 142 } 143 i f ( root >l e f t!=null) draw ( root >l e f t ) ; 144 i f ( root >r i g h t!=null) draw ( root >r i g h t ) ; 145 } 146 147 // s u c c e s s o r 148 BST n a s t e p n i k (BST r o o t ){ 149 BST y = r o o t ; 150 7

151 // e x c e p t i o n 152 i f ( r o o t==null) return y ; 153 154 i f ( root >r i g h t!= NULL){ 155 return min ( root >r i g h t ) ; 156 } 157 y = root >p ; 158 while ( y!= NULL && r o o t == y >r i g h t ){ 159 r o o t = y ; 160 y = y >p ; 161 } 162 return y ; 163 } 164 165 // p r e d e c e s s o r 166 BST poprzednik (BST r o o t ){ 167 BST y = r o o t ; 168 169 // e x c e p t i o n 170 i f ( r o o t==null) return y ; 171 172 i f ( root >l e f t!= NULL){ 173 return max( root >l e f t ) ; 174 } 175 y = root >p ; 176 while ( y!=null && r o o t == y >l e f t ){ 177 r o o t = y ; 178 y = y >p ; 179 } 180 return y ; 181 } 182 183 // usuwanie 184 BST d e l (BST root, int v a l ){ 185 // w s k a z n i k i pomocnicze 186 BST x = r o o t ; 187 BST y = (BST ) malloc ( s i z e o f (BST ) ) ; 188 // to co usuwamy 189 BST d e l = s e a r c h ( root, v a l ) ; 190 191 i f ( d e l == NULL) return y ; 192 193 i f ( del >l e f t==null del >r i g h t==null) y=d e l ; 194 else y=n a s t e p n i k ( d e l ) ; 195 196 i f ( y >l e f t!=null) x=y >l e f t ; 197 else x=y >r i g h t ; 198 199 i f ( x!=null) x >p = y >p ; 200 201 i f ( y >p == NULL) r o o t = x ; 202 else i f ( y == y >p >l e f t ) y >p >l e f t = x ; 203 else y >p >r i g h t = x ; 204 205 i f ( y!= d e l ){ 206 del >key = y >key ; 207 } 208 return y ; 209 } 210 211 // dodawanie 212 BST add (BST root, int v a l ){ 213 BST x = r o o t ; 214 215 // nowy o b i e k t, k t o r y wpinany j e s t do drzewa 216 BST nowe = (BST ) malloc ( s i z e o f (BST ) ) ; 217 nowe >key = v a l ; 218 nowe >p = nowe >l e f t = nowe >r i g h t = NULL; 219 220 BST y = NULL; 221 while ( x!= NULL){ 222 y = x ; 223 i f ( v a l < x >key ) x = x >l e f t ; 8

224 else x = x >r i g h t ; 225 } 226 nowe >p = y ; 227 i f ( y == NULL) r o o t = nowe ; 228 else { 229 i f ( nowe >key < y >key ) y >l e f t = nowe ; 230 else y >r i g h t = nowe ; 231 } 232 return r o o t ; 233 } 234 235 // o b l i c z a i l o s c wezlow w drzewie 236 int waga (BST r o o t ){ 237 i f ( r o o t == NULL) return 0 ; 238 else return waga ( root >l e f t ) + waga ( root >r i g h t ) + 1 ; 239 } 3.3 Przykład użycia 1 #include<s t d i o. h> 2 #include<malloc. h> 3 #include bst. h 4 5 int main ( ) { 6 BST t r e e = NULL; 7 8 t r e e = add ( t r e e, 1 5 ) ; 9 t r e e = add ( t r e e, 6 ) ; 10 t r e e = add ( t r e e, 3 ) ; 11 t r e e = add ( t r e e, 7 ) ; 12 t r e e = add ( t r e e, 2 ) ; 13 t r e e = add ( t r e e, 4 ) ; 14 t r e e = add ( t r e e, 1 3 ) ; 15 t r e e = add ( t r e e, 9 ) ; 16 t r e e = add ( t r e e, 1 8 ) ; 17 t r e e = add ( t r e e, 1 7 ) ; 18 t r e e = add ( t r e e, 2 0 ) ; 19 Listing 3: Przykład użycia 20 p r i n t f ( i n o r d e r ( ) : ) ; 21 i n o r d e r ( t r e e ) ; 22 p r i n t f ( \ n p o s t o r d e r ( ) : ) ; 23 p o s t o r d e r ( t r e e ) ; 24 p r i n t f ( \ n p o s t o r d e r i n v e r s e ( ) : ) ; 25 p o s t o r d e r i n v e r s e ( t r e e ) ; 26 p r i n t f ( \ n p r e o r d e r ( ) : ) ; 27 p r e o r d e r ( t r e e ) ; 28 p r i n t f ( \ nsearch ( 2 ) : ) ; 29 s e a r c h ( t r e e, 2 ) ; 30 p r i n t f ( \ nsearch ( 7 ) : ) ; 31 s e a r c h ( t r e e, 7 ) ; 32 p r i n t f ( \nmin ( 7 ) : ) ; 33 echo ( min ( t r e e ) ) ; 34 p r i n t f ( max ( 7 ) : ) ; 35 echo (max( t r e e ) ) ; 36 int nst =15; 37 p r i n t f ( Nastepnik %d :, nst ) ; 38 echo ( n a s t e p n i k ( s e a r c h ( t r e e, nst ) ) ) ; 39 p r i n t f ( Poprzednik %d :, nst ) ; 40 echo ( poprzednik ( s e a r c h ( t r e e, nst ) ) ) ; 41 d e l ( t r e e, nst ) ; 42 p r i n t f ( Waga drzewa : %d\n, waga ( t r e e ) ) ; 43 p r i n t f ( Droga ( 1 7, 2 0 ) : ) ; 44 t r a c e ( t r e e, 1 7, 2 0 ) ; 45 p r i n t f ( \ndroga ( 2 0, 1 7 ) : ) ; 46 t r a c e ( t r e e, 2 0, 1 7 ) ; 47 p r i n t f ( \ndroga ( 2 0, 2 6 ) : ) ; 48 t r a c e ( t r e e, 2 0, 2 6 ) ; 49 p r i n t f ( \n ) ; 50 return 0 ; 51 } 9

Literatura [1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Wprowadzenie do algorytmów, WNT, Warszawa 2005. 10