In the event of technical difficulties with Szkopuł, please contact us via email at [email protected].
If you would like to talk about tasks, solutions or technical problems, please visit our Discord servers. They are moderated by the community, but members of the support team are also active there.
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ł (oprócz korzenia) ma swojego (dokładnie jednego) ojca . Jeśli węzeł jest ojcem , to jest synem . Węzły nie mające synów nazywamy liśćmi. Synów węzła , ich synów, synów ich synów itd. nazywamy potomkami węzła . Każdy węzeł - oprócz korzenia - jest potomkiem korzenia. Każdy węzeł ma swój poziom. Korzeń ma poziom , 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 , 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
Jest to ciąg liczb. Pierwszy element ciągu jest równy (zero),
zaś dla , -ty wyraz ciągu jest numerem ojca węzła
.
Zapis nawiasowy
Każdemu węzłowi przyporządkowujemy napis złożony z nawiasów. Liściom
przyporządkowujemy napis . Każdemu z pozostałych węzłów w
przyporządkowujemy napis postaci: , gdzie i
oznaczają napisy przyporządkowane odpowiednio lewemu i prawemu
synowi . Napis przyporządkowany korzeniowi jest zapisem nawiasowym
drzewa.
Zapis poziomowy
Jest to ciąg poziomów kolejnych liści drzewa (zgodnie z przyjętą
numeracją).
Drzewo przedstawione na rysunku można opisać następująco:
Zapis genealogiczny | 0 1 2 2 4 4 1 7 7 |
Zapis nawiasowy | ((()(()()))(()())) |
Zapis poziomowy | 2 3 3 2 2 |
Napisz program, który wczytuje ze standardowego wejścia ciąg liczb i bada, czy jest on zapisem poziomowym pełnego drzewa binarnego. Jeśli nie jest, to zapisuje w standardowym wyjściu jeden wyraz NIE, a jeśli jest, to znajduje dwa inne zapisy tego drzewa (genealogiczny i nawiasowy) i zapisuje je w standardowym wyjściu.
W pierwszym wierszu standardowego wejścia 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 standardowym wejściu są zapisane poprawnie. Twój program nie musi tego sprawdzać.
Standardowe wyjście powinno zawierać:
Dla danych wejściowych:
5 2 2 3 3 2
poprawną odpowiedzią jest:
0 1 2 2 1 5 6 6 5 ((()())((()())()))
Dla danych wejściowych:
4 1 2 2 3
poprawną odpowiedzią jest:
NIE
Autor zadania: Wojciech Rytter.