Documentos de Académico
Documentos de Profesional
Documentos de Cultura
20/08/2009
OPERACIONES
El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que realizbamos sobre otras
estructuras de datos, ms alguna otra propia de rboles:
Buscar un elemento.
Insertar un elemento.
Borrar un elemento.
Movimientos a travs del rbol:
o Izquierda.
o Derecha.
o Raiz.
Informacin:
o Comprobar si un rbol est vaco.
o Calcular el nmero de nodos.
o Comprobar si el nodo es hoja.
o Calcular la altura de un nodo.
o Calcular la altura de un rbol.
BUSCAR UN ELEMENTO
Partiendo siempre del nodo raz, el modo de buscar un elemento se define de forma recursiva.
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
El valor de retorno de una funcin de bsqueda en un ABB puede ser un puntero al nodo encontrado, o NULL, si
no se ha encontrado.
INSERTAR UN ELEMENTO
Para insertar un elemento nos basamos en el algoritmo de bsqueda. Si el elemento est en el rbol no lo
insertaremos. Si no lo est, lo insertaremos a continuacin del ltimo nodo visitado.
Necesitamos un puntero auxiliar para conservar una referencia al padre del nodo raz actual. El valor inicial para
ese puntero es NULL.
Padre = NULL
nodo = Raiz
Bucle: mientras actual no sea un rbol vaco o hasta que se encuentre el
elemento.
o Si el valor del nodo raz es mayor que el elemento que buscamos,
continuaremos la bsqueda en el rbol izquierdo: Padre=nodo,
nodo=nodo->izquierdo.
o Si el valor del nodo raz es menor que el elemento que buscamos,
continuaremos la bsqueda en el rbol derecho: Padre=nodo,
nodo=nodo->derecho.
Si nodo no es NULL, el elemento est en el rbol, por lo tanto salimos.
Si Padre es NULL, el rbol estaba vaco, por lo tanto, el nuevo rbol slo
contendr el nuevo elemento, que ser la raz del rbol.
Si el elemento es menor que el Padre, entonces insertamos el nuevo
elemento como un nuevo rbol izquierdo de Padre.
Si el elemento es mayor que el Padre, entonces insertamos el nuevo
elemento como un nuevo rbol derecho de Padre.
Padre = NULL
Si el rbol est vaco: el elemento no est en el rbol, por lo tanto salimos
sin eliminar ningn elemento.
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
(1) Si el valor del nodo raz es igual que el del elemento que buscamos,
estamos ante uno de los siguientes casos:
o El nodo raz es un nodo hoja:
Si 'Padre' es NULL, el nodo raz es el nico del rbol, por
lo tanto el puntero al rbol debe ser NULL.
Si raz es la rama derecha de 'Padre', hacemos que esa
rama apunte a NULL.
Si raz es la rama izquierda de 'Padre', hacemos que esa
rama apunte a NULL.
Eliminamos el nodo, y salimos.
o El nodo no es un nodo hoja:
Buscamos el 'nodo' ms a la izquierda del rbol derecho
de raz o el ms a la derecha del rbol izquierdo. Hay que
tener en cuenta que puede que slo exista uno de esos
rboles. Al mismo tiempo, actualizamos 'Padre' para que
apunte al padre de 'nodo'.
Intercambiamos los elementos de los nodos raz y 'nodo'.
Borramos el nodo 'nodo'. Esto significa volver a (1), ya
que puede suceder que 'nodo' no sea un nodo hoja. (Ver
ejemplo 3)
Si el valor del nodo raz es mayor que el elemento que buscamos,
continuaremos la bsqueda en el rbol izquierdo.
Si el valor del nodo raz es menor que el elemento que buscamos,
continuaremos la bsqueda en el rbol derecho.
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
EJEMPLO
Haremos ahora lo mismo que en el ejemplo en C, pero incluyendo todas las funciones y datos en una nica clase.
Declaracin de clase ArbolABB:
Declaramos dos clases, una para nodo y otra para ArbolABB, la clase nodo la declararemos como parte de la
clase ArbolABB, de modo que no tendremos que definir relaciones de amistad, y evitamos que otras clases o
funciones tengan acceso a los datos internos de nodo.
class ArbolABB {
private:
//// Clase local de Lista para Nodo de ArbolBinario:
class Nodo {
public:
// Constructor:
Nodo(const int dat, Nodo *izq=NULL, Nodo *der=NULL) :
dato(dat), izquierdo(izq), derecho(der) {}
// Miembros:
int dato;
Nodo *izquierdo;
Nodo *derecho;
};
// Punteros de la lista, para cabeza y nodo actual:
Nodo *raz;
Nodo *actual;
int contador;
int altura;
public:
// Constructor y destructor bsicos:
ArbolABB() : raz(NULL), actual(NULL) {}
~ArbolABB() { Podar(raz); }
// Insertar en rbol ordenado:
void Insertar(const int dat);
// Borrar un elemento del rbol:
void Borrar(const int dat);
// Funcin de bsqueda:
bool Buscar(const int dat);
// Comprobar si el rbol est vaco:
bool Vacio(Nodo *r) { return r==NULL; }
// Comprobar si es un nodo hoja:
bool EsHoja(Nodo *r) { return !r->derecho && !r->izquierdo; }
// Contar nmero de nodos:
const int NumeroNodos();
const int AlturaArbol();
// Calcular altura de un int:
int Altura(const int dat);
// Devolver referencia al int del nodo actual:
int &ValorActual() { return actual->dato; }
// Moverse al nodo raz:
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
};
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
10
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
11
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
12
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
int main()
{
// Un rbol de enteros
ArbolABB ArbolInt;
// Insercin de nodos en rbol:
ArbolInt.Insertar(10);
ArbolInt.Insertar(5);
ArbolInt.Insertar(12);
ArbolInt.Insertar(4);
ArbolInt.Insertar(7);
ArbolInt.Insertar(3);
ArbolInt.Insertar(6);
ArbolInt.Insertar(9);
ArbolInt.Insertar(8);
ArbolInt.Insertar(11);
ArbolInt.Insertar(14);
ArbolInt.Insertar(13);
ArbolInt.Insertar(2);
ArbolInt.Insertar(1);
ArbolInt.Insertar(15);
ArbolInt.Insertar(10);
ArbolInt.Insertar(17);
ArbolInt.Insertar(18);
ArbolInt.Insertar(16);
cout << "Altura de arbol " << ArbolInt.AlturaArbol() << endl;
// Mostrar el rbol en tres ordenes distintos:
cout << "InOrden: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
cout << "PreOrden: ";
ArbolInt.PreOrden(Mostrar);
cout << endl;
cout << "PostOrden: ";
ArbolInt.PostOrden(Mostrar);
cout << endl;
// Borraremos algunos elementos:
cout << "N nodos: " << ArbolInt.NumeroNodos() << endl;
ArbolInt.Borrar(5);
cout << "Borrar 5: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(8);
cout << "Borrar 8: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(15);
cout << "Borrar 15: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(245);
cout << "Borrar 245: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
ArbolInt.Borrar(4);
cout << "Borrar 4: ";
13
PROGRAMACION II
PROFESORA: MARIA ELENA CELIBERTI
20/08/2009
ArbolInt.InOrden(Mostrar);
ArbolInt.Borrar(17);
cout << endl;
cout << "Borrar 17: ";
ArbolInt.InOrden(Mostrar);
cout << endl;
// Veamos algunos parmetros
cout << "N nodos: " << ArbolInt.NumeroNodos() << endl;
cout << "Altura de 1 " << ArbolInt.Altura(1) << endl;
cout << "Altura de 10 " << ArbolInt.Altura(10) << endl;
cout << "Altura de arbol " << ArbolInt.AlturaArbol() << endl;
cin.get();
return 0;
}
14