380 likes | 783 Views
ÁRBOLES BINARIOS DE BÚSQUEDA. ÁRBOLES BINARIOS DE BÚSQUEDA. Un Árbol Binario de Búsqueda (ABB) es un árbol binario que contiene información ordenada según una llave (valor) de búsqueda
E N D
ÁRBOLES BINARIOS DE BÚSQUEDA • Un Árbol Binario de Búsqueda (ABB) es un árbol binario que contiene información ordenada según una llave (valor) de búsqueda • En un ABB, para todo nodo n, las llaves del subárbol izquierdo son menores que la llave del nodo n y la llave del nodo n es menor que las llaves del subárbol derecho
ÁRBOLES BINARIOS DE BÚSQUEDA • Gráficamente
T1 = ÁRBOLES BINARIOS DE BÚSQUEDA • En un ABB, el recorrido Enorden genera una secuencia en orden ascendente según la llave Enorden(T1)=A,B,C,D,E,F,H
ÁRBOLES BINARIOS DE BÚSQUEDA • Ejercicio: Obtener Enorden(T2) T2 =
T1 = T1 = ÁRBOLES BINARIOS DE BÚSQUEDA • Representación
OPERACIONES SOBRE ABB´s • Búsqueda • Inserción • Eliminación
BÚSQUEDA EN ABB´s • Búsqueda de una llave k en un ABB T • Si T , kno existe • Si T , se compara kcon la llave x al interior del nodo apuntado por T • Sik x, la búsqueda termina • Sikx, la búsqueda continúa en el subárbol izquierdo de T • Sikx, la búsqueda continúa en el subárbol derecho de T
T = BÚSQUEDA EN ABB´s • Búsqueda de la llave 13 en el ABB T • Se compara 13 con 10 buscar enTd • Se compara 13 con 14 buscar enTi • Se compara 13 con 12 buscar enTd • Se encontró la llave 13
INSERCIÓN EN ABB´s • En un ABB T, el nodo que contendrá una nueva llave k siempre se inserta como hoja • T se crea el nodo para k • T se compara kcon la llave x al interior del nodo apuntado por T • Sikx, se avanza por el subárbol izquierdo de T • Sikx, se avanza por el subárbol derechode T
T = INSERCIÓN EN ABB´s • Insertar, en un ABB T inicialmente vacío, las llaves 10, 8, 14, 12, 9, 17, 5, 7, 11, 16, 13, 3 y 21
ELIMINACIÓN EN ABB´s • La eliminación de una llave k, en un ABB T, distingue tres situaciones • No existe un nodo con llave k • El nodo con llave ktiene, a lo más, un hijo • El nodo con llave ktiene dos hijos. Luego • Se reemplaza de k por m (mayor de las llaves del subárbol izquierdo ó menor de las llaves del subárbol derecho) y se elimina el nodo que la contiene
ELIMINACIÓN EN ABB´s • Eliminación de una llave k contenida en un nodo hoja
T = ELIMINACIÓN EN ABB´s • Al eliminar las llaves k= 4 y k= 6, cada una contenida en un nodo con un único hijo,
T = ELIMINACIÓN EN ABB´s • Resulta el siguiente nuevo ABB
T = ELIMINACIÓN EN ABB´s • Al eliminar la llave k= 8, contenida en un nodo con dos hijos,
T = ELIMINACIÓN EN ABB´s • Debe ser remplazada por la mayor de las llaves del subárbol izquierdo,
T = ELIMINACIÓN EN ABB´s • Ó, ser remplazada por la menor de las llaves del subárbol derecho
LA CLASE ABB #include <cstdlib> #include <iostream> using namespace std; typedef int Base; typedef char Clave; struct Elemento{ Clave key; Base info; }; struct Nodo { Clave key; Base info; Nodo *izq; Nodo *der; };
LA CLASE ABB typedef Nodo *Arbol; class Abb { private: Arbol B; Base Busca(Arbol, Clave); void Inserta(Arbol &, Elemento); Arbol Menor(Arbol &); Arbol Mayor(Arbol &); void Elimina(Arbol &, Clave); void VeAbb(Arbol);
LA CLASE ABB public: Abb(); bool Vacio(); Base Buscar(Clave); bool Existe(Clave); Clave GetKey(); Base GetInf(); Elemento GetMenor(); void Insertar(Elemento); void Eliminar(Clave); void VerAbb(); void CrearAbb(); };
LA CLASE ABB Base Abb::Busca(Arbol T, Clave k) { if (T == NULL) return -1; else if (k < T->key) return Busca(T->izq, k); else if (k > T->key) return Busca(T->der, k); else return T->info; }
LA CLASE ABB void Abb::Inserta(Arbol &T, Elemento e) { if (T == NULL) { T = new Nodo; T->key = e.key; T->info = e.info; T->izq = NULL; T->der = NULL; } else if (e.key < T->key) Inserta(T->izq, e); else if (e.key > T->key) Inserta(T->der, e); }
LA CLASE ABB Arbol Abb::Menor(Arbol &S) { if (S->izq != NULL) return Menor(S->izq); else return S; } Arbol Abb::Mayor(Arbol &S) { if (S->der != NULL) return Mayor(S->der); else { Arbol p = S; S = S->izq; return p; } }
LA CLASE ABB void Abb::Elimina(Arbol &T, Clave k) { Arbol q; if (T != NULL) if (k == T->key) { q = T; if (T->der == NULL) T = T->izq; else if (T->izq == NULL) T = T->der; else { q = Mayor(T->izq); T->key = q->key; T->info = q->info; }
LA CLASE ABB delete q; } else if (k < T->key) Elimina(T->izq, k); else if (k > T->key) Elimina(T->der, k); }
LA CLASE ABB void Abb ::VeAbb(Arbol T) { if (T != NULL) { VeAbb(T->izq); cout << "Clave: " << T->key << " Info: " << T->info << endl; VeAbb(T->der); } } Abb::Abb() { B = NULL; }
LA CLASE ABB bool Abb::Vacio() { return B == NULL; } bool Abb::Existe(Clave k) { return Busca(B, k) != -1; } Clave Abb::GetKey() { return B->key; } Base Abb::GetInf() { return B->info; }
LA CLASE ABB Elemento Abb::GetMenor() { Arbol q; Elemento e; q = Menor(B); e.key = q->key; e.info = q->info; return e; }
LA CLASE ABB Base Abb::Buscar(Clave k) { return Busca(B, k); } void Abb::Insertar(Elemento e) { Inserta(B, e); } void Abb::Eliminar(Clave k) { Elimina(B, k); } void Abb::VerAbb() { VeAbb(B); }
LA CLASE ABB void Abb::CrearAbb() { Elemento e; int i; cout << "Ingrese un entero: "; cin >> i; while(i != 0) { e.info = i; cout << "Ingrese una letra: "; cin >> e.key; Inserta(B, e); cout << "Ingrese un entero: "; cin >> i; } cout << endl; }
LA CLASE ABB Ejercicio Se dispone de dos Abb’s T1, T2. Implementar la función Unir(T1, T2), correspondiente a las operaciones T1 = T1T2 y T2 = . void Unir(Abb &T1, Abb &T2) { Elemento e; if(!T2.Vacio()) { e.key = T2.GetKey(); e.info = T2.GetInf(); T1.Insertar(e); T2.Eliminar(e.key); Unir(T1,T2); } }