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 ­

Podobne dokumenty