[C con Clase] Calcular el balance en ABB
Carlos Jose Solar Zamorano
casolar en alumnos.ubiobio.cl
Jue Jun 28 05:36:45 CEST 2007
Saludos:
soy Carlos y les escribo por 2 motivos:
1) para felicitarles por su lista de correo es un exelente apoyo para los
estudiantes :D
2) quiero saber como puedo encontrar el balance de cada sub-arbol (o
nodo) en un arbol binario (ABB) he tratado de idear algun algoritmo
recursivo pero solo he podido calcular la altura de cada sub-arbol (o
nodo)... bueno les adjunto la
funcion Insertar en el arbol ABB
FUNCION INSERTAR NODO RECURSIVO....
template <typename TipoDeDato>
void ArbolBusqueda<TipoDeDato>::InsertarItem(const TipoDeDato &item)
/* preguntamos si existe un objeto de la clase arbol y luego creamos
un nuevo
nodo "arbol" y le enviamos un valor de cualquier tipo a elemento y
su altura = 0 */
{/* ¿como puedo calcular su balance ?? */
if(miRaiz == 0){
miRaiz = new ArbolBusqueda<TipoDeDato>::ArbolNodo(item, altura);
}
else
{
/* creamos un puntero auxiliar = miRaiz */
ArbolBusqueda<TipoDeDato>::PtrArbolNodo aux = miRaiz;
/* lamamos a inserte auxiliar y este hara el trabajo sucio sin perder
la raiz*/
InserteAuxiliar(item, altura, aux);
}
}
//FUNCION INSERTAR AUXILIAR
template <typename TipoDeDato>
void ArbolBusqueda<TipoDeDato>::InserteAuxiliar(const TipoDeDato &item,
TipoDeDato &altura, PtrArbolNodo &PtrPos)
{
if(PtrPos == 0)
PtrPos = new ArbolBusqueda<TipoDeDato>::ArbolNodo(item, altura);
else
if(item < PtrPos->elemento){
InserteAuxiliar(item, altura++, PtrPos->izquierdo);
}
else
if(item > PtrPos->elemento){
InserteAuxiliar(item, altura++, PtrPos->derecho);
}
}
// SIEMPRE QUE HACEMOS LA LLAMADA RECUSIVA AUMENTAMOS LA ALTURA DEL
NUEVO NODO AL ENVIAR POR PARAMETROS... ( altura+1)....
FUNCION REMOVER ITEM (NODO)
template <typename TipoDeDato>
void ArbolBusqueda<TipoDeDato>::RemoverItem(const TipoDeDato &item)
{
ArbolBusqueda<TipoDeDato>::PtrArbolNodo ptrpos = miRaiz, ptrpos1;
RemoverAuxiliar(item, ptrpos, ptrpos1);
}
FUNCION REMOVER AUXILIAR
template <typename TipoDeDato>
void ArbolBusqueda<TipoDeDato>::RemoverAuxiliar(const TipoDeDato
&item, PtrArbolNodo &pos1, PtrArbolNodo &pos2)
{
if(item < pos1->elemento)
RemoverAuxiliar(item, pos1->izquierdo, pos2);
else if(item > pos1->elemento)
RemoverAuxiliar(item, pos1->derecho, pos2);
else if(pos1->izquierdo && pos1->derecho)
{
pos2 = pos1;
MinimoAuxiliar(pos2->derecho, pos2);
pos1->elemento = pos2->elemento;
RemoverAuxiliar(pos1->elemento, pos1->derecho, pos2);
}
else
{
pos2 = pos1;
if(pos1->izquierdo == 0)
pos1=pos1->derecho;
else
if(pos1->derecho == 0)
pos1 = pos1->izquierdo;
delete pos2;
}
}
NO ESTOY PIDIENDO QUE ME DEN EL CODIGO, SOLO SI ME PUEDEN ORIENTAR
PARA PODER CALCULAR EL BALANCE DE CADA NODO...
HASTA LUEGO Y GRACIAS OJALA PUEDA MAS ADELANTE AYUDARLOS A USTEDES.. ;D
Más información sobre la lista de distribución Cconclase