Благодарю вас за помощь, я нашел решение и сделал это с помощью одной функции:
//some of these variables can be declared in the main function
int var;
int var2;
int **id; //tableau d'id
int count;
int creerArbreGauche(int n,int m,int** tab_tube_G,int** tab_tube_D)
{
printf("m : %d\n",m);
if(m>0){
if(fork()==0){
if(m==(n-1)) //si on est au dernier proc
{
printf("Premiere condition, processus : [%d][%d] avec id : %d \n",count,m,id[count][m]);
write(tab_tube_G[m][1],&id[count ][m],sizeof(int));
creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
}
else{
printf("Je rentre ici\n");
read(tab_tube_G[m+1][0],&var,sizeof(int));
printf("Var = %d\n",var);
if(var<id[count][m]){
write(tab_tube_G[m][1],&var,sizeof(int));
printf("Var gagne et l'envoie au pere: %d \n",var);
creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
}
else{
write(tab_tube_G[m][1],&id[count][m],sizeof(int));
printf("id[%d][%d] gagne et envoie au pere son id : %d \n", count, m, id[count][m]);
creerArbreGauche(n,m-1,tab_tube_G,tab_tube_D);
}
}
exit(0);
}
wait(NULL);
}
else{
if(n==1){
if(fork()==0){
write(tab_tube_D[count][1],&id[count][m],sizeof(int));
printf("on est au processus [%d] [%d]\n",count,m);
exit(0);
}
wait(NULL);
}
else{ //on est dans le vrai pere
printf("On est dans le pere des peres\n");
read(tab_tube_G[m+1][0],&var,sizeof(int));
close(tab_tube_D[count+1][1]);
read(tab_tube_D[count+1][0],&var2,sizeof(int));
printf("id processus [%d][0] : %d \n",(count+1),var2);
printf("VarFinal = %d\n",var);
printf("id du padré %d\n",id[count][m]);
if((var<=id[count][m])&&(var<=var2)){
printf("Var a gagné : %d \n",var);
write(tab_tube_D[count][1],&var,sizeof(int));
return var;
}
else if((var2<=id[count][m])&&(var2<=var)){
printf("Var2 a gagné : %d \n",var2);
write(tab_tube_D[count][1],&var2,sizeof(int));
return var2;
}
else{
printf("id[%d][%d] (Racine) gagne : %d \n", count, m, id[count][m]);
write(tab_tube_D[count][1],&id[count][m],sizeof(int));
return id[count][0];
}
}
}
printf("\n");
}
int main(){
srand(time(NULL));
int n=4, m=n-1;
int i,j;
int res;
//GENERATION DES IDs
id = (int**)malloc(n*sizeof(int*)); //tableau 2D de n ligne id
for(i=0;i<n;i++){
id[i] = (int*)malloc((n-1)*sizeof(int));
}
for(i=0;i<n;i++){
for(j=0;j<(n-i);j++){
id[i][j] = rand()%(n*n);
printf("ceci est l'id : [%d][%d] = %d \n",i,j,id[i][j]);
}
}
//GENERATION DE MES TUBES GAUCHE
int** tab_tube_G =(int**)malloc(n*sizeof(int));
for(int i=0;i<n;i++){
tab_tube_G[i] =(int*)malloc(2*sizeof(int));
pipe(&tab_tube_G[i][0]);
}
//GENERATION DE TUBES DROIT
int** tab_tube_D =(int**)malloc(n*sizeof(int));
for(int i=0;i<n;i++){
tab_tube_D[i] =(int*)malloc(2*sizeof(int));
pipe(&tab_tube_D[i][0]);
}
count = n-1;
//GENERATION COMPLETE DE TOUT MON ARBRE
for(i=1; i<=n; i++){
m=i-1;
printf(" i = %d \t\n",i);
res = creerArbreGauche(i, m, tab_tube_G, tab_tube_D);
count--;
}
printf("res : %d\n",res);
return 0;
}