Lo que yo entiendo por árbol balanceado es que la altura de los hijos no se diferencien en más de la unidad, es decir, que si el hijo izquierdo tiene de altura 3, el hijo derecho tenga 2, 3 o 4; además cada uno de los hijos debe también estar a su vez balanceado.
También se puede hacer de forma recursiva. Podemos tener una función que te devuelva -1 si el árbol no está balanceado, y un número positivo con la altura del árbol, si lo está:
int estaBalanceado(TArbol *arbol) {
if (arbol == NULL) // No hay arbol. Su altura es 0
return 0; // (y está balanceado, claro)
int alturaHi, alturaHd;
alturaHi = estaBalanceado(arbol->hi);
alturaHd = estaBalanceado(arbol->hd);
// Si alguno de los hijos no está balanceado, este tampoco lo esta.
if ((alturaHi == -1) || (alturaHd == -1))
return -1;
// Si la diferencia de altura entre los hijos es demasiado grande,
// el arbol no está balanceado.
if (ABS(alturaHi - alturaHd) > 1)
return -1;
// Los hijos están balanceados, y su altura "se parece".
// devolvemos la altura del arbol.
return 1 + MAX(alturaHi, alturaHd);
}
Espero que te sirva. Si no lo entiendes, pregunta de nuevo :)