Il problema credo ke sia sempre qui:
while(pt->valore <= corr->valore && corr->sinistro != NULL)
{
corr = corr->sinistro;
}
while(pt->valore >= corr->valore && corr->destro != NULL)
{
corr = corr->destro;
}
Per inserire ad esempio i valori 5,6,7 fino al 6 il programma non mi da problemi, inserendo 5 come radice e 6 come
nodofiglio destro di radice. Il problema è quando inserisce il valore 7, che dovrebbe posizionarsi come figlio
destro del figlio destro di radice ma il programma non passa corr->destro in corr...
Questa è la versione aggiornata con alcune modifiche consigliate da voi...
codice:
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int valore;
struct nodo *sinistro;
struct nodo *destro;
};
typedef struct nodo NODO;
void CreaAlbero(int Array[], int dim, void **);
void PREORDER(void **);
void INORDER(void **);
void POSTORDER(void **);
void main()
{
int dim;
printf("Inserire la dimensione dell'array (numero elementi albero binario):\n");
scanf("%d",&dim);
int Array[dim];
int i;
for(i=0; i<dim; i++)
{
printf("Inserire un valore numerico: ");
scanf("%d",&Array[i]);
}
NODO *radice;
radice = malloc(sizeof(NODO));
radice->valore = Array[0];
system("cls");
printf("Creazione albero...\n\n");
CreaAlbero(Array, dim, (void **)&radice);
INIZIO:
printf("\n");
int selezione;
printf("Digitare:\n");
printf("0 per la visita preorder\n");
printf("1 per la visita inorder\n");
printf("2 per la visita postorder\n");
scanf("%d",&selezione);
switch(selezione)
{
case 0:
{
printf("\nVisita dell'albero in ordine Preoder\n");
PREORDER((void **)&radice);
}
break;
case 1:
{
printf("\nVisita dell'albero in ordine Inorder\n");
INORDER(radice);
}
break;
case 2:
{
printf("\nVisita dell'albero in ordine Postorder\n");
POSTORDER(radice);
}
break;
}
system("pause");
system("cls");
goto INIZIO;
_getch();
}
void CreaAlbero(int Array[], int dim, void **radice)
{
int i = 0;
NODO *pt;
pt = malloc(sizeof(NODO));
NODO *corr;
corr = malloc(sizeof(NODO));
corr = *radice;
corr->sinistro = malloc(sizeof(NODO));
corr->sinistro = NULL;
corr->destro = malloc(sizeof(NODO));
corr->destro = NULL;
while(i < dim-1)
{
pt->valore = Array[i+1];
while(pt->valore <= corr->valore && corr->sinistro != NULL)
{
corr = corr->sinistro;
}
while(pt->valore >= corr->valore && corr->destro != NULL)
{
corr = corr->destro;
}
if(pt->valore <= corr->valore)
{
corr->sinistro = pt;
}
else
{
corr->destro = pt;
}
i++;
}
}
void PREORDER(void **radice)
{
NODO *nodo;
nodo = *radice;
if(nodo != NULL)
{
printf("%d\n", nodo->valore);
PREORDER( nodo->sinistro );
PREORDER( nodo->destro );
}
}
void INORDER(void **radice)
{
NODO *nodo;
nodo = *radice;
if(nodo != NULL)
{
INORDER( nodo->sinistro );
printf("%d\n", nodo->valore);
INORDER( nodo->destro );
}
}
void POSTORDER(void **radice)
{
NODO *nodo;
nodo = *radice;
if(nodo != NULL)
{
POSTORDER( nodo->sinistro );
POSTORDER( nodo->destro );
printf("%d\n", nodo->valore);
}
}