0650 – kNivel

From Bitnami MediaWiki
Revision as of 14:55, 27 December 2023 by Simina (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunț[edit | edit source]

Într-un arbore cu rădăcină, spunem că rădăcina este pe nivelul 1, fiii rădăcinii pe nivelul 2, fiii fiilor rădăcinii pe nivelul 3, etc.

Cerința[edit | edit source]

Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și o valoare k. Determinați nodurile situate pe nivelul k în arbore.

Date de intrare[edit | edit source]

Fișierul de intrare knivelIN.txt conține pe prima linie numărul de noduri n și valoarea k. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire knivelOUT.txt va conține pe prima linie, în ordine crescătoare, nodurile situate pe nivelul k în arbore.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor impuse".

Restricții și precizări[edit | edit source]

  • 1 ≤ n ≤ 100
  • în vectorul de tați rădăcina este marcată cu 0
  • pe nivelul k va exista cel puțin un nod

Exemplul 1:[edit | edit source]

knivelIN.txt

8 3
4 3 0 3 2 1 2 1

knivelOUT.txt

1 5 7

Exemplul 2:[edit | edit source]

knivelIN.txt

101 2
4 3 0 3 2 1 2 1

knivelOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare_restrictii(n, k):

   if 1 <= n <= 100:
       return True
   else:
       return False

def gaseste_noduri_pe_nivel(tati, nivel):

   noduri_pe_nivel = []
   for i in range(len(tati)):
       nivel_nod_curent = 1  # Nivelul rădăcinii
       parinte_curent = tati[i]
       while parinte_curent != 0:
           parinte_curent = tati[parinte_curent - 1]
           nivel_nod_curent += 1
       if nivel_nod_curent == nivel:
           noduri_pe_nivel.append(i + 1)
   return noduri_pe_nivel

def main():

   # Citirea datelor de intrare din fișier
   with open("knivelIN.txt", "r") as fisier_intrare:
       n, k = map(int, fisier_intrare.readline().split())
       tati = list(map(int, fisier_intrare.readline().split()))
   # Verificarea restricțiilor
   if not verificare_restrictii(n, k):
       with open("knivelOUT.txt", "w") as fisier_iesire:
           fisier_iesire.write("Datele nu corespund restrictiilor impuse")
       return
   # Găsirea nodurilor de pe nivelul k
   noduri_pe_nivel_k = gaseste_noduri_pe_nivel(tati, k)
   # Scrierea rezultatului în fișierul de ieșire
   with open("knivelOUT.txt", "w") as fisier_iesire:
       if noduri_pe_nivel_k:
           fisier_iesire.write(" ".join(map(str, noduri_pe_nivel_k)))
       else:
           fisier_iesire.write("Nu există noduri pe nivelul specificat")

if __name__ == "__main__":

   main()

</syntaxhighlight>