Salve,
Il codice dovrebbe generare un albero di ricerca derivato da un array e stampare la visita simmetrica purtroppo mi da segmentation fault subito dopo aver immesso i valori dell'array ,
tramite varie prove son riuscito a capire che l'errore deve stare nelle righe tra l'inizio del main e l'allocazione dinamica del puntatore alla struct nodo p,
qualcuno è così gentile da spiegarmi come mai incorro in questa segmentation fault ? proprio non riesco a spiegarmi il perchè

codice:
// VISITA SIMMETRICA RICORSIVA ALL'ALBERO
#include<stdio.h>
#include<stdlib.h>

typedef struct nodo* punt;

struct nodo{
  int dato;
  punt sx;
  punt dx;
};

void NodeGen(int *A, int i, punt p){
  punt temp;
  punt predec;
  
  temp=(punt)malloc(sizeof(struct nodo));
   
  predec=(punt)malloc(sizeof(struct nodo));
  *predec=*p;
  
  
  while(predec!=NULL){
   
    *temp=*predec;
    if(A[i]>predec->dato)
      predec=predec->dx;
    else
      predec=predec->sx;
  }
  
  if(A[i]>temp->dato)
    temp->dx=predec;
  if(A[i]<temp->dato)
    temp->sx=predec;
   
  predec->dato=A[i]; 
  predec->sx=NULL;
  predec->dx=NULL;
  
 
 
}

void VisitaSimmetrica(punt p){
  
  if(p->sx!=NULL && p->dx!=NULL){
    VisitaSimmetrica(p->sx);
    printf("%d", p->dato);
    VisitaSimmetrica(p->dx);
  }
     
  else{
      if(p->sx==NULL ){
	if(p->dx==NULL){
	  printf("%d",p->dato);
	}
	else{
	  printf("%d",p->dato);
	  VisitaSimmetrica(p->dx);
	}
      }
      else{
	if(p->dx==NULL){
	  VisitaSimmetrica(p->sx);
	  printf("%d",p->dato);
	}
	
      }
  } 
}

int main(){
  int i,N;
  int *A;
  punt p;
  
  scanf("%d",&N);
  
  A=malloc(N*sizeof(int));
  
  for(i=0;i<N;i++)
  scanf("%d",&A[i]);
  
  printf(" è ora della Segmentation Fault ");
  p=(punt)malloc(sizeof(struct nodo)); 
 
  p->dato=A[0];
  p->sx=NULL;
  p->dx=NULL;

  
  for(i=1;i<N;i++)
    NodeGen(A,i,p);
  
  VisitaSimmetrica(p);

  
  
}