You are on page 1of 15

Temas

rbol binario de bsqueda

Administracin de Proyectos de desarrollo de Software RBOLES Ciclo de vida de un proyecto Enfoque moderno

Fin de la presentacin

Contine en la siguiente actividad

Administracin de Proyectos de desarrollo de Software RBOLES Ciclo de vida de un proyecto Enfoque moderno

RBOLES

rbol binario de bsqueda

Los rboles vistos ahora no tiene un orden definido; sin embargo, los rboles binarios ordenados tienen sentido. Estos se denominan rboles binarios de bsqueda, debido a que se pueden buscar en ellos un trmino utilizando un algoritmo de bsqueda binaria similar al empleado en arreglos. Un rbol binario de bsqueda es aquel que dado un nodo, todos los datos del subrbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del subrbol derecho son mayores que sus propios datos. El siguiente rbol s es de bsqueda.

RBOLES

rbol binario de bsqueda

5 5 3 0 4 41 75 8 5

4 es menor que 30 30 es menor que 55 41 es mayor que 30 75 es mayor que 55 85 es mayor que 75

Creacin de un rbol binario Supongamos que se desea almacenar los nmeros: 8, 3, 1, 20, 10, 5, 4, en un rbol binario de bsqueda. Siguiendo la regla, dado un nodo en el rbol todos los datos a su izquierda deben ser menores que todos los datos del nodo actual, mientras que todos los datos a la derecha deben

RBOLES

rbol binario de bsqueda

ser mayores que los datos. Inicialmente el rbol esta vaco y se desea insertar el 8. la nica eleccin es almacenar el 8 en el raz, a continuacin viene el 3, ya que 3 es menor que 8, el 3 debe ir en el subrbol izquierdo y as sucesivamente. El rbol binario queda:
8

2 0

1 0

RBOLES

rbol binario de bsqueda

Operaciones en rboles binarios de bsqueda


Los rboles binarios tienen naturaleza recursiva y en consecuencia las operaciones sobre los rboles son recursivas. Estas Bsqueda de un nodo. Insercin de un nodo. Recorrido de un rbol. Borrado de un nodo. Bsqueda

La bsqueda de un nodo comienza en el nodo raz y sigue estos pasos:


1. La clave buscada se compara con la clave del nodo raz.

RBOLES

rbol binario de bsqueda

2. Si las claves son iguales, la bsqueda se detiene. 3. Si la clave buscada es mayor que la clave raz, la bsqueda se reanuda en el subrbol derecho. Si la clave buscada es menor que la clave raz, la bsqueda se reanuda con el subrbol izquierdo. Cdigo en C++ de la funcin buscar es:
Nodo *buscar (Nodo *p, int buscado) { if (!p) return 0; else if (buscado == p -> nummat) return p; else if (buscado < p -> nummat) return buscar (p -> izda, buscado); else return buscar (p -> dcha, buscado); }

RBOLES

rbol binario de bsqueda

Insertar un nodo
Una caracterstica fundamental que debe poseer el algoritmo de insercin es que el rbol resultante de una insercin en un rbol de bsqueda ha de ser tambin de bsqueda. En esencia, el algoritmo de insercin se apoya en la localizacin de un elemento, de modo que si se encuentra el elemento (clave) buscado, no es necesario hacer nada; en caso contrario, se inserta el nuevo elemento justo en el lugar donde ha acabado la bsqueda (es decir, en el lugar donde habra estado en el caso de existir). La funcin insertar que pone nuevos nodos es sencilla. Se deben declarar tres apuntadores: un apuntador al raz del rbol y al nuevo nombre y nmero de matricula de la persona.

RBOLES

rbol binario de bsqueda

El procedimiento crear un nuevo nodo para la nueva persona y lo inserta en el lugar correcto en el rbol de modo que el rbol permanezca como binario de bsqueda.
void insertar (Nodo **p, int nuevo_mat, char *nuevo_nombre) { if (!p) p = new nodo (nuevo_mat, nuevo_nombre); else if (nuevo_mat < p-> nummat) insertar (p-> izda, nuevo_mat, nuevo_nombre); else insertar (p-> dcha, nuevo_mat, nuevo_nombre); }

