0% encontró este documento útil (0 votos)
30 vistas32 páginas

Introducción a Árboles Binarios de Búsqueda

Un Árbol Binario de Búsqueda (ABB) organiza datos de manera que las llaves del subárbol izquierdo son menores que la del nodo padre y las del derecho son mayores. Las operaciones principales en un ABB incluyen búsqueda, inserción y eliminación de nodos, con diferentes casos según la cantidad de hijos del nodo a eliminar. Se presenta una implementación en C++ que define la estructura de un ABB y sus métodos para manipularlo.

Cargado por

Kevin Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
30 vistas32 páginas

Introducción a Árboles Binarios de Búsqueda

Un Árbol Binario de Búsqueda (ABB) organiza datos de manera que las llaves del subárbol izquierdo son menores que la del nodo padre y las del derecho son mayores. Las operaciones principales en un ABB incluyen búsqueda, inserción y eliminación de nodos, con diferentes casos según la cantidad de hijos del nodo a eliminar. Se presenta una implementación en C++ que define la estructura de un ABB y sus métodos para manipularlo.

Cargado por

Kevin Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd

Á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
 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
T1 =

Enorden(T1) = A, B, C, D, E, F, H
Á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


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
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 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 = [Link];
T->info = [Link];
T->izq = NULL;
T->der = NULL;
}
else
if ([Link] < T->key)
Inserta(T->izq, e);
else
if ([Link] > 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);
[Link] = q->key;
[Link] = 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) {
[Link] = i;
cout << "Ingrese una letra: ";
cin >> [Link];
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 = T1T2 y T2 = .
void Unir(Abb &T1, Abb &T2)
{ Elemento e;
if(![Link]())
{ [Link] = [Link]();
[Link] = [Link]();
[Link](e);
[Link]([Link]);
Unir(T1,T2);
}
}

También podría gustarte