100% encontró este documento útil (1 voto)
1K vistas14 páginas

Árboles Binarios de Búsqueda: Estructura y Funciones

Este documento describe los árboles binarios de búsqueda. Explica que un árbol binario de búsqueda es un árbol binario donde todas las claves de los nodos cumplen que la clave del subárbol izquierdo es menor que la clave del nodo y la clave del subárbol derecho es mayor. También describe las ventajas de los árboles binarios de búsqueda sobre listas enlazadas para búsquedas, como que el camino máximo de búsqueda es logarítmico en el número de nod

Cargado por

nn357
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
1K vistas14 páginas

Árboles Binarios de Búsqueda: Estructura y Funciones

Este documento describe los árboles binarios de búsqueda. Explica que un árbol binario de búsqueda es un árbol binario donde todas las claves de los nodos cumplen que la clave del subárbol izquierdo es menor que la clave del nodo y la clave del subárbol derecho es mayor. También describe las ventajas de los árboles binarios de búsqueda sobre listas enlazadas para búsquedas, como que el camino máximo de búsqueda es logarítmico en el número de nod

Cargado por

nn357
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Estructura de Datos y de la

Información

Árboles Binarios de Búsqueda


Eduardo Mosqueira Rey
Bertha Guijarro Berdiñas
Mariano Cabrero Canosa

LIDIA
Laboratorio de Investigación y Desarrollo
en Inteligencia Artificial

Departamento de Computación
Universidade da Coruña
1
Árboles
Árboles Binarios de Búsqueda LIDIA

• Motivación
* La búsqueda en una lista dinámica ordenada es poco eficiente:
• Por término medio habrá que recorrerse la mitad de la lista para verificar si
un elemento está o no en ella.
• Si la lista está en memoria principal no habrá problema, pero si la lista es una
tabla de una base de datos almacenada en memoria secundaria el rendimiento
se verá severamente afectado
* En una lista ordenada estática se pueden aplicar algoritmos de
búsqueda mejores (p.e., dicotómica), pero el almacenamiento es
limitado
• Solución: Árboles Binarios de Búsqueda o k

ABB
* Un ABB es un árbol binario en el que sus TODOS sus
nodos verifican:
• Tienen asociada una clave de ordenación
claves claves
• Su subárbol izquierdo (si existe) contiene valores menores menores mayores
que k que k
que su clave y el subárbol derecho (si existe) contiene
valores mayores.
2
Árboles
Árboles Binarios de Búsqueda LIDIA

• Ventajas
* El número de accesos al árbol es menor que en una lista enlazada
* Por ejemplo, en un árbol lleno que tenga n nodos el camino más largo
que hay que recorrer es log2(n+1),
• Si n=15,
– recorrido máximo en un ABB=log216=4
– recorrido máximo en una lista es n=15
• Si n=1023,
– recorrido máximo en un ABB=log21024=10
– recorrido máximo en una lista es n=1023 46

25 73

12 36 62 90

5 15 30 40 54 70 78 95

3
Árboles
Árboles Binarios de Búsqueda LIDIA

• Inconvenientes
* Árboles equilibrados
• Las búsquedas son más eficientes cuando el árbol está equilibrado
• Un árbol equilibrado es aquel en el que las ramas izquierda y
derecha de cada nodo tienen aproximadamente la misma altura (el
árbol lleno sería el árbol equilibrado perfecto con todos los nodos
con subárboles izq y dch de la misma altura)
• Si los nodos que se van insertando en el árbol aparecen en orden
aleatorio el árbol tenderá a ser equilibrado
46

* Árboles “degenerados”
• El caso peor ocurre cuando el árbol está “degenerado”, es decir,
sigue siendo un árbol pero su estructura es equivalente a una lista 73

enlazada (todos los nodos sólo tienen un hijo)


• Si los nodos del árbol que se van insertando en el árbol aparecen árbol
degenerado 90
con un orden determinado el árbol tenderá a ser degenerado.
* Los datos en la realidad suelen tener un cierto grado de
orden por lo que para que los árboles BB sean eficientes es 95

