Parcurgerea unui arbore binar in postordine
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
Fișierul de intrare postordine.in
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
Fișierul de ieșire postordine.out
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
1 ≤ n ≤ 1000
- valorile din nodurile arborelui vor fi mai mici sau egale cu
1.000.000
Exemplu
postordine.in
6 2 3 5 6 0 6 1 0 0 7 1 2 4 0 0 10 0 0
postordine.out
1 4 2 10 6 7
Explicație
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.
#include <iostream> #include <fstream> #define NN 1005 using namespace std; ifstream fin("postordine.in"); ofstream fout("postordine.out"); int n, info[NN], st[NN], dr[NN]; void citire() { fin >> n; for(int i =1 ; i <= n ; ++i) fin >> info[i] >> st[i] >> dr[i]; } int radacina() { int v[NN]; for(int i =1 ; i <= n ; ++i) v[i] = 0; for(int i = 1 ; i <= n ; ++i) { if(st[i] != 0) v[st[i]] = 1; if(dr[i] != 0) v[dr[i]] = 1; } for(int i = 1 ; i <= n ; ++i) if(v[i] == 0) return i; return 0; } void postordine(int x) { if(x != 0) { postordine(st[x]); postordine(dr[x]); fout << info[x] << " "; } } int main() { citire(); int r = radacina(); postordine(r); return 0; }