0672 - Post Ordine
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>