Hola
Me parece que ese código está bien. La asignación a aux no tiene utilidad porque es una variable local, pero no provocaría ningún error.
No se que es ese "cualquier cosa" pero supongo que es porque estás usando el parámetro con el que invocás la función, lo cual no deberías hacer hasta después de haberle vuelto a asignar un valor.
Lo explico con más detalle. Supongamos que tenés
(1) Ab a;
Aquí 'a' no es el árbol vacío; solo podés usarlo a la izquierda de una asignación. No lo podés pasar como parámetro ni comparar con NULL, ni con otro puntero de tipo AB.
(2) a = NULL;
// o a = new nodo
// o a = otro árbol
// o a = llamado a función que devuelve AB
Ahora sí, podés usar 'a' como parámetro de alguna función
Cuando llamás a liberarArbol
(3) liberarArbola);
lo que estás haciendo es volver 'a' al mismo estado de (1), no al de (2). No estás obteniendo el árbol vacío.
Para poder usar 'a' deberías hacer lo mismo que en (2)
(3) liberarArbol(a);
(4) a = NULL;
Otra opción es que liberarArbol le asigne NULL a 'a' (mi opinión es que en ese caso no debería llamarse liberarArbol sino algo así como vaciarArbol, que además de dejar el árbol vacío libere la memoria que tiene asignada). Para eso deberías hacer algo así;
void liberarArbol (AB &a) {
// aquí el código que pusiste pero en vez de aux = NULL
a = NULL;
}
Ahora sí, con
(3) liberarArbol (a)
'a' queda vacío y puede usarse.
¿Haciendo esto se resuelve el problema?