U datoteci stablo.in
nalaze se dvije rije~ci, svaka
u svom redu, duljine <=70, sastavljene od istih slov~a (svako slovo se
pojavljuje to~cno dvaput, jednom u prvom a jednom u drugom redu).
One predstavljaju inorder i preorder obilazak nekog stabla ~ciji ~cvorovi
su slova. Va~s program treba:
Imamo dva stringa, pre
i in
, koji predstavljaju preorder i
inorder obilazak. To su argumenti rekurzivne funkcije, koja vra~ta stablo
(pointer na ~cvor) s tim obilascima.
Ako su prazni (ako je jedan prazan, oba su, jer su jednake
duljine), vratimo prazno stablo.
Ina~ce, pogledajmo prvo slovo pre
stringa, ono mora biti
korijen. Stavimo ga u korijen. Zatim na~demo to slovo u inorder obilasku
(mora se pojaviti to~cno jednom -- ako ne, javimo gre~sku). Ono nam prirodno
rastavlja in
string na dva stringa, in1
i in2
. Pogledajmo njihove duljine, neka su to l1
i l2
.
Mora biti l1+l2+1=n
, gdje je n
duljina od in
, kao i
duljina od pre
. Pa rastavimo string pre
bez prvog slova, koji je duljine
n-1
, na dva dijela duljine l1
i l2
, i ozna~cimo ih s pre1
i pre2
.
Sada rekurzivno pozovemo funkciju s in1
i pre1
kao inorder i preorder
obilaskom, i ono ~sto nam ona vrati, mora biti lijevo podstablo korijena K.
Stavimo to u lijevo podstablo.
Opet rekurzivno pozovemo funkciju s in2
i pre2
, i ono ~sto nam vrati
stavimo desno od K. Vratimo K.
Za 4 boda mo~zete pretpostaviti da su pre
i in
stvarno
preorder i inorder obilasci istog stabla. Za 5 bodova morate to i provjeriti (sve ~sto tada smijete pretpostaviti
je da su pre
i in
nizovi slova duljine najvi~se 70), te javiti gre~sku ako nisu.