C/Visual C - Arboles binarios

 
Vista:

Arboles binarios

Publicado por Sebastian de Leon (1 intervención) el 09/11/2001 23:00:24
Necesito un algoritmo que me cuente los nodos de un arbol binario balanceado, y que me diga si es balanceado o no, o que me orienten en la elaboracion de dicho algoritmo, desde ya muchas gracias a todos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Arboles binarios

Publicado por Googol (255 intervenciones) el 10/11/2001 09:46:49
Contar los nodos de un árbol se hace de forma recursiva:

int numNodos(TArbol *arbol) {

if (arbol == NULL)
return 0;
return 1 + numNodos(arbol->hijoIzdo) + numNodos(arbol->hijoDcho);
}

La función recibe como parámetro un puntero a un árbol; si el puntero es a NULL, no hay árbol que valga :-), así que se devuelve que tiene 0 nodos.
Si el árbol no es NULL, se devuelve 1 más el número de nodos que tiene su hijo izquierdo, más el número de nodos del hijo derecho.

Espero que te sirva

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Arboles binarios

Publicado por Googol (255 intervenciones) el 10/11/2001 09:57:33
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 :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar