Laboratorium 7
Transkrypt
Laboratorium 7
Imię i Nazwisko Data Ocena Laboratorium 7 Typy własne i drzewa binarne Problem. W praktyce często struktura danych jest drzewem binarnym. Na wykładzie 5 zostało pokazane drzewo genealogiczne jak na rys. 1. Jaromir Małgorzata Izabela NN Henryk Fryderyk NN NN NN NN NN Rys. 1.. Przykład drzewa genealogicznego datatype drzewo = Nieznany (* pra, pra ... przodek *) | Osoba of string * drzewo * drzewo; (* imiê, drzewo matki, drzewo ojca *) val drz = Osoba("Jaromir", (* student *) Osoba("Malgorzata", (* mama *) Osoba("Izabela",Nieznany,Nieznany), (* babcia ze strony mamy *) Osoba("Fryderyk",Nieznany,Nieznany)),(* dziadek ze strony mamy *) Osoba("Henryk",Nieznany,Nieznany)); (* tata *) Podane zostały funkcje realizujące przeszukiwanie drzew metodami1 1) preorder fun pre_analiza Nieznany = [] | pre_analiza (Osoba(n,lg,pg)) = n::(pre_analiza lg) @ (pre_analiza pg); (* 1 *) (* 2 *) 1 Wszystkie poniższe rysunki I definicje zaczerpnięto ze skryptu Prz autorstwa Krzysztofa Świdra: Algorytmy i struktury danych, 1 2) postorder fun post_analiza Nieznany = [] | post_analiza (Osoba(n,lg,pg)) = (post_analiza lg) @ (post_analiza pg) @ [n]; 3) inorder fun in_analiza Nieznany = [] | in_analiza (Osoba(n,lg,pg)) = (in_analiza lg) @ [n] @ (in_analiza pg) ; W literaturze podawane są pojęcia i definicje określające właściwości drzewa. Są to: Definicja 1 Pewien węzeł v wraz ze wszystkimi jego potomkami nazywamy poddrzewem. Definicja 2 Węzeł nie posiadający potomków nazywamy liściem. Definicja 3 Istnieje dokładnie jeden wierzchołek, do którego nie dochodzi żadna krawędź. Wierzchołek ten nazywamy korzeniem. Definicja 4 Głębokością węzła nazywamy długość drogi od korzenia do tego węzła. Definicja 5 Wysokość węzła oznacza maksymalną długość drogi od tego węzła do liścia. Definicja 6 Wysokością drzewa jest wysokość jego korzenia. Definicja 7 Regularnym drzewem binarnym nazywamy drzewo, w którym każdy z węzłów jest albo liściem, albo posiada jednocześnie prawego i lewego syna. 2 Definicja 8 Drzewo binarne nazywamy pełnym gdy istnieje liczba k taka, że dla każdego węzła o głębokości mniejszej niż k występują oba węzły będące jego synami, a każdy węzeł o głębokości k jest liściem. Polecenia2 do wykonania podczas zajęć3 1. Zdefiniuj typ danych umożliwiający zdefiniowanie drzewa liczbowego (jak w powyższych przykładach). 2. Zdefiniuj drzewo z wartościami jak na rysunku. 3. Napisz funkcję (zmodyfikuj funkcję z wykładu) przeszukującą drzewo metodą preorder. Wynik porównaj z podaną ilustracją. 4. Napisz funkcję (zmodyfikuj funkcję z wykładu) przeszukującą drzewo metodą postorder. Wynik porównaj z podaną ilustracją. 5. Napisz funkcję (zmodyfikuj funkcję z wykładu) przeszukującą drzewo metodą inorder. Wynik porównaj z podaną ilustracją. 6. Napisz funkcję zliczającą wszystkie elementy w drzewie. 7. Napisz funkcję wyszukującą wszystkie liście w drzewie (definicja 2). 8. Napisz funkcję sprawdzającą, czy element o podanej wartości należy do drzewa. 9. Zmodyfikuj powyższą funkcję tak, by zwracała poddrzewo dla którego podany element jest korzeniem (definicje 3 i 1). 10. Napisz funkcję obliczającą wysokość drzewa (definicja 6). Wskazówka. Wyznaczaj rekurencyjnie wysokość poddrzew i wybieraj wartość maksymalną. 11. Napisz funkcję sprawdzającą, czy drzewo jest regularne (definicja 8). Uzupełnij to drzewo tak, by było regularne i sprawdź to za pomocą tej funkcji. 12. Napisz funkcje określające wysokość i głębokość podanego węzła. 2 Programy i ich rezultaty z komentarzami należy pzesłać w postaci elektronicznej prowadzącemu zajęcia. 3. Wskazówka przed wykonaniem konkretnego polecenia zastanów się, która z metod przechodzenia drzewa będzie tu odpowiednia). 3