necesario hacer reequilibrados ⇒ árboles AVL


4
Árboles
Árboles Binarios de Búsqueda LIDIA

• Especificación del TAD Árbol Binario de Búsqueda


* Tipos
• tArbolBin y tInfo
* Funciones (se resaltan las nuevas)
• Generadoras
– ArbolVacio → tArbolBin
– InsertarABB (tArbolBin, tInfo) → tArbolBin, boolean
tArbolBin, tInfo)
• Observadoras
– HijoIzquierdo(tArbolBin) → tArbolBin
HijoIzquierdo(tArbolBin)
– HijoDerecho(tArbolBin) → tArbolBin
HijoDerecho(tArbolBin)
– tArbolBin) → tInfo
Raiz (tArbolBin)
– tArbolBin) → boolean
EsArbolVacio (tArbolBin)
– BusquedaABB (tArbolBin, tInfo) → tArbolBin
tArbolBin, tInfo)
• Destructoras
tArbolBin) → tArbolBin
– EliminarArbol (tArbolBin)
– EliminarABB (tArbolBin, tInfo) → tArbolBin, boolean
tArbolBin, tInfo)
* Funciones internas de la implementación
– ConstruirArbol (tArbolBin,
tArbolBin, tInfo, tArbolBin) → tArbolBin, boolean
tInfo, tArbolBin)
5
Árboles
Árboles Binarios de Búsqueda LIDIA

• Búsqueda (pseudocódigo)
* Se compara la clave a buscar con la raíz del arbol
• Si el árbol es NULO la búsqueda acaba sin éxito
• Si clave = valor de la raíz la búsqueda acaba con éxito
• Si clave < valor de la raíz la búsqueda continúa por el subárbol izquierdo
• Si clave > valor de la raíz la búsqueda continúa por el subárbol derecho
• Búsqueda (código y ejemplo)
30 < 46
46

function BuscaABB(A:tArbolBin; valor:tInfo): tArbolBin;


begin
if A=nil
then BuscaABB:=nil 25 30 > 25 73
else
if valor=A^.Info
then BuscaABB:=A
else if valor<A^.info 30 < 36
12 36 62 90
then BuscaABB:=BuscaABB(A^.HI, valor)
else BuscaABB:=BuscaABB(A^.HD, valor)
end;

30 54 70

6
Árboles
Árboles Binarios de Búsqueda LIDIA

• Inserción (pseudocódigo)
* Se compara la clave a insertar con la raíz del arbol
• Si el árbol es NULO insertamos una hoja con la clave en esa posición
• Si clave < valor de la raíz la búsqueda continúa por el subárbol izquierdo
• Si clave > valor de la raíz la búsqueda continúa por el subárbol derecho
• Si clave = valor (claves repetidas) no se hace nada. Este funcionamiento podría
ser distinto: reemplazar el antiguo con el nuevo, lanzar un error, permitir
duplicados, etc.
• Inserción (código y ejemplo) 40 < 46 INSERCIÓN CLAVE 40
46
function InsertarABB(var A:tArbolBin; valor:tInfo):boolean;
begin
if (A=nil) then
InsertarABB:=ConstruirArbol(nil, nil, valor, A)
else 25 73
40 > 25
if valor<A^.info
then InsertarABB:=InsertarABB(A^.HI, valor)
else if valor>A^.info
40 > 36
then InsertarABB:=InsertarABB(A^.HD, valor)
12 36 árbol nil 62 90
else InsertarABB:=true se crea
end; el nodo

30 40 54 70

7
Árboles
Árboles Binarios de Búsqueda LIDIA

