Professional Documents
Culture Documents
Qu es un rbol?
Es una estructura de datos jerrquica. La relacin entre los elementos es de uno a muchos.
Terminologa
Nodo: Cada elemento en un rbol. Nodo Raz: Primer elemento agregado al rbol.
A B D H E F Nodo Raz C G K
Ms terminologa
Nodo Padre: Se le llama as al nodo predecesor de un elemento. Nodo Hijo: Es el nodo sucesor de un elemento. Hermanos: Nodos que tienen el mismo nodo padre.
Ms terminologa
Ms terminologa
Altura y Niveles
Altura del rbol =4
D H A B E F C
Nivel 0 Nivel 1
G K
Nivel 2 Nivel 3
Cada nodo del rbol puede tener 0, 1 2 hijos. Los descendientes izquierdos deben tener un valor menor al padre. Los descendientes derechos deben tener un valor mayor al padre.
Ejemplos de ABB
21 13 5 25 33 30 21 36 40 15 32 33
18
41 43
17 15
18
25
Implementacin de un ABB
class NodoArbol { public: int info; NodoArbol *izq, *der; NodoArbol( ); NodoArbol(int dato); };
NodoArbol(void) { izq = der = NULL; } NodoArbol(int dato) { info = dato; izq = der = NULL; }
Continuacin
class ABB { private: NodoArbol *raiz; public: ABB( ); // constructor ~ABB( ); // destructor //otros mtodos };
Paso 2
13
21 33
El 25 es mayor o menor que el 33?
33
10
18
25
40
10
18
25
40
Paso 3
13 18
21 33
10
25
40
Encontrado
Implementacin de la bsqueda
... p=raiz; while (p != NULL) { if (p->info == valor) return p; P contiene la direccin del nodo que tiene el valor buscado else p=(p->info > valor? p->izq: p->der); } Equivalente a: No se encontr el valor por lo que return NULL; if ( p -> info > valor ) se regresa un NULL
Reglas:
El valor a insertar no existe en el rbol. El nuevo nodo ser un Nodo Hoja del rbol. Buscar el Nodo Padre del nodo a agregar. Agregar el nodo.
Procedimiento
1.
2.
Ejemplo
Agregar el valor 26
Paso 1
13 21
El 26 es mayor o menor que el 21?
Paso 2
13
21 33
El 26 es mayor o menor que el 33?
33
10
18
25
40
10
18
25 21 33
40
Paso 3
13 18
21 33
Paso 4
13 40
Se encontr el Nodo Padre
10
25
10
18
25 26
40
Agregar el nodo
Comentarios importantes....
El orden de insercin de los datos, determina la forma del ABB. Qu pasar si se insertan los datos en forma ordenada? La forma del ABB determina la eficiencia del proceso de bsqueda. Entre menos altura tenga el ABB, ms balanceado estar, y ms eficiente ser.
10 13
Este rbol est desbalanceado porque los valores se agregaron en el siguiente orden: 10, 13, 18, 21, 25, 33, 40
18 21 25
Implementacin....
bool ABB::Insertar(int valor) { NodoArbol *nuevo, *actual, *anterior; nuevo = new NodoArbol(valor); actual = raiz; anterior = NULL; while ( actual != NULL ) { if ( valor == actual -> info ) return 0; anterior = actual; actual = (actual->info > valor ? actual->izq : actual->der); } if(anterior==NULL) raiz=nuevo; else { if ( anterior -> info > valor ) anterior -> izq = nuevo; else anterior -> der = nuevo; } return 1; }
Busca el Nodo Padre. Al final, Anterior ser el padre del nuevo nodo.
Agrega el nodo como nodo hoja. Si Anterior es igual a NULL quiere decir que el rbol est vaco por lo que el nodo a agregar ser la raz.
Buscar el Nodo Padre del nodo a borrar. Desconectarlo. Liberar el nodo. Buscar el Nodo Padre del nodo a borrar. Conectar el hijo con el padre del nodo a borrar. Liberar el nodo. Localizar el nodo predecesor o sucesor del nodo a borrar. Copiar la informacin. Eliminar el predecesor o sucesor segn sea el caso.
10
25
40
Paso 2
13 18
21 33
10
25
40
Desconectarlo y liberar el nodo
10
25 29 27
40
Paso 2
13
21 33 25
30
10
18 29 27 30
40
El PREDECESOR es el Mayor de los Menores. El SUCESOR es el Menor de los Mayores. Para la implementacin es igual de eficiente programar la bsqueda del predecesor que del sucesor.
2. 3.
El valor del Predecedor (o sucesor) se copia al nodo a borrar. Eliminar el nodo del predecesor (o sucesor segn sea el caso).
Predecesor
Uno a la IZQUIERDA y todo a la DERECHA
21 13 33
El predecesor de: 33
40
Es: 30 13 27
10
25 29 27
21 29
30
Sucesor
Uno a la DERECHA y todo a la IZQUIERDA
21 13 18 33
El sucesor de: 21
40 29
Es: 25 40 30
10
25
33 29
27
30
Implementacin del....
PREDECESOR P = actual -> izq; while( p -> der != NULL) p=p->der; return p; SUCESOR P = actual -> der; While (p -> izq != NULL ) p=p->izq; return p;
actual apunta al nodo a borrar
Paso 2
13 10
21 33
33
10
18
25
40
18
25
40
Localizar el Predecesor Copiar el valor del Predecesor al nodo que contena el valor a borrar
Paso 3
13 10
18
Paso 4
13
18 33
33 10 18 25 40
18
25
40
Paso 2
13 10
21 33
33
10
18
25
40
18
25
40
Localizar el Sucesor
Paso 3
13 10
25
Paso 4
13
18 33
33 10 18 25 40
Desconectar y liberar el nodo del Sucesor
18
25
40