RBOLES

rbol binario de bsqueda

Si el rbol est vaco, es fcil insertar la entrada en el lugar correcto. El nuevo nodo es la raz del rbol y el apuntador p se pone apuntando a ese nodo.
El parmetro p debe ser un parmetro de referencia ya que debe ser ledo y actualizado. Si el rbol no est vaco, se debe elegir entre insertar el nuevo nodo en el subrbol izquierdo o derecho, dependiendo de que el nmero de matricula de la nueva persona sea ms pequeo o mayor que el nmero de matricula en la raz del rbol. La operacin de insercin de un nodo es una extensin de la operacin de bsqueda, los pasos a seguir son:

RBOLES

rbol binario de bsqueda

1.
2. 3.

Asignar memoria para una nueva estructura nodo.


Buscar en el rbol para encontrar la posicin de insercin del nuevo nodo, que se colocar como nodo hoja. Enlazar el nuevo nodo al rbol. La operacin de eliminacin de un nodo es tambin una extensin de bsqueda, si bien es ms compleja que la insercin debido a que el nodo a suprimir puede ser cualquiera y la operacin se supresin debe mantener la estructura de rbol binario de bsqueda despus de la eliminacin de datos. Los pasos a seguir son:

Eliminacin

RBOLES

rbol binario de bsqueda

1.
2.

Buscar en el rbol para encontrar la posicin de nodo a eliminar.


Reajustar los apuntadores se sus antecesores si el nodo a suprimir tiene menos de 2 hijos, o subir a la posicin que ste ocupa el nodo prximo en clave (inmediatamente superior o inmediatamente inferior) con objeto de mantener la estructura de rbol binario.

Visita a los nodos de un rbol En muchas aplicaciones se desea explorar (recorrer) los nodos de un rbol pero sin tener en cuenta un orden de recorrido preestablecido.

La funcin ContarHojas recorre el rbol y cuenta el nmero de nodos hijo. Para realizar esta operacin se ha de visitar cada nodo comprobando si es un nodo hoja, el recorrido utilizado ser el postorden:

RBOLES

rbol binario de bsqueda


// funcin contar hojas // la funcin utiliza recorrido postorden // en cada visita se comprueba si el nodo es un nodo hoja // (no tiene descendientes) template < class T> void ContarHojas (NodoArbol <T> *t, int &cuenta) { // utilizar descenso postorden if (t != NULL) { ContarHoja (t -> Izdo( ), cuenta); // descenso izquierdo ContarHoja (t -> Dcho( ), cuenta); // descenso derecho // verificar si nodo t es un nodo hoja, en caso afirmativo, incrementar la variable cuenta if (t -> Izdo( ) == NULL && t -> Dcho( ) == NULL) cuenta++; }

RBOLES

rbol binario de bsqueda

La funcin profundidad utiliza un recorrido postorden para calcular la profundidad de un rbol binario. En cada nodo se calcula la profundidad de los subrboles izquierdo y derecho, la profundidad resultante del nodo es 1 ms que la profundidad mxima de sus subrboles.
// funcin profundidad, recorrido postorden, calcula la profundidad de los subrboles

// izquierdo y derecho de un nodo y devuelve la profundidad como 1 + max (profIzda, // profDcha), la profundidad de un rbol vaco es 0 template <class T> void Profundidad de un rbol (NodoArbol <Y> *t) { int profIzda, profDcho, valorprof; if (t == NULL) valorprof = 0; // Continua

RBOLES

rbol binario de bsqueda


else { profIzdo = Profundidad ( t -> Izdo ( )); profDcho = Profundidad ( t -> Dcho ( )); valorprof = 1 + (profIzdo > profDcho ? profIzdo : profDcho); } return valorprof;
}

You might also like