0670 - Pre Ordine
Cerința[edit | edit source]
Considerăm un arbore binar cu n noduri în care fiecare nod este numerotat de la 1 la n și conține o valoare număr natural. Să se afișeze valorile din arbore în urma parcurgerii în preordine (rădăcină, stâng, drept).
Date de intrare[edit | edit source]
Fișierul de intrare preordinein.txt conține pe prima linie numărul n. Fiecare dintre următoarele n linii contine câte 3 numere X st dr; linia i + 1 din fișier conține informatiile despre nodul numerotat cu i: X reprezintă valoare din nod, st reprezintă numărul de ordine al descendentului stâng sau 0 dacă nodul i nu are descendent stâng, iar dr reprezintă numărul de ordine al descendentului drept sau 0 dacă nodul i nu are descendent drept.
Date de ieșire[edit | edit source]
Fișierul de ieșire preordineout.txt va conține pe prima linie n numere, separate prin exact un spațiu, reprezentând valorile din nodurile arborelui, obținute în urma parcurgerii în preordine.
Restricții și precizări[edit | edit source]
- 1 ≤ n ≤ 1000
- valorile din nodurile arborelui vor fi mai mici sau egale cu 1.000.000
Exemplul 1:[edit | edit source]
preordinein.txt
6 2 3 5 6 0 6 1 0 0 7 1 2 4 0 0 10 0 0
preordineout.txt
Datele de intrare corespund restrictiilor impuse 7 2 1 4 6 10
Exemplul 2:[edit | edit source]
preordinein.txt
preordine
preordineout.txt
Datele de intrare nu corespund restrictiilor impuse
Explicație[edit | edit source]
Exemplul corespunde arborelui de mai jos, în care au fost marcate cu albastru valorile din noduri, iar cu roșu numerele de ordine ale nodurilor.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1" start="1">
def validare(n_noduri, arbori): # functia de validare a datelor de intrare
if n_noduri > 1000 or n_noduri < 1: raise ValueError
for nod in arbori: if nod[0] > 1000000 or nod[0] < 1 or nod[1] < 0 or nod[2] < 0: raise ValueError
file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def preordine(arbori): # functia de rezolvare
def dfs(nod): if nod == 0: return file_out.write(str(arbori[nod - 1][0]) + " ") dfs(arbori[nod - 1][1]) dfs(arbori[nod - 1][2])
dfs(4) # pornim de la nodul cu numarul 4, care este radacina in exemplul tau
if __name__ == '__main__':
file_in = open("preordinein.txt", "r") # declararea fisierelor file_out = open("preordineout.txt", "w") # fisierul out trebuie declarat cu optiunea "w" (write)
try: n = int(file_in.readline()) # citirea numarului de noduri arbore = [list(map(int, file_in.readline().split())) for _ in range(n)] # citirea arborelui
validare(n, arbore) # apelul functiei de validare preordine(arbore) # apelul functiei de rezolvare
except ValueError: file_out.write("Datele de intrare nu corespund restrictiilor impuse") except IndexError: file_out.write("Datele de intrare nu corespund restrictiilor impuse")
</syntaxhighlight>