A parte il fatto che non hai tenuto conto di tutte le correzioni che ti sono state segnalate
codice:
int confronta (tree T1, tree T2)
{
if ((T1==NULL && T2!=NULL) || (T2==NULL && T1!=NULL) || (T1->dato!=T2->dato))
return 0;
else return confronta(T1->right, T2->right) + return confronta (T1->left, T2->left);
return 1;
}
in un qualsiasi algoritmo ricorsivo devi stabilire un caso base; nel caso in questione, visto che tu ricorri lungo l'albero fino a quando i puntatori non sono NULL, il caso base potrebbe proprio essere "se sia T1 che T2 sono NULL, allora restituisci 1", cioè "gli alberi sono uguali".
Io lo farei così:
codice:
int same_tree(Node *first, Node *second)
{
/* caso base */
if (first == NULL && second == NULL) {
return 1;
}
if ((first == NULL && second != NULL) ||
(first != NULL && second == NULL) ||
(first -> data != second -> data) {
return 0;
}
/* se si arriva qui, entrambi i puntatori sono != NULL e i dati sono uguali */
return same_tree(first -> l_child, second -> l_child) && same_tree(first -> r_child, second -> r_child);
/* il valore da restituire è quindi la AND logica tra i valori della funzione sui sottoalberi di sinistra e di destra */
}
con
codice:
typedef struct node {
int data;
struct node * l_child;
struct node * r_child;
} Node;
Non ho avuto modo di testarla molto, ma dovrebbe funzionare.