1 / 32

ÁRBOLES BINARIOS DE BÚSQUEDA

Á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

duer
Download Presentation

ÁRBOLES BINARIOS DE BÚSQUEDA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ÁRBOLES BINARIOSDE BÚSQUEDA

  2. Á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

  3.  ÁRBOLES BINARIOS DE BÚSQUEDA • Gráficamente

  4. 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

  5. ÁRBOLES BINARIOS DE BÚSQUEDA • Ejercicio: Obtener Enorden(T2) T2 =

  6. T1 = T1 = ÁRBOLES BINARIOS DE BÚSQUEDA • Representación

  7. OPERACIONES SOBRE ABB´s • Búsqueda • Inserción • Eliminación

  8. 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 • Sikx, la búsqueda continúa en el subárbol izquierdo de T • Sikx, la búsqueda continúa en el subárbol derecho de T

  9. 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

  10. 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 • Sikx, se avanza por el subárbol izquierdo de T • Sikx, se avanza por el subárbol derechode T

  11. 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

  12. 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

  13. ELIMINACIÓN EN ABB´s • Eliminación de una llave k contenida en un nodo hoja

  14. 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,

  15. T = ELIMINACIÓN EN ABB´s • Resulta el siguiente nuevo ABB

  16. T = ELIMINACIÓN EN ABB´s • Al eliminar la llave k= 8, contenida en un nodo con dos hijos,

  17. T = ELIMINACIÓN EN ABB´s • Debe ser remplazada por la mayor de las llaves del subárbol izquierdo,

  18. T = ELIMINACIÓN EN ABB´s • Ó, ser remplazada por la menor de las llaves del subárbol derecho

  19. 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; };

  20. 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);

  21. 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(); };

  22. 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; }

  23. 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); }

  24. 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; } }

  25. 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; }

  26. LA CLASE ABB delete q; } else if (k < T->key) Elimina(T->izq, k); else if (k > T->key) Elimina(T->der, k); }

  27. 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; }

  28. 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; }

  29. LA CLASE ABB Elemento Abb::GetMenor() { Arbol q; Elemento e; q = Menor(B); e.key = q->key; e.info = q->info; return e; }

  30. 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); }

  31. 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; }

  32. LA CLASE ABB Ejercicio Se dispone de dos Abb’s T1, T2. Implementar la función Unir(T1, T2), correspondiente a las operaciones T1 = T1T2 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); } }

More Related