Ciao a tutti. Vi allego il codice della mia soluzione al seguente problema, purtroppo però il programma NON gira. Sapete dirmi dov'è l'errore?? Grazie
"Dati due alberi binari (non necessariamente uguali) e una chiave k si vuole determinare se la sequenza dei nodi incontrati nei due alberi durante la ricerca della chiave k sia uguale oppure no. Si scriva una funzione in C che verifichi tale proprietà"
Nel mio programma ho scomposto il problema in più sotto-problemi:
1) "visita_abr" e "_visita_abr" che visitano l'albero a partire dalla radice e aggiungono le chiavi nel vettore;
2) "aggiungi" che aggiunge i vari elementi al vettore dinamico;
3) "confronta" che confronta i due vettori
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include "array.h"
#include "alberi.h"
void visita_abr(albero_binario_ricerca a, int k, vettore_dinamico* v);
void _visita_abr(nodo_albero_binario_ricerca* r, int k, vettore_dinamico* v);
void aggiungi(int dato, vettore_dinamico* v);
bool confronta(vettore_dinamico v, vettore_dinamico t);
int main()
{
albero_binario_ricerca a, b;
vettore_dinamico v, t;
int chiave;
a = crea_abr();
b = crea_abr();
inserisci_abr(&a, 20, 2.5);
inserisci_abr(&a, 13, 2.5);
inserisci_abr(&a, 24, 2.5);
inserisci_abr(&a, 8, 2.5);
inserisci_abr(&a, 16, 2.5);
inserisci_abr(&a, 30, 2.5);
inserisci_abr(&a, 9, 2.5);
inserisci_abr(&a, 14, 2.5);
inserisci_abr(&b, 20, 2.5);
inserisci_abr(&b, 13, 2.5);
inserisci_abr(&b, 30, 2.5);
inserisci_abr(&b, 5, 2.5);
inserisci_abr(&b, 16, 2.5);
inserisci_abr(&b, 24, 2.5);
inserisci_abr(&b, 14, 2.5);
inserisci_abr(&b, 26, 2.5);
v = crea_vettore_dinamico(9);
t = crea_vettore_dinamico(9);
printf("Inserire chiave: ");
scanf ("%d", &chiave);
visita_abr(a, chiave, &v);
visita_abr(b, chiave, &t);
stampa_vettore_dinamico(v);
stampa_vettore_dinamico(t);
if (confronta(v, t))
printf("La proprietà è verificata\n");
else
printf("La proprietà NON è verificata\n");
return EXIT_SUCCESS;
}
void visita_abr(albero_binario_ricerca a, int k, vettore_dinamico* v)
{
_visita_abr(a.radice, k, v);
}
void _visita_abr(nodo_albero_binario_ricerca* r, int k, vettore_dinamico* v)
{
if (r == NULL) /* caso di base: puntatore a NULL */
return;
if (k == r->chiave) /* caso di base: la chiave della radice e k coincidono */
{
aggiungi(r->chiave, v);
return;
}
if (k < r->chiave) /* passo ricorsivo: k è minore della chiave della radice */
{
aggiungi(r->chiave, v);
return _visita_abr(r->sinistro, k, v);
}
if (k > r->chiave) /* passo ricorsivo: k è minore della chiave della radice */
{
aggiungi(r->chiave, v);
return _visita_abr(r->destro, k, v);
}
}
void aggiungi(int dato, vettore_dinamico* v)
{
/* se necessario, ridimensiona il vettore */
ridimensione_vettore_dinamico(v, v->dimensione + 1);
/* inserisci il contenuto nel vettore */
v->dati[v->dimensione - 1] = dato;
}
bool confronta(vettore_dinamico v, vettore_dinamico t)
{
int i;
if (v.dimensione != t.dimensione) /* se le due dimensioni logiche non coincidono */
return false;
for (i = 0; i < v.dimensione; i++) /* scandisci entrambe le sequenze elemento per elemento ed esegui i confronti */
{
if (v.dati[i] != t.dati[i])
return false;
}
return true;
}