Cod sursa(job #1714521)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 8 iunie 2016 16:11:44
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.66 kb
#include <cstdio>
#include <cstdlib>
FILE*fi,*fout;
struct Nod{
   Nod *fiust;
   Nod *fiudr;
   int val;
   int dim;
   int sum;
};
struct Pereche{
   Nod *primul;
   Nod *aldoilea;
};
Nod *gol=new Nod{nullptr,nullptr,0,0,0};

Nod *creeaza_nod(int val){
    return new Nod{gol,gol,val,1,val};
}

Nod *creeaza_nod(Nod *rad,Nod *fiust,Nod *fiudr){
    return new Nod{fiust,fiudr,rad->val,fiust->dim+1+fiudr->dim,fiust->sum+rad->val+fiudr->sum};
}

Nod *modifica_nod(Nod *rad,Nod *fiust,Nod *fiudr){
    *rad=Nod{fiust,fiudr,rad->val,fiust->dim+1+fiudr->dim,fiust->sum+rad->val+fiudr->sum};
    return rad;
}

char exista(Nod *rad,int val){
    if(rad==gol)
         return 0;
    else if(rad->val==val)
        return 1;
    else if(rad->val<val)
        return exista(rad->fiudr,val);
    else // if(rad->val>val)
        return exista(rad->fiust,val);
}
Nod *adauga(Nod *rad,int val){
    if(rad==gol)
        return creeaza_nod(val);
    else if(rad->val==val)
        return rad;
    else if(rad->val<val)
        return creeaza_nod(rad,rad->fiust,adauga(rad->fiudr,val));
    else // if(rad->val>val)
        return creeaza_nod(rad,adauga(rad->fiust,val),rad->fiudr);
}
struct Pereche desparte(Nod *rad,int val){
    if (rad==gol)
        return Pereche{gol,gol};
    else if(rad->val>val) {
        Pereche p = desparte(rad->fiust,val);
        return Pereche{
            p.primul,
            creeaza_nod(rad,p.aldoilea,rad->fiudr)
        };
    }else{
        Pereche p = desparte(rad->fiudr,val);
        return Pereche{
           creeaza_nod(rad,rad->fiust,p.primul),
           p.aldoilea
        };
    }
};
Nod *uneste(Nod *unu,Nod *doi){
    if (unu==gol)
        return doi;
    else if(doi==gol)
        return unu;
    else if(rand() % 2)
        return creeaza_nod(unu,unu->fiust,uneste(unu->fiudr,doi));
    else
        return creeaza_nod(doi,uneste(unu,doi->fiust),doi->fiudr);
};
Nod *sterge(Nod *rad,int val){
    if(rad==gol)
        return rad;
    else if(rad->val==val)
        return uneste(rad->fiust,rad->fiudr);
    else if(rad->val<val)
        return creeaza_nod(rad,rad->fiust,sterge(rad->fiudr,val));
    else
        return creeaza_nod(rad,sterge(rad->fiust,val),rad->fiudr);
}
int elementul_N(Nod *rad,int n){
    if(rad->fiust->dim==n)
        return rad->val;
    else if(rad->fiust->dim>n)
        return elementul_N(rad->fiust,n);
    else
        return elementul_N(rad->fiudr,n-rad->fiust->dim-1);
}
void afiseaza(Nod *rad,int adancime=0){
    if(rad!=gol) {
        afiseaza(rad->fiust,adancime+1);
        for(int i = 0; i < adancime; i++){
            fprintf(fout, " ");
        }
        fprintf(fout,"%d\t%d\t%d\n" ,rad->val,rad->dim,rad->sum);
        afiseaza(rad->fiudr,adancime+1);
    }
}
int main(){
    fi=fopen("BST.in" ,"r");
    fout=fopen("BST.out" ,"w");

    Nod* n = gol;
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 6);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 5);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 3);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 7);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 2);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 8);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = adauga(n, 4);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");
    n = sterge(n, 6);
    afiseaza(n);
    fflush(fout);
    fprintf(fout,"\n");

    fclose(fi);
    fclose(fout);
    return 0;
}