objetivos - utem
TRANSCRIPT
1
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
Objetivos
Presentar el árbol como estructura de datos jerárquica
Estudiar diferentes variantes de árboles, tanto en su especificación como en su implementación
Contenidos
3.1 Conceptos, definiciones y terminología básica
3.2 Especificación e implementación del árbol binario
3.3 Recorridos sobre árboles binarios
3.4 Árboles binarios de búsqueda
3.5 Árboles equilibrados
3.6 Montículos y colas de prioridad
3.7 Árboles generales
3.8 Árboles multicamino de búsqueda
2
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Duración
8 clases (12 h)
Bibliografía
Data Structures and Algorithms in C++Autor: Michael T. Goodrich, Roberto Tamassia, David M. MountEditorial: John Wiley & Sons, Inc.Año: 2004Págs. 253 - 301, 411 - 475
Estructuras de datos y métodos algorítmicosAutor: Narciso Martí Oliet y otrosEditorial : Prentice-Hall, 2004Págs. 147 - 230
Estructuras de datos: especificación, diseño e implementaciónAutor: Xavier Franch GutiérrezEditorial : Ediciones UPC, 1999Págs. 219 - 303
El TAD Árbol
3
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
3.1 Conceptos, definiciones y terminología básica
Los árboles son estructuras que organizan sus elementos, denominados nodos, formando jerarquías. De entre estos nodos existe uno especial denominado raíz, situado en la cúspide de la jerarquía
Existe una relación (de paternidad entre los nodos) que hace que la estructura sea jerárquica frente a la estructura lineal
El uso de los árboles está muy extendido en programación. Algunos ejemplos pueden ser:
estructurar los directorios y archivos en los sistemas operativos
representar la estructura de las fórmulas matemáticas
organizar la información en los SGBD
representar la estructura sintáctica de un programa fuente en los compiladores
representar sistemas de clasificación
El TAD Árbol
4
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
La definición recursiva de árbol es la siguiente:
Un árbol n-ario (con n ≥ 1) es un conjunto no vacío de elementos o nodos del mismo tipo, tal que:
es un único nodo,
o bien está formado por un nodo raíz y m (0 ≤ m ≤ n) subconjuntos disjuntos, denominados subárboles, cada uno de los cuales es a su vez un árbol n-ario
Un árbol con raíz x y subárboles A1, …, Am se representa de la siguiente forma:
Am
x
A1... Am
x
A1...
El TAD Árbol
5
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Podemos clasificar los árboles atendiendo a diferentes criterios:
Cuando existe una relación de orden total en el conjunto de los subárboles de
un árbol, el árbol se llama ordenado (será el que utilizaremos)
Si no existe limitación para el número de hijos que pueda tener un nodo, el árbol
se denomina general. Por el contrario, si existe un número fijo n que limita el
número de hijos de un nodo, el árbol se denomina n-ario
Cuando los nodos de un árbol contienen información (caso más habitual), el
árbol se denomina etiquetado
El TAD Árbol
6
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
A
FE
DB
H
G
C
I J LK
M
A
FE
DB
H
G
C
I J LK
M
• Nodo: Cada posición dentro del árbol junto con la información asociada
• Si existe una arista (rama) dirigida del nodo nal nodo m, entonces n es el padre de m y mes un hijo de n
• Los hijos del mismo padre se denominan hermanos
• Todos los nodos de un árbol menos uno, denominado nodo raíz, tienen un único padre
• Una hoja de un árbol es un nodo que no tiene hijos. El resto de los nodos se denominan interiores o internos
Terminología Básica
El TAD Árbol
7
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
A
FE
DB
H
G
C
I J LK
M
A
FE
DB
H
G
C
I J LK
M
• Se denomina camino del nodo n1 al nodo nk a la secuencia de nodos de un árbol n1, n2, …, nk, de tal forma que ni es el padre de ni+1 (1 ≤ i < k)
• La longitud de un camino es el número de nodos del camino menos 1. Por convenio, decimos que existe un camino de longitud 0 de un nodo a sí mismo
• Si existe un camino desde un nodo n1hasta un nodo n2, se dice que n1 es antecesor de n2, y n2 es descendiente de n1
• El padre de un subárbol o nodo es su primer antecesor propio. Los hijos de un subárbol o nodo son sus primeros descendientes propios
Terminología Básica
El TAD Árbol
8
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
A
FE
DB
H
G
C
I J LK
M
A
FE
DB
H
G
C
I J LK
M
• La altura de un nodo en un árbol es la longitud del camino desde dicho nodo a la hoja más lejana que sea alcanzable desde él, más 1.
• La altura de un árbol es la altura del nodo raíz.El árbol vacío se considera con altura 0
• La profundidad o nivel de un nodo en un árbol es la longitud del único camino existente desde el nodo raíz hasta dicho nodo
• Por definición, el número de niveles de un árbol se define como el nivel de la hoja más profunda más 1. En el nivel 0 sólo está el nodo raíz. El número de niveles coincide con la altura del árbol
• El grado de un árbol n-ario es el número máximo de hijos que pueden tener sus subárboles
• El número máximo de nodos en el niveli-ésimo de un árbol de grado n es ni
Terminología Básica
El TAD Árbol
9
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árbol binario
3.2 Especificación e implementación del árbol binario
Un árbol binario ordenado es un árbol en el que cada nodo puede tener a losumo dos hijos
Es un conjunto de nodos del mismo tipo que, o bien es el conjunto vacío, o está formado por un nodo raíz enlazado a dos árboles binarios disjuntos denominados subárbol izquierdo y subárbol derecho
t
fh
km
d
10
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Tipos de árboles binarios
Un árbol binario de altura h se llama completo si tiene todas sus hojas a nivel h y todos sus nodos interiores tienen dos hijos no vacíos
Un árbol binario de altura h se llama semicompleto si los nodos de nivel h y h-1son los únicos de grado cero o uno, de forma que las hojas del último nivel ocupan las posiciones más a la izquierda de dicho nivel
50
4010
8020
9974
358 60
50
4010
8020
9974
358 60
Árbol binario
11
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Especificación Algebraica
espec arbolesBinariosusa booleanos, enterosparámetro formal
género elementofpfgénero arbinoperaciones
∆: arbin_ < _ , _ >: elemento arbin arbin arbinparcial raíz: arbin elementoparcial subIzq, subDer: arbin arbinvacío?: arbin booleanoaltura: arbin entero
dominios de definición iz, de: arbin; e: elementoraíz (e<iz, de>)subIzq (e<iz, de>)subDer (e<iz, de>)
Árbol binario
12
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
ecuaciones iz, de: arbin; e: elementoraíz (e<iz, de>) = subIzq (e<iz, de>) = subDer (e<iz, de>) = vacío? (∆) =vacío? (e<iz, de>) =altura (∆) = altura (e<iz, de>) =
fespec
Clasificación de las operaciones:
Gen (arbin) =
Mod (arbin) =
Obs (arbin) =
Árbol binario
13
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Implementación del árbol binario
La clase NodoB representa cada uno de los nodos de un árbol binario:
template <typename T>class NodoB {
typedef NodoB<T>* PtrNodoB;public:
NodoB(const T& objeto);NodoB(const T& objeto, PtrNodoB nizq, PtrNodoB nder);NodoB(const NodoB& n);const T& getObj() const;PtrNodoB getIzq() const;PtrNodoB getDer() const;void setObj(const T& objeto);void setIzq(PtrNodoB p);void setDer(PtrNodoB p);
private:T obj;PtrNodoB izq, der;
};
Árbol binario
obj
derizq derizq
14
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
template <typename T>class Arbin {
typedef NodoB<T>* PtrNodoB;public:
Arbin();Arbin(const T& objeto, const Arbin& ai, const Arbin& ad);Arbin(const Arbin& a);Arbin& operator=(const Arbin& a);const T& getRaiz() const throw(ArbolVacioExcepcion);const Arbin& subIzq() const throw(ArbolVacioExcepcion);const Arbin& subDer() const throw(ArbolVacioExcepcion);bool esVacio() const; int altura() const;
private:PtrNodoB raiz;Arbin(PtrNodoB p);
} ;
raíz
Árbol binario
15
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árbol binario
const Arbin<T>& subDer() constthrow(ArbolVacioExcepcion)
iniciosi esVacio() entonces
lanzar ArbolVacioExcepcion()fsidevolver *nuevo Arbin( raiz->getDer() )
fin
Arbin(const Arbin& a)var
Arbin ci, cdfvarinicio
si a.esVacio() entoncesraiz = NULO
sinoci = Arbin( a.subIzq() )cd = Arbin( a.subDer() )raiz = nuevo NodoB<T>( a.getRaiz(), ci.raiz, cd.raiz )
fsifin
Arbin(PtrNodoB p)inicio
raiz = pfin
Arbin(const T& objeto, const Arbin& ai, const Arbin& ad)inicio
raiz = nuevo NodoB<T>(objeto, ai.raiz, ad.raiz)fin
16
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Consideraciones sobre la implementación elegida
La implementación elegida se ajusta tanto a la definición recursiva de árbol como a la especificación algebraica propuesta
Sin embargo, deben tenerse en cuenta las siguientes consideraciones:
El constructor Arbin(const T&, const Arbin&, const Arbin&) no hace una copia de los árboles a partir de los cuales se construye, sino que comparte estructura con ellos
Las operaciones subIzq y subDer tampoco devuelven copias de los hijos izquierdo y derecho, respectivamente, sino subárboles que comparten memoria con el árbol original.
Si se desea evitar la utilización de alias el coste de ejecución de esas operaciones sería O(n) en lugar de O(1)
Por esa razón, no se ha incluido un método destructor: la destrucción de variables locales ⇒ podría afectar a otros árboles con los que compartieran estructura
Una alternativa consistiría en la implementación de una clase Iterador, con métodos para avanzar al hijo izquierdo o derecho. Véase Goodrich págs. 273-300
El TAD Árbol
17
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
3.3 Recorridos sobre árboles binarios
- En el caso de recorridos en profundidad sobre árboles binarios, podemos distinguir tres tipos. En cualquier caso, si el árbol es vacío no se hace nada, y si no tiene hijos, se visita únicamente la raíz.
PREORDEN
Se visita la raíz, y a continuación, se recorren en preorden primero el subárbol izquierdo y luego el subárbol derecho
POSTORDEN
Se recorren en postorden primero el subárbol izquierdo y luego el subárbol derecho, y a continuación se visita la raíz
INORDEN
Primero se recorre en inorden el subárbol izquierdo, luego se visita la raíz, y por último serecorre en inorden el subárbol derecho
Árbol binario
- En el recorrido en anchura, los nodos se visitan por niveles y dentro de cada nivel de izquierda a derecha, comenzando por el nivel 0.
18
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árbol binario
A
CB
D E
H
JI
GF
K
A
CB
D E
H
JI
GF
K
Recorrido en preorden:
Recorrido en inorden:
Recorrido en postorden:
Recorrido en anchura:
19
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
template <typename T>Lista<T> preOrden(const Arbin<T>& a)var
Lista<T> lfvarinicio
preOrden( a, l )devolver l
fin
template <typename T>void preOrden(const Arbin<T>& a, Lista<T>& l)inicio
si ¬ a.esVacio() entoncesl.añadirDch( a.getRaiz() )
preOrden( a.subIzq(), l )preOrden( a.subDer(), l )
fsifin
Árbol binario
Recorrido en preorden Llamada al procedimiento de recorrido en preorden
20
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árbol binario
template <typename T>void postOrden(const Arbin<T>& a, Lista<T>& l)inicio
si ¬ a.esVacio() entoncespostOrden( a.subIzq(), l )postOrden( a.subDer(), l )l.añadirDch( a.getRaiz() )
fsifin
template <typename T>void inOrden(const Arbin<T>& a, Lista<T>& l)inicio
si ¬ a.esVacio() entoncesinOrden( a.subIzq(), l )l.añadirDch( a.getRaiz() )inOrden( a.subDer(), l )
fsifin
template <typename T>void anchura(const Arbin<T>& a, Lista<T> & l)inicio Cola<Arbin<T> > c; Arbin<T> ac;
si ¬ a.esVacio() entoncesc.añadir(a);mientras (¬ c.esVacia()) hacer
ac = c.primero(); c.eliminar();l.añadirDch(ac.getRaiz() ); si ¬ ac.subIzq().esVacio() entonces c.añadir(ac.subIzq() ) fsisi ¬ ac.subDer().esVacio() entonces c.añadir(ac.subDer() ) fsi
fmientrasfsi
Fin
21
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
3.4 Árboles binarios de búsqueda (ABB)
Un ABB puede definirse cuando el tipo de los elementos posee una relación de orden total
Son árboles binarios en los que:
todos los valores de las claves del subárbol izquierdo son menores que el valor de la clave de la raíz
todos los valores de las claves del subárbol derecho son mayores que el valor de la clave de la raíz
esta propiedad se cumple en todos los nodos del árbol
Propiedad: el recorrido en “inorden” de un ABB, independientemente de su forma, obtiene los elementos ordenados según la relación de orden existente entre los nodos
22
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
Ejemplo de 2 árboles binarios con los mismos valores, pero con diferente estructura y altura:
La máxima altura alcanzable por un ABB de n nodos se produce cuando el árbol degenera en una lista enlazada, en cuyo caso la altura es de n
L
PE
JB
L
PE
JB
P
E
L
B
J
P
E
L
B
J
23
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
10 1 2 1
max
0
2 2 2 2 ... 2h
i h
i
N−
−
=
= = + + + +∑
1
0
11
nni
i
xxx
+
=
−=
−∑
Operaciones básicas:
Búsqueda
Inserción
Borrado
Complejidad de las operaciones: O(h)
h ≡ altura del árbol
h ≅ log2(n)
Número máximo de nodos en el nivel i: 2i
Número máximo de nodos en un árbol binario:
Justificación
1
max0
2 12 2 12 1
hhi h
i
N−
=
−= = = −
−∑
max max 2 max 22 1 2 1 log ( 1) (log ( ))h hN N h N O n= − ⇒ = + ⇒ = + ≅
Progresión geométrica
aplicando log2
24
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
Las operaciones se basan en el esquema de búsqueda de un elemento en el árbol. Si Aes un ABB y e el elemento a buscar, tenemos:
Si A es el árbol vacío, el elemento e no está en el árbol.
En caso contrario, se compara e con la raíz de A y se pueden dar tres casos:
1. e = raíz(A): el elemento ha sido encontrado
2. e < raíz(A): se repite el proceso de búsqueda dentro del subárbol izquierdo de A
3. e > raíz(A): se repite el proceso de búsqueda dentro del subárbol derecho de A
25
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Utiliza el esquema de búsqueda
Si el elemento a insertar se encuentra en el árbol, no se hace nada
En caso contrario, se inserta en el lugar donde acaba la búsqueda
La búsqueda acaba sin éxito al llegar a un subárbol izquierdo o derecho que está vacío
Operación de inserción
Árboles Binarios de Búsqueda
8
73
106
8
73
106
8
73
106
5
8
73
106
5
insertamos el 5
26
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Utiliza el esquema de búsqueda
Si no se encuentra el elemento a eliminar, la operación termina
Si el elemento a eliminar se encuentra en el árbol, el comportamiento de la operación depende del número de hijos que tenga dicho nodo:
Operación de borrado (1/4)
Árboles Binarios de Búsqueda
1. Eliminar un nodo sin hijos (hoja) simplemente se elimina el nodo
8
63
105
8
63
105
8
6
105
8
6
105eliminamos el 3
27
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Operación de borrado (2/4)
Árboles Binarios de Búsqueda
2. Eliminar un nodo con un solo hijo solo hay que realizar una reasignación de punteros
eliminamos el 21
25
6
15
3711
21
17
25
6
15
3711
21
17
25
6
17
3711
15
25
6
17
3711
15
el padre del nodo que queremos eliminar pasa a apuntar al hijo del nodo que está siendo eliminado
28
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Operación de borrado (3/4)
Árboles Binarios de Búsqueda
3. Eliminar un nodo con dos hijos
a. Se reemplaza el nodo que queremos eliminar con el elemento máximo de su subárbol izquierdo o el elemento mínimo de su subárbol derecho
b. Seguidamente, se elimina el nodo máximo (o mínimo, según el caso)
c. Dicho nodo será una hoja o tendrá un solo hijo, por lo que la operación se resolverá fácilmente mediante uno de los dos primeros casos
29
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Operación de borrado (4/4)
Árboles Binarios de Búsqueda
Ejemplo de borrado
eliminamos
el 20
8
155
206
17
16
21
12
8
155
206
17
16
21
12
8
155
176
17
16
21
12
8
155
176
17
16
21
12
8
155
176
16
21
12
30
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
3.4.1 Especificación algebraica
espec arbolesBinariosdeBusquedausa booleanosparámetro formal
género elementooperaciones
_≤_ , _≥_, _<_ , _>_ , _==_ , _≠_ : elemento elemento booleanofpfgénero abboperaciones
∆: abbparcial _ < _ , _ > : elemento abb abb abbparcial subIzq, subDer: arbin arbinvacío?: arbin booleanoinsertar: abb elemento abbestá?: abb elemento booleanoparcial min: abb elementoparcial max: abb elementoeliminar: abb elemento abb ...
31
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
dominios de definición iz, de: abb; e: elementosubIzq (e<iz, de>)subDer (e<iz, de>)
min (e <iz, de>)
max (e <iz, de>)
e <iz, de> está definido sólo si
(vacío?(iz) ∧ vacío?(de)) ∨
(vacío?(iz) ∧ ¬ vacío?(de) ∧ e < min(de)) ∨
(¬ vacío?(iz) ∧ vacío?(de) ∧ e > max(iz)) ∨
(¬ vacío?(iz) ∧ ¬ vacío?(de) ∧ e > max(iz) ∧ e < min(de))
ecuaciones iz, de: abb; e, e1, e2: elementoinsertar(∆, e) =insertar(e1<iz, de>, e2) =
...
32
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
está? (∆, e) =está? (e1<iz, de>,e2) =
min (e<iz, de>) =
eliminar(∆, e) =eliminar(e1<iz, de>, e2) =
fespec
max (e<iz, de>) =
33
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
template <typename T>class ABB : public Arbin<T> {
typedef NodoB<T>* PtrNodoB;public:
ABB();ABB(const ABB& a);const ABB& subIzq() const throw(ArbolVacioExcepcion);const ABB& subDer() const throw(ArbolVacioExcepcion);void insertar(const T& objeto);bool buscar(const T& objeto) const;const T& minimo() const throw(ArbolVacioExcepcion);const T& maximo() const throw(ArbolVacioExcepcion);void eliminar(const T& objeto);
private:ABB(PtrNodoB p);
} ;
3.4.2 Implementación
34
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
void insertar(const T& objeto)inicio
insertarNodo( objeto, raiz )fin
void insertarNodo(const T& objeto, PtrNodoB& p)
varPtrNodoB n
fvarinicio
si p == NULO entoncesp = nuevo NodoB<T>(objeto)
sino si objeto < p->getObj() entoncesn = p->getIzq()
insertarNodo( objeto, n )
p->setIzq( n )
sino si objeto > p->getObj() entoncesn = p->getDer()
insertarNodo( objeto, n )
p->setDer( n )
fsifin
bool buscarNodo(const T& objeto, PtrNodoB p)inicio
si p == NULO entonces
devolver falso
sinoen caso de
objeto == p->getObj() : devolver verdad
objeto < p->getObj() : devolver buscarNodo( objeto, p->getIzq() )
objeto > p->getObj() : devolver buscarNodo( objeto, p->getDer() )fcaso
fsifin
bool buscar(const T& objeto) constinicio
devolver buscarNodo( objeto, raiz )fin
35
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
const T& minimoNodo(PtrNodoB p)inicio
si p->getIzq() == NULO entoncesdevolver p->getObj()
sinodevolver minimoNodo(p->getIzq())
fin
const T& minimo() const throw(ArbolVacioExcepcion)inicio
si esVacio() entonceslanzar ArbolVacioExcepcion()
fsidevolver minimoNodo(raiz)
fin
const T& maximoNodo(PtrNodoB p)inicio
si p->getDer() == NULO entoncesdevolver p->getObj()
sinodevolver maximoNodo(p->getDer())
fin
const T& maximo() const throw(ArbolVacioExcepcion)iniciosi esVacio() entonces
lanzar ArbolVacioExcepcion()fsidevolver maximoNodo(raiz)
fin
36
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles Binarios de Búsqueda
void eliminar(const T& objeto)inicio
eliminarNodo( objeto, raiz )fin
...sino
si p->getIzq() == NULO entoncesn = pp = p->getDer()liberar n
sino si p->getDer() == NULO entoncesn = pp = p->getIzq()liberar n
sinon = p->getIzq()p->setObj(maximoNodo(n))eliminarNodo( p->getObj(), n )p->setIzq(n)
fsifsi
fsifin
void eliminarNodo(const T& objeto, PtrNodoB& p)var
PtrNodoB nfvarinicio
si p ≠ NULO entoncessi objeto < p->getObj() entonces
n = p->getIzq()eliminarNodo( objeto, n )p->setIzq( n )
sino si objeto > p->getObj() entoncesn = p->getDer()eliminarNodo( objeto, n )p->setDer( n )
...
37
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
3.5 Árboles binarios equilibrados (AVL)
La eficiencia de las operaciones sobre árboles binarios de búsqueda puede llegar a ser de O(n) en el peor de los casos
En la práctica, dicha eficiencia es de O(log2(n)), cuando suponemos que los valores se insertan en el árbol de una forma aleatoria.
La eficiencia de las operaciones depende de la estructura del árbol en el momento de realizar la operación
Lo ideal es, por tanto, que la altura del árbol sea siempre la menor posible
Los árboles AVL, definidos por G.M. Adelson-Velskii y E.M. Landis en 1962, cumplen este requisito, por lo que se conocen también como árboles de búsqueda equilibrados
38
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Diremos que un árbol binario está equilibrado si, para todos los nodos del árbol, la diferencia entre las alturas de sus subárboles siempre es menor o igual que 1.
• Todo nodo que sea hoja está equilibrado
• Un árbol con un solo hijo está equilibrado si el árbol hijo consta de un único nodo
8
155
176
21
12
8
155
176
1612
Árbol equilibrado Árbol no equilibrado
39
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Cuando se realiza una operación de inserción o borrado en un árbol AVL, éste puede perder la propiedad de equilibrio. Para mantener dicha propiedad se realiza una sencilla reorganización en el árbol denominada rotación
n2
n1 Tc
TbTa
n1
n2Ta
Tb Tc
rotar-derecha (n2)
rotar-izquierda (n2)
Con estas operaciones de rotación no se pierden las propiedades de ABB. En ambos árboles el nodo n1 es menor que el nodo n2, todos los elementos de Ta son menores que n1, todos los nodos de Tc son mayores que n2 y todos los nodos de Tb están entre n1 y n2
40
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
10
85
126
7
15
rotar-derecha (10)
41
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
10
85
126
7
15
rotar-izquierda (10)
42
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Factor de equilibrio de un nodo es la altura de su subárbol derecho menos la altura de su subárbol izquierdo. En un árbol equilibrado sólo podrá tener los valores -1, 1 o 0
Para representar un árbol AVL usaremos la misma estructura que para los ABB
La clase nodoB se amplía con un nuevo atributo que almacena su factor de equilibrio
8
155
176
12
-1
1
0
1
-1
0
21
0
43
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Puesto que los árboles AVL son un caso particular de ABB, usamos el mismo algoritmo de búsqueda pero con la particularidad que siempre se realizará con una eficiencia de O(log2 n)
Operación de búsqueda
La inserción de un nodo en un árbol AVL consta de dos fases:
usando el algoritmo de inserción desarrollado para los ABB, se recorre el camino partiendo del nodo raíz y se inserta como una hoja del árbol en su lugar correspondiente
se recorre el camino de vuelta hacia la raíz, actualizando los equilibrios de los nodos y reequilibrando el árbol cuando sea necesario, esto es, cuando la altura de uno de sus nodos pase a ser ±2
Operación de inserción
44
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
El desequilibrio se produce cuando, para un determinado nodo, la altura de su subárbol derecho es mayor que la de su subárbol izquierdo y el nuevo nodo se inserta por el subárbol derecho, o si la altura de su subárbol izquierdo es mayor que la de su subárbol derecho y el nuevo nodo se inserta por el subárbol izquierdo
h + 1
n
Td
Tih
h + 1
n
Ti
Tdh
caso (a) caso (b)
Las situaciones de desequilibrio se solucionan mediante 2 tipos de rotaciones:
patrón de rotación simple
patrón de rotación doble
45
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Rotación simple a la izquierda (I)
Es necesario aplicarlo cuando el nuevo nodo se inserta en el subárbol derecho del subárbol derecho de n en el caso (a)
n
n1Ta
Tb Tc
h
h h
0
+1
n
n1Ta
Tb Tc
h
h h
0
+1
n
n1Ta
Tb Tc
h
hh + 1
+1
+2
n
n1Ta
Tb Tc
h
hh + 1
+1
+2
46
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Para reestablecer la propiedad de equilibrio, se realiza una rotación simple a la izquierda sobre el nodo n
n1
n Tc
TbTah h
h + 1
0
0
n1
n Tc
TbTah h
h + 1
0
0
47
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Rotación simple a la derecha (D)
Es el caso simétrico al anterior y es necesario aplicarlo cuando el nuevo nodo se inserta en el subárbol izquierdo del subárbol izquierdo de n en el caso (b)
n
n1 T c
T bT ah h
0
-1
h
n
n1 T c
T bT ah h
0
-1
h
h + 1
n
n1 T c
T bT ah
-1
-2
h
h + 1
n
n1 T c
T bT ah
-1
-2
h
48
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Para reestablecer la propiedad de equilibrio, se realiza una rotación simple a la derecha sobre el nodo n
h + 1
n1
nTa
Tb Tch
0
0
h
h + 1
n1
nTa
Tb Tch
0
0
h
49
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Rotación doble derecha-izquierda (DI)
Es necesario aplicarlo cuando el nuevo nodo se inserta en el subárbol izquierdo del subárbol derecho de n en el caso (a)
h
n
n1
Ta
Tb
Tdh -1
0
+1
h
n2
Tch -1
0h
n
n1
Ta
Tb
Tdh -1
0
+1
h
n2
Tch -1
0
h
n
n1
Ta
Tb
Tdh -1
-1
+2
h
n2
Tc
h
+1h
n
n1
Ta
Tb
Tdh -1
-1
+2
h
n2
Tc
h
+1
50
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Para reestablecer la propiedad de equilibrio, se realiza rotación doble DI, es decir, una rotación a la derecha sobre el nodo n1 seguida de otra rotación a la izquierda sobre el nodo n
h
n
n2
Ta
Tb
Td
h -1
h
n1
Tc
h
h
n
n2
Ta
Tb
Td
h -1
h
n1
Tc
hh
n2
n
Ta
Tb
Td
h -1
h
n1
Tc
h
0
-1 0
h
n2
n
Ta
Tb
Td
h -1
h
n1
Tc
h
0
-1 0
proceso intermedio resultado final
51
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Rotación doble izquierda-derecha (ID)
Es necesario aplicarlo cuando el nuevo nodo se inserta en el subárbol derecho del subárbol izquierdo de n en el caso (b)
h
n
n1
Td
TcTa h -1
0
-1
h
n2
Tb
0
h -1
h
n
n1
Td
TcTa h -1
0
-1
h
n2
Tb
0
h -1
h
n
n1
Td
TcTa
h
+1
-2
h
n2
Tb
+1
h -1
h
n
n1
Td
TcTa
h
+1
-2
h
n2
Tb
+1
h -1
52
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Para reestablecer la propiedad de equilibrio, se realiza rotación doble ID, es decir, una rotación a la izquierda sobre el nodo n1 seguida de otra rotación a la derecha sobre el nodo n
proceso intermedio resultado final
h
n2
n1
Ta
Tb
Td
h -1
h
n
Tc
h
0
-1 0
h
n
n2
Td
Tc
Ta
h
h
n1
Tb h - 1
53
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Tanto en las rotaciones simples como en las rotaciones dobles que se realizan en la inserción, la altura del árbol resultante tiene la misma altura que el árbol original. Esta propiedad es importante, ya que permite finalizar el algoritmo de inserción sin necesidad de seguir observando los nodos por el camino de vuelta hasta el nodo raíz, puesto que no se encontrará desequilibrado.
Durante la etapa de recorrido de regreso del procedimiento de inserción, lo que necesitamos es encontrar el primer nodo cuyo equilibrio cambia de ±1 a ±2. A este nodo se le llama pivote. Una vez encontrado el pivote, se lleva a cabo la rotación apropiada según uno de estos casos:
1. si el equilibrio del pivote pasa a ser +2 y el equilibrio de su hijo derecho es +1, se realiza una rotación simple a la izquierda.
2. si el equilibrio del pivote pasa a ser +2 y el equilibrio de su hijo derecho es -1, se realiza una rotación doble DI.
3. si el equilibrio del pivote pasa a ser -2 y el equilibrio de su hijo izquierdo es -1, se realiza una rotación simple a la derecha.
4. si el equilibrio del pivote pasa a ser -2 y el equilibrio de su hijo izquierdo es +1, se realiza una rotación doble ID.
54
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
Operación de borrado
Se utiliza la misma técnica que el algoritmo de eliminación para ABB
Una vez eliminado se recorre el camino desde el padre del nodo eliminado hasta el nodo raíz, actualizando los equilibrios
Si se encuentra un nodo cuyo equilibrio pasa a ser ±2, se utiliza un patrón de rotación simple o doble para reestablecer la propiedad de equilibrio
A diferencia de la operación de inserción, la altura de un árbol puede no mantenerse después de una operación de eliminación y reequilibrado, por lo que puede requerir más de una operación de reequilibrado para mantener la propiedad
55
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles binarios equilibrados
La casuística que se puede dar en una operación de borrado de un árbol AVL es la siguiente:
1. Si el equilibrio del padre pasa de 0 a ±1, el algoritmo termina, ya que la altura del árbol no se modifica
2. Si el equilibrio del padre pasa de ±1 a 0, continuar reequilibrando los nodos
3. Si el equilibrio del padre pasa de +1 a +2
3.1. Si el equilibrio del hijo derecho es -1 rotación doble DI (continuar)
3.2. Si el equilibrio del hijo derecho es 0 o +1 rotación simple a la izquierda
(a) si el equilibrio del hijo derecho es 0, el algoritmo termina
(b) si el equilibrio del hijo derecho es +1, continuar
4. Si el equilibrio del padre pasa de -1 a -2
4.1. Si el equilibrio del hijo izquierdo es +1 rotación doble ID (continuar)
4.2. Si el equilibrio del hijo izquierdo es 0 o -1 rotación simple a la derecha
(a) si el equilibrio del hijo izquierdo es 0, el algoritmo termina
(b) si el equilibrio del hijo izquierdo es -1, continuar