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.