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.
W razie problemów technicznych ze Szkopułem, prosimy o kontakt mailowy pod adresem szkopul@fri.edu.pl.
Jeśli chciałbyś porozmawiać o zadaniach, rozwiązaniach lub problemach technicznych, odwiedź nasze serwery na Discordzie. Są one moderowane przez społeczność, ale członkowie zespołu wsparcia również aktywnie się tam udzielają.