0675 - Bi Frunze
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.