0670 - Pre Ordine

From Bitnami MediaWiki

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>