#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct dugum{
        int veri;
        dugum * sol ;
        dugum * sag;
};

dugum * ekle(dugum *agac , int eklenecek){
      if(agac==NULL){
                     dugum * gecici = (dugum *) malloc(sizeof(dugum));
                     gecici->veri=eklenecek;
                     gecici->sol = NULL;
                     gecici->sag = NULL;
                     return gecici;               
      }
      else if (eklenecek < agac->veri){
                     agac->sol = ekle(agac->sol,eklenecek);    
      }
      else if ( eklenecek > agac->veri){
                     agac->sag = ekle(agac->sag,eklenecek);    
      } 
      else{
            // eşitse işlem yapma     
      }
      return agac;
}

void bastir(dugum * agac){ // NLR
     printf("%d->",agac->veri);
     if(agac->sol!=NULL){
                         bastir(agac->sol);
     }  
     if (agac->sag!=NULL){
                          bastir(agac->sag);
     }
}
dugum * enkucuksag(dugum * agac){
      if(agac == NULL)
              return NULL; 
     /* printf("enkucuksag : %d",agac->veri);
      fflush(stdout);*/
      dugum * gecici = agac;
      if(gecici->sag !=NULL)
            gecici = gecici -> sag ;
      else{
         //  perror("gecti");
           return NULL;
      }
      if(gecici->sol == NULL)
                     return gecici; 
      while (gecici->sol!=NULL){
            gecici= gecici ->sol;      
      }  
  
     // perror("dondu");
      return gecici;
      
}

dugum * sil (dugum * agac, int silsayi){

     if(agac==NULL)
                   return NULL;
    /* printf("agac: %d",agac->veri);
     fflush(stdout);*/
     if(silsayi > agac->veri){
               /* printf("sag: %d",agac->veri);
     fflush(stdout);*/
          agac->sag = sil(agac->sag,silsayi);     
     }
     else if(silsayi < agac->veri){
        /*  printf("sol: %d",agac->veri);
     fflush(stdout);*/
          agac->sol = sil(agac->sol,silsayi);
     }
     else{
         /* printf("esit: %d",agac->veri);
          fflush(stdout);*/
          dugum * gecici = enkucuksag(agac);   
          
          if(gecici!=NULL)
                    agac = sil(agac,gecici->veri);
          else{
               return NULL;
          }
          gecici->sol = agac->sol;
          gecici->sag = agac->sag;
          agac = gecici;
     }
     return agac;
}
dugum * map(dugum *agac, int((*fp) (int))){
      if(agac==NULL)
                    return NULL;
      agac->veri=fp(agac->veri);
      if(agac->sag!=NULL){
                          agac->sag = map(agac->sag,fp);
      }
      if(agac->sol!=NULL){
                          agac->sol = map (agac->sol,fp);
      }
      return agac;
      
}
int f(int a){
    return 2 * a ;
}
int g (int a ){
    return a +8;
}
int q (int a){
      return a * -1;
}
int main(){
    dugum * agac = (dugum *) malloc(sizeof(dugum));
    agac->veri= 10;   
    agac->sol = (dugum *) malloc(sizeof(dugum));
    agac->sol->veri=5;
    dugum * agac2 =NULL;
    agac2 = ekle (agac2,9);
    agac2 = ekle (agac2,25);
    agac2 = ekle (agac2,4);
    agac2 = ekle (agac2,42);
    agac2 = ekle (agac2,5);
    agac2 = ekle (agac2,14);
    agac2 = ekle (agac2,19);
   /* dugum * gecici = enkucuksag(agac2);
    printf("%d   ",gecici->veri);*/
    bastir(agac2);
    printf ("\n");
    agac2 = sil(agac2,9);
    
    bastir(agac2);
    
        agac2 = map(agac2, f);
        printf ("\n");
        bastir(agac2);
        printf ("\n");
        agac2=map(agac2,g);
        bastir(agac2);
        printf ("\n");
        agac2=map(agac2,q);
        bastir(agac2);
  
  
    getch();
}

