0672 - Post 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 postordine (stâng, drept, rădăcină).

Date de intrare[edit | edit source]

Fișierul de intrare postordinein.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 postordineout.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 postordine.

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]

postordinein.txt

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

postordineout.txt

Datele de intrare corespund restrictiilor impuse
1 4 2 10 6 7 

Exemplul 2:[edit | edit source]

postordinein.txt

postordine

postordineout.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(nr_n, noduri):

   if nr_n > 1000:
       raise ValueError
   for node in noduri[1:]:
       if node.value > 1000000:
           raise ValueError
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def postordine(node):

   if node is not None:
       postordine(node.left)
       postordine(node.right)
       file_out.write(str(node.value) + " ")


class Node:

   def __init__(self, value, left=None, right=None):
       self.value = value
       self.left = left
       self.right = right


if __name__ == '__main__':

   file_in = open("postordinein.txt", "r")
   file_out = open("postordineout.txt", "w")
   try:
       n = int(file_in.readline())
       nodes = [None] + [Node(0) for _ in range(n)]
       root = None
       for i in range(1, n + 1):
           X, st, dr = map(int, file_in.readline().split())
           nodes[i].value = X
           if st != 0:
               nodes[i].left = nodes[st]
           if dr != 0:
               nodes[i].right = nodes[dr]
           if i == 4:  # nodul cu valoarea 7 este pe linia 4
               root = nodes[i]
       validare(n, nodes)
       postordine(root)
       file_out.close()
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>