|
|||||||||||||||||||||
|
Drzewa
Drzewa występują bardzo często w informatyce. W odróżnieniu od drzew w naturze drzewa w informatyce rosną do góry nogami: korzeń jest na górze, a liście są na dole. Drzewo składa się z elementów zwanych węzłami. Jeden z węzłów jest korzeniem. Każdy węzeł w (oprócz korzenia) ma swojego (dokładnie jednego) ojca v. Jeśli węzeł v jest ojcem w, to w jest synem v. Węzły nie mające synów nazywamy liśćmi. Synów węzła w, ich synów, synów ich synów itd. nazywamy potomkami węzła w. Każdy węzeł - oprócz korzenia - jest potomkiem korzenia. Każdy węzeł ma swój poziom. Korzeń ma poziom 0, a synowie mają poziom o jeden większy od swoich ojców. Drzewo jest pełnym drzewem binarnym wtedy i tylko wtedy, gdy każdy węzeł ma dokładnie dwóch lub zero synów. W drzewach binarnych rozróżniamy lewego i prawego syna.
Powyższy rysunek przedstawia przykładowe pełne drzewo binarne. Węzły tego drzewa są ponumerowane w specjalnej kolejności (nazywanej w literaturze angielskiej preorder). W kolejności tej korzeń ma numer 1, ojciec poprzedza synów, a lewy syn i dowolny jego potomek ma numer mniejszy niż prawy syn i każdy jego potomek. Jest wiele sposobów zapisu pełnych drzew binarnych z taką numeracją węzłów. Oto trzy z nich. Zapis genealogiczny Zapis nawiasowy Zapis poziomowy Drzewo przedstawione na rysunku można opisać następująco:
ZadanieNapisz program, który wczytuje z pliku tekstowego DRZ.IN ciąg liczb i bada, czy jest on zapisem poziomowym pełnego drzewa binarnego. Jeśli nie jest, to zapisuje w pliku tekstowym DRZ.OUT jeden wyraz NIE, a jeśli jest, to znajduje dwa inne zapisy tego drzewa (genealogiczny i nawiasowy) i zapisuje je w pliku tekstowym DRZ.OUT.
WejścieW pierwszym wierszu pliku DRZ.IN zapisana jest dodatnia liczba wyrazów ciągu (nie większa niż 2500). W drugim wierszu zapisane są kolejne wyrazy ciągu oddzielone pojedynczymi odstępami. Liczby w pliku DRZ.IN są zapisane poprawnie. Twój program nie musi tego sprawdzać.
WyjściePlik DRZ.OUT powinien zawierać
PrzykładyDla pliku DRZ.IN:5 2 2 3 3 2 Twój program powinien utworzyć następujący plik DRZ.OUT: Dla pliku DRZ.IN: Twój program powinien utworzyć plik DRZ.OUT: Twój program powinien szukać pliku DRZ.IN w katalogu bieżącym i tworzyć plik DRZ.OUT również w bieżącym katalogu. Plik zawierający napisany przez Ciebie program w postaci źródłowej powinien mieć nazwę DRZ.???, gdzie zamiast ??? należy wpisać co najwyżej trzyliterowy skrót nazwy użytego języka programowania. Ten sam program w postaci wykonywalnej powinien być zapisany w pliku DRZ.EXE. |