Pagini recente » Cod sursa (job #972911) | Cod sursa (job #1224703) | Cod sursa (job #2406647) | Cod sursa (job #2788972) | Cod sursa (job #2898433)
#include <iostream>
#include <fstream>
std::fstream fileIn("planeta.in");
std::ofstream fileOut("planeta.out");
int nrArboriCautare[31];
void calculNrArbori(int nr) {
nrArboriCautare[0] = 1;
nrArboriCautare[1] = 1;
for(int i = 2; i <= nr; ++i) // pt fiecare i calculez nr de arbori binari de cautare care se pot scrie cu nr 1...i
for( int j = 0; j < i; ++j) { // al doilea for pt nr elem subarborele din stg
nrArboriCautare[i] += nrArboriCautare[j] * nrArboriCautare[i-j-1]; // i-j-1 = nr de elem pt subarborele din dr
}
}
/// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
///
void gasesteArboreRSD(int ii, int sf, int k) {
// deci avem inordinea (adica numerele in ordine de la 1 la n) si pe rand verific daca nr k e mai mare decat ce generez si scad pana ma apropii
int radCurenta;
for ( radCurenta = ii; radCurenta < sf ; ++radCurenta){
int nrSubarboreSt = radCurenta-ii;
int nrSubarboreDr = sf-radCurenta;
int nrArb = nrArboriCautare[nrSubarboreSt] * nrArboriCautare[nrSubarboreDr];
if(nrArb <= k){
k = k - nrArb;
}
else {
break;// cand se opreste stiu ca nu mai e indeplinita conditia si a sarit nrArb de k
}
}
std::cout << radCurenta << ' ';
fileOut << radCurenta << ' ';
if(radCurenta > ii) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore st -> tb sa ii gasim subarborele st
gasesteArboreRSD(ii, radCurenta - 1, k / nrArboriCautare[sf-radCurenta]);
}
if(radCurenta < sf) { // daca e cazul ca nodul tocmai pus in preordine ca radCurenta sa aiba subarbore drept -> tb sa ii gasim subarborele dr
gasesteArboreRSD(radCurenta + 1, sf , k % nrArboriCautare[sf-radCurenta]);
}
}
int main() {
int n, w;
fileIn >> n;
calculNrArbori(n);
fileIn >> w;
gasesteArboreRSD(1,n,w - 1);
for(int i = 0; i<= n; i++){
std::cout << nrArboriCautare[i] <<' ';
}
return 0;
}