ÁRBOLES BINARIOS DE BÚSQUEDA

32
ÁRBOLES BINARIOS DE BÚSQUEDA

description

Á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 - PowerPoint PPT Presentation

Transcript of ÁRBOLES BINARIOS DE BÚSQUEDA

ÁRBOLES BINARIOSDE 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

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

Á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

T1 =

ÁRBOLES BINARIOS DE BÚSQUEDA

Ejercicio: Obtener Enorden(T2)

T2 =

ÁRBOLES BINARIOS DE BÚSQUEDA

Representación

T1 =

T1 =

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 , k no existe Si T , se compara k con la llave x al

interior del nodo apuntado por T Si k x, la búsqueda termina Si k x, la búsqueda continúa en el

subárbol izquierdo de T Si k x, la búsqueda continúa en el

subárbol derecho de T

BÚSQUEDA EN ABB´s

Búsqueda de la llave 13 en el ABB T

Se compara 13 con 10 buscar en Td

Se compara 13 con 14 buscar en Ti

Se compara 13 con 12 buscar en Td

Se encontró la llave 13

T =

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 k con la llave

x al interior del nodo apuntado por T Si k x, se avanza por el subárbol

izquierdo de T Si k x, se avanza por el subárbol

derecho de 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

T =

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 k tiene, a lo más, un

hijo El nodo con llave k tiene 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

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

T =

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

EjercicioSe 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); }}