[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