0675 - Bi Frunze

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 frunzele acestui arbore.

Date de intrare[edit | edit source]

Fișierul de intrare bifrunzein.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 bifrunzeout.txt va conține pe prima linie numerele de ordine ale nodurilor din arbore care sunt frunze, în ordine crescătoare, separate prin exact un spațiu.

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]

bifrunzein.txt

6
2 3 5
6 0 6
1 0 0
7 1 2
4 0 0
10 0 0

bifrunzeout.txt

Datele de intrare corespund restrictiilor impuse
3 5 6

Exemplul 2:[edit | edit source]

bifrunzein.txt

bifrunze

bifrunzeout.txt

Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1" start="1">

def validare(n_noduri, copac): # functia de validare a datelor de intrare

   if n_noduri > 1000 or n_noduri < 1:
       raise ValueError
   for nod in copac:
       if len(nod) != 3 or not all(isinstance(i, int) for i in nod) or nod[1] > n_noduri or nod[2] > n_noduri:
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def frunze(n_noduri, copac): # functia de rezolvare

   frunze_copac = []
   for i in range(n_noduri):
       if copac[i][1] == 0 and copac[i][2] == 0:
           frunze_copac.append(i + 1)
   return frunze_copac


if __name__ == '__main__':

   file_in = open("bifrunzein.txt", "r")         # declararea fisierelor
   file_out = open("bifrunzeout.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       n = int(file_in.readline())      # citirea numarului de noduri
       arbore = []
       for _ in range(n):
           arbore.append(list(map(int, file_in.readline().split())))
       validare(n, arbore)                 # apelul functiei de validare
       frunze = frunze(n, arbore)          # apelul functiei de rezolvare
       file_out.write(' '.join(map(str, frunze)))
   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>


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.