Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arboles Binarios Debusqueda
Arboles Binarios Debusqueda
LIDIA Laboratorio de Investigacin y Desarrollo en Inteligencia Artificial Departamento de Computacin Universidade da Corua
1
rboles
rboles Binarios de Bsqueda
Motivacin
* La bsqueda en una lista dinmica ordenada es poco eficiente:
Por trmino 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
LIDIA
* En una lista ordenada esttica se pueden aplicar algoritmos de bsqueda mejores (p.e., dicotmica), pero el almacenamiento es limitado
rboles
rboles Binarios de Bsqueda
Ventajas
* El nmero de accesos al rbol es menor que en una lista enlazada * Por ejemplo, en un rbol lleno que tenga n nodos el camino ms largo que hay que recorrer es log2(n+1),
Si n=15,
recorrido mximo en un ABB=log216=4 recorrido mximo en una lista es n=15
LIDIA
Si n=1023,
recorrido mximo en un ABB=log21024=10 recorrido mximo en una lista es n=1023
46
25
73
12
36
62
90
15
30
40
54
70
78
95
rboles
rboles Binarios de Bsqueda
Inconvenientes
* rboles equilibrados
Las bsquedas son ms 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 sera el rbol equilibrado perfecto con todos los nodos con subrboles 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
LIDIA
46
* rboles degenerados
El caso peor ocurre cuando el rbol est degenerado, es decir, 73 sigue siendo un rbol pero su estructura es equivalente a una lista enlazada (todos los nodos slo tienen un hijo) Si los nodos del rbol que se van insertando en el rbol aparecen rbol degenerado con un orden determinado el rbol tender a ser degenerado.
90
* Los datos en la realidad suelen tener un cierto grado de orden por lo que para que los rboles BB sean eficientes es necesario hacer reequilibrados rboles AVL
95
rboles
rboles Binarios de Bsqueda
Especificacin del TAD rbol Binario de Bsqueda
* Tipos
tArbolBin y tInfo
LIDIA
Observadoras
HijoIzquierdo(tArbolBin) HijoIzquierdo(tArbolBin) tArbolBin HijoDerecho(tArbolBin) HijoDerecho(tArbolBin) tArbolBin Raiz (tArbolBin) tArbolBin) tInfo EsArbolVacio (tArbolBin) tArbolBin) boolean BusquedaABB (tArbolBin, tArbolBin, tInfo) tInfo) tArbolBin
Destructoras
EliminarArbol (tArbolBin) tArbolBin) tArbolBin EliminarABB (tArbolBin, tArbolBin, tInfo) tInfo) tArbolBin, boolean
rboles
rboles Binarios de Bsqueda
Bsqueda (pseudocdigo)
* Se compara la clave a buscar con la raz del arbol
Si el rbol es NULO la bsqueda acaba sin xito Si clave = valor de la raz la bsqueda acaba con xito Si clave < valor de la raz la bsqueda contina por el subrbol izquierdo Si clave > valor de la raz la bsqueda contina por el subrbol derecho
LIDIA
function BuscaABB(A:tArbolBin; valor:tInfo): tArbolBin; begin if A=nil then BuscaABB:=nil else if valor=A^.Info then BuscaABB:=A else if valor<A^.info then BuscaABB:=BuscaABB(A^.HI, valor) else BuscaABB:=BuscaABB(A^.HD, valor) end;
25
30 > 25
73
12
30 < 36
36
62
90
30
54
70
rboles
rboles Binarios de Bsqueda
Insercin (pseudocdigo)
* Se compara la clave a insertar con la raz del arbol
Si el rbol es NULO insertamos una hoja con la clave en esa posicin Si clave < valor de la raz la bsqueda contina por el subrbol izquierdo Si clave > valor de la raz la bsqueda contina por el subrbol derecho Si clave = valor (claves repetidas) no se hace nada. Este funcionamiento podra ser distinto: reemplazar el antiguo con el nuevo, lanzar un error, permitir duplicados, etc.
40 < 46 46
LIDIA
INSERCIN CLAVE 40
25
40 > 25
73
12
36
62
90
30
40
54
70
rboles
rboles Binarios de Bsqueda
Borrado (pseudocdigo)
* Se busca en el rbol la posicin 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 subrbol 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 subrbol 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 sera el mayor). Por lo tanto es un nodo sencillo de borrar El menor de su subrbol 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 sera 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 bsqueda se sigue cumpliendo.
8 LIDIA
rboles
rboles Binarios de Bsqueda
Borrado (ejemplos)
25 46 73
LIDIA
nil
30
54
70
46
25
73
36
62
90
30
54
70
rboles
rboles Binarios de Bsqueda
Borrado (ejemplo)
* Nodo con dos hijos (46)
LIDIA
46
36
25
73
25
73
12
36
62
90
12
46
62
90
30
54
70
30
54
70
10
rboles
rboles Binarios de Bsqueda
Borrado (cdigo)
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 informacin 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 subrbol izq then EliminarABB:=EliminarABB(A^.HI, valor) else if valor>A^.info // Si el valor es mayor mandamos borrar en subrbol 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;
LIDIA
11
rboles
rboles Binarios de Bsqueda
Ejemplo:
* Insertamos: 55 23 72 45 87 35 69 58 50 48
LIDIA
55
23
72
45
69
87
35
50
58
48
12
rboles
rboles Binarios de Bsqueda
Ejemplo:
* Borramos: 55
23 72 50
LIDIA
45
69
87
35
48
58
50
* Borramos: 72
23
69
45
58
87
35
48
13
rboles
rboles Binarios de Bsqueda
Ejemplo:
* Borramos: 23
50
LIDIA
45
69
35
48
58
87
* Borramos: 35
50
45
69
48
58
87
14