• Borrado (pseudocódigo)
* Se busca en el árbol la posición del nodo a eliminar
* Si es un nodo hoja ⇒ se actualiza el puntero del padre a nil y se borra
el nodo
* Si es un nodo con un solo hijo ⇒ se actualiza el puntero del padre para
que apunte al hijo y se borra el nodo
* Si es un nodo con dos hijos
• Se intercambia el nodo con el mayor de su subárbol izquierdo (nodo anterior en
el orden) o con el menor de su subarbol derecho (nodo posterior en el orden) y
se borra el nodo.
• El mayor de su subárbol izquierdo se caracteriza por ser un nodo sin hijos o con
un hijo a la derecha (si tuviera un hijo a la izquierda ya no sería el mayor). Por
lo tanto es un nodo sencillo de borrar
• El menor de su subárbol derecho se caracteriza por ser un nodo sin hijos o con
un hijo a la izquierda (si tuviera un hijo a la derecha ya no sería el menor). Por
lo tanto es un nodo sencillo de borrar
• Al substituir un nodo por su anterior o su posterior la propiedad de árbol
binario de búsqueda se sigue cumpliendo.
8
Árboles
Árboles Binarios de Búsqueda LIDIA

46
• Borrado (ejemplos)

25 73

nil
* Nodo hoja (90)
12 36 62 90

se borra el
nodo y se
pone el
puntero a nil
30 54 70

46

* Nodo con un solo hijo (36) 25


se borra el nodo y
73
se pone el puntero
apuntando al hijo

12 36 62 90

30 54 70

9
Árboles
Árboles Binarios de Búsqueda LIDIA

• Borrado (ejemplo)
* Nodo con dos hijos (46)

46 36

Intercambiamos el
25 nodo con su nodo 73 25 borramos el nodo 73
antecesor original

(será un caso de un solo


hijo o sin hijos)

12 36 62 90 12 46 62 90

30 54 70 30 54 70

10
Árboles
Árboles Binarios de Búsqueda LIDIA

• Borrado (código)
function EliminarABB(var A:tArbolBin; valor:tInfo):boolean;
var
aux:tArbolBin;

{-----------------------------------------------------}

// reemplaza el nodo por su anterior


procedure reemplazar(var aux, N:tArbolBin);
begin
if N^.HD <> nil
then reemplazar(N^.HD) // Bajamos por la rama derecha
else begin
aux^.info:=N^.info;// reemplazamos los campos de información
aux:=N; // Marcamos el nodo sobre el que se hará un dispose
N:=N^.HI // y reenlazamos la estructura “saltando” al nodo que se va a eliminar
end
end;

{-----------------------------------------------------}

begin
if A=nil
then EliminarABB:=false // Si A es VACIO, el valor no existe y se devuelve false
else if valor<A^.info // Si el valor es menor mandamos borrar en subárbol izq
then EliminarABB:=EliminarABB(A^.HI, valor)
else if valor>A^.info // Si el valor es mayor mandamos borrar en subárbol dch
then EliminarABB:=EliminarABB(A^.HD, valor)
else begin // Si el valor es igual borramos el nodo
EliminarABB:=true; // Se devuelve true porque el valor existe
aux:=A;
if A^.HD = nil // Si no tiene hijo dch lo sustituimos por el izq
then A:=A^.HI // (incluye el caso de los dos hijos vacios)
else if A^.HI = nil // Si no tiene hijo izq lo sustituimos por el dch
then A:=A^.HD // Si tiene dos hijos llamamos a reemplazar
else reemplazar (aux, A^.HI); // pasando el nodo a eliminar y su subarbol izq
dispose(aux);
end
end;

11
Árboles
Árboles Binarios de Búsqueda LIDIA

• Ejemplo:
* Insertamos: 55 – 23 – 72 – 45 – 87 – 35 – 69 – 58 – 50 – 48

55

23 72

45 69 87

35 50 58

48

12
Árboles
Árboles Binarios de Búsqueda LIDIA

• Ejemplo: 50

* Borramos: 55
23 72

45 69 87

35 48 58

50

* Borramos: 72 23 69

45 58 87

35 48

13
Árboles
Árboles Binarios de Búsqueda LIDIA

• Ejemplo:
* Borramos: 23
50

45 69

35 48 58 87

* Borramos: 35
50

45 69

48 58 87

14

También podría gustarte