Professional Documents
Culture Documents
Gabriel Navarro
Estructuras de Datos
Grado en Ingenier a Inform atica
Gabriel Navarro
Tema 3 Arboles
Indice
Arboles n-arios
Gabriel Navarro
Tema 3 Arboles
Concepto de arbol
Un arbol es una estructura de datos no lineal, en la que cada elemento (nodo) tiene un u nico elemento anterior denominado padre (menos la ra z, que no tiene ninguno), y puede tener m as de un elemento siguiente (hijos del nodo). Los arboles son estructuras jer arquicas que permiten organizar la informaci on de acuerdo a unos criterios de jerarqu a. Denici on recursiva Un nodo es un arbol. Un arbol vac o (0 nodos) es un arbol. Si tomamos n arboles y cada una de sus ra ces has hacemos hijo de un nodo, el resultado es un arbol.
Gabriel Navarro
Tema 3 Arboles
Tierra
Ant artida
Am erica
Gabriel Navarro
Tema 3 Arboles
Arboles: Terminolog a
Relaci on entre nodos: El que est a por encima se llama padre y, el de abajo, hijo. El nodo ra z es el que no tiene padre. Los nodos hoja son aquellos que no tienen hijos. Nodos hermanos son aquellos que comparten padre. Un nodo interior es aquel que tiene hijos. En caso contrario, se dice que el nodo es exterior. La profundidad de un nodo es el n umero de relaciones padre-hijo que hay que seguir entre el nodo y la ra z del arbol. Un nivel es un conjunto de nodos que se encuentran a la misma profundidad.
Gabriel Navarro
Tema 3 Arboles
Arboles: Terminolog a
La altura de un nodo es el n umero ed relaciones padre-hijo que hay que seguir entre el nodo y su descendiente m as lejano. Se llama estructura del arbol a la altura de la ra z. Un sub arbol es un nodo de un arbol junto con todos sus descendientes. Un arbol parcial es un arbol que contiene unicamente algunos nodos del arbol original. CUIDADO!! Recordar bien la diferencia entre altura y profundidad.
Gabriel Navarro
Tema 3 Arboles
Arboles: Recorridos
Se llama recorrido de un arbol al orden establecido en el que se debe visitar los nodos de un arbol. Existen varios tipos de recorridos, donde los m as comunes son: Preorden: Ra z > Hijo Izquierda > Hijos Derecha. Inorden: Hijo Izquierda > Ra z > Hijos Derecha. Postorden: Hijo Izquierda > Hijos Derecha > Ra z. Por niveles: Nodos de un nivel, de izquierda a derecha. Pasar al siguiente nivel.
Gabriel Navarro
Tema 3 Arboles
B E F H J G Q K I
C L
D M O N P
Recorrido= A, B, E, F, G, H, Q, J, K, I, C, D, L, M, N, O, P
Gabriel Navarro
Tema 3 Arboles
B E F H J G Q K I
C L
D M O N P
Recorrido= F, E, H, G, J, Q, K, I, B, A, C, L, D, M, O, N, P
Gabriel Navarro
Tema 3 Arboles
B E F H J G Q K I
C L
D M O N P
Recorrido= F, H, J, K, Q, I, G, E, B, C, L, M, O, P, N, D, A
Gabriel Navarro
Tema 3 Arboles
B E F H J G Q K I
C L
D M O N P
Recorrido= A, B, C, D, E, L, M, N, F, G, O, P, H, Q, I, J, K
Gabriel Navarro
Tema 3 Arboles
ARBOLES BINARIOS
Gabriel Navarro
Tema 3 Arboles
Cada nodo del arbol ser a representado mediante una celda. Llamaremos celda a una estructura o clase que contenga el valor o etiqueta de un elemento de la lista y una referencia a su padre, a su hijo izquierdo y a su hijo derecho. La referencia la implementaremos como un puntero. struct celda { int et; celda *padre; // Puntero al nodo padre celda *hi; // Puntero al hijo izquierdo celda *hd; // Puntero al hijo derecho };
Gabriel Navarro
Tema 3 Arboles
Ver Especicaci on Completa Ver Implementaci on Completa Lo m as relevante: C omo gestionar arboles vac os y la reserva de memoria. Inserci on de hijos. Poda. Conocer el n umero de nodos del arbol. Conocer la altura y la profundidad de un nodo.
Gabriel Navarro
Tema 3 Arboles
El constructor de una celda deber a asignar los campos padre, hijo izquierda e hijo derecha a NULL, ya que una celda no tiene inicialmente padre ni hijos.
Celda() { padre= hi= hd= 0; }
Partiremos de esta premisa para implementar las funciones de inserci on de nodos en el arbol.
Gabriel Navarro
Tema 3 Arboles
Existe un m etodo en ArbolBin que elimina el arbol y lo hace vac o: void ArbolBin<T>::vaciar() { if (raiz != 0) { podar(raiz); raiz= 0; } }
Este m etodo deber a realizar una poda del nodo ra z, eliminando todos sus hijos y el nodo en s . Posteriormente, asignar a raiz= 0 para asegurar que se cumple la premisa de arbol vac o.
Gabriel Navarro
Tema 3 Arboles
Comprobar que el nodo padre no es nulo. Si existe el hijo a insertar, podarlo. Crear un nuevo nodo, hijo del padre. Asignar punteros del nuevo hijo.
void insertarHijoIzquierda(typename ArbolBin<T>::Nodo p, T valor) { if (p==0) return ; if (p->hi != 0) podar(p->hi); p->hi= new (nothrow) Celda (); p->hi->valor= valor; p->hi->padre= p; // Reasignamos el padre del hijo izq }
Gabriel Navarro Tema 3 Arboles
Si el nodo a podar es nulo, hemos terminado. En otro caso, seguir. Descolgar el nodo del padre. Podar el hijo izquierda y el Hijo derecha del nodo. Eliminar el nodo y hacerlo nulo para evitar fallos. Asignar punteros del nuevo hijo.
2 3 4 5
Gabriel Navarro
Tema 3 Arboles
Para conocer el n umero de nodos del arbol hay que implementar alguno de los recorridos sobre arboles. Cada vez que se pase por un nodo nuevo, se actualizar a un contador de nodos. Al nalizar, el valor del contador ser a el n umero de nodos del arbol. El recorrido puede ser cualquiera, y se puede implementar tanto recursiva como iterativamente. Como ejemplo, lo hemos implementado iterativamente utilizando una pila para eliminar la recursividad.
Gabriel Navarro
Tema 3 Arboles
Tambi en se implementan f acilmente mediante procedimientos recursivos. Suponiendo que un nodo inexistente tiene altura (H) y profundidad (P) -1, para cualquier nodo N estas se calculan como:
H (N ) =
; N == 0 ;
; N == 0 ;
Gabriel Navarro
Tema 3 Arboles
ITERADORES
Gabriel Navarro
Tema 3 Arboles
Iteradores
Ejemplo: for (int i= 0 ; i<N ; i++) { cout<<vector[i]<<endl; } Normalmente, a la variable i del ejemplo se le conoce como iterador. Un Iterador es un objeto abstracto que nos permite recorrer los elementos de otro tipo de dato, abstrayendo el procedimiento para conocer cu al elemento es anterior o posterior a otro elemento. Necesidad de implementar iteradores En un vector o una lista es obvio cu al elemento es siguiente o anterior a otro elemento. Pero, por ejemplo en un arbol, qu e criterio se tomar a?
Gabriel Navarro Tema 3 Arboles
Iteradores en arboles
Si deseamos visitar los nodos de un arbol, debemos implementar uno de los recorridos. Mediante el uso de iteradores, podemos abstraer el concepto del recorrido de modo que el programador quede liberado del conocimiento del mismo. Recorrido ideal en Preorden de un arbol con Iteradores ... ArbolBin<int> arbol; ... for (IteradorPreorden i(arbol); i! =i.nal(); i++) cout<<arbol.getEtiqueta(i.getNodoActual()); ... Al abstrer el recorrido en preorden en el ejemplo anterior, el c odigo queda mucho m as legible, y puede ser f acilmente modicado en el futuro con s olo modicar el iterador.
Gabriel Navarro Tema 3 Arboles
Iteradores en arboles
Al dise nar un iterador en un arbol, lo primero que hay que establecer es un criterio para saber cu al es el elemento siguiente para cada nodo. Este criterio puede imponerse si utilizamos los recorridos en arboles:
Preorden: El siguiente del padre es el hijo a la izquierda. Su siguiente, el hermano a la derecha. Inorden: El siguiente del hijo a la izquierda es el padre. Su siguiente, el hijo a la derecha. Postorden: El siguiente del hijo a la izquierda es el hermano a la derecha. Su siguiente, el padre. Niveles: El siguiente de un nodo es su hermano a la derecha. Su siguiente, el hijo a la izquierda.
Gabriel Navarro
Tema 3 Arboles
Todo iterador debe implementar mecanismos para: Inicializar el iterador al primer elemento a visitar. Conocer cu ando se ha terminado de visitar todos los elementos. Pasar al siguiente elemento a visitar. Obtener el valor del elemento actual que se est a visitando.
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
ARBOLES DE EXPRESIONES
Gabriel Navarro
Tema 3 Arboles
Denici on Un arbol de expresiones es un tipo especial de arbol que permite representar expresiones matem aticas. En sus nodos internos, el a rbol contiene las operaciones a realizar. En los nodos hoja, los operandos. Dado que la mayor a de operadores matem aticos son unarios o binarios, los arboles de expresi on m as comunes son los arboles de expresi on binarios. Si la operaci on de un nodo de un arbol de expresi on binario tiene dos operandos, ese nodo deber a tener dos hijos. Si es unario, tendr a un u nico hijo a la derecha.
Gabriel Navarro
Tema 3 Arboles
Recorrido en Inorden: -8+3*X-7 Recorrido en Preorden: +-8*3-X7 Recorrido en Postorden: 8-3X7-*+ Si los nodos de un arbol de expresi on pueden tener uno o dos hijos, ninguno de los recorridos del arbol puede darnos el arbol original asociado. Para ello, podr amos imponer que todos los nodos tengan dos hijos.
Gabriel Navarro Tema 3 Arboles
Recorrido en Inorden: 0-8+3*X-7 Recorrido en Preorden: +-08*3-X7 Recorrido en Postorden: 08-3X7-*+ La expresi on en inorden es m as legible por un humano. No obstante, puede no corresponder al arbol que la origin o a no ser que est e parentizada: 0-8+3*(X-7). Tanto el recorrido en preorden como el recorrido en postorden permiten recuperar el arbol original de la expresi on.
Gabriel Navarro Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
38 50 El recorrido en inorden de un arbol binario de b usqueda proporciona el conjunto de nodos del arbol ordenados.
Gabriel Navarro Tema 3 Arboles
20 36 40 50
ABB: Representaciones
Un ABB puede representarse a partir de un arbol binario: Por herencia de arbol binario. Incluyendo un arbol binario como dato miembro del ABB. Existen tantas implementaciones posibles de ABBs como dise nos del programador que lo implemente, aunque las dos anteriores est an bastante extendidas. Ver Implementaci on con herencia Ver Implementaci on con datos miembro
Gabriel Navarro
Tema 3 Arboles
ABB: Interfaz
template <class T> class ABB { public: ABB(); ABB(const ABB<T> &a); ABB(T valor); ABB(); typename ArbolBin<T>::Nodo getRaiz(); T getEtiqueta(typename ArbolBin<T>::Nodo n); typename ArbolBin<T>::Nodo getPadre(typename ArbolBin<T>::Nodo n); typename ArbolBin<T>::Nodo getHijoIzq(typename ArbolBin<T>::Nodo n); typename ArbolBin<T>::Nodo getHijoDcha(typename ArbolBin<T>::Nodo n); void insertar(T valor); podar, vaciar, estaVacio, etc... (procedentes de ArbolBin) };
Gabriel Navarro
Tema 3 Arboles
ABB: Interfaz
Ejercicio Implementar la funci on de b usqueda
Gabriel Navarro
Tema 3 Arboles
ABB: Interfaz
Ejercicio Implementar la funci on de b usqueda typename ArbolBin<T>::Nodo ABB<T>::BUSCAR ( typename ArbolBin<T>::Nodo arbol,T valor){ typename ArbolBin<T>::Nodo aux=0; if ( arbol!=0 ){ if ( valor < arbol->et)// arbol izquierdo aux = BUSCAR(arbol->hi,valor); else if ( valor > arbol->et ) // arbol derecho aux = BUSCAR(arbol->hd,valor); else aux=T; } return aux; }
Gabriel Navarro Tema 3 Arboles
Si el arbol est a vac o crear la ra z y asignarle valor. Devuelve true. En otro caso:
1 2 3
Si la etiqueta de aux<valor, aplicar Insertar(aux -> hd, valor). Si la etiqueta de aux>valor, aplicar Insertar(aux -> hi, valor). Si la etiqueta de aux=valor, el valor ya estaba y devuelve false.
Gabriel Navarro
Tema 3 Arboles
bool ABB<T>::Insertar (typename ArbolBin<T>::Nodo raiz, T valor) { bool res=1 // exito si no est a en el a rbol if (raiz==0){ raiz=new typename ArbolBin<T>::Nodo (); raiz -> et = valor; } else if (valor < raiz -> et) // arbol izq. res= Insertar (raiz -> hi, valor); else if (valor > raiz -> et) // arbol der. res= Insetar (raiz -> hd, valor); else res=false; // el valor ya est a return res; }
Gabriel Navarro
Tema 3 Arboles
Borrar un valor Para borrar un valor V en un nodo N : Si N no tiene hijos, simplemente se elimina el nodo Si N tiene un hijo, se elimina el nodo y el hijo pasa a ocupar su lugar Si N tiene dos hijos:
se busca el elemento anterior H (o el siguiente), es decir, izquierda - derecha - derecha - derecha ... hasta un nodo hoja. se cambia el valor de N por el de H se elimina el nodo H .
Gabriel Navarro
Tema 3 Arboles
bool ABB<T>::Borrar (typename ArbolBin<T>::Nodo raiz, T valor){ bool res=1 // exito si estaba en el a rbol if (raiz==0) res=false; else if (valor < raiz -> et) // arbol izq. res= Borrar (raiz -> hi, valor); else if (valor > raiz -> et) // arbol der. res= Borrar (raiz -> hd, valor); else{ // localizado EliminarRaiz(raiz); res=true; } return res; }
Gabriel Navarro
Tema 3 Arboles
ARBOLES AVL
Gabriel Navarro
Tema 3 Arboles
Arboles AVL
Un AVL es un arbol binario de b usqueda que siempre est a equilibrado (condici on de Adelson, Velskii y Landis). Ejemplo: 20 9 8 16 25 36 40
38 50 El arbol est a equilibrado siempre que la diferencia de alturas de sus hijos no exceda el valor 1 (en valor absoluto).
Gabriel Navarro
Tema 3 Arboles
Arboles AVL
Las representaciones, interfaz y funci on de abstracci on del AVL son id enticas a las de un ABB. Cambia levemente el invariante de la representaci on: Invariante de la Representaci on rep.raiz es null. En caso contrario, rep.raiz->padre es null. Para todo nodo del arbol N, N->hi apunta a su hijo izquierdo, o vale null en caso de no tener. N->hd apunta a su hijo derecho, o vale null en caso de no tener. Para cada nodo N, si sus hijos existen entonces N->valor>N->hi->valor y N->valor<N->hd->valor. Para todo nodo N, |altura(H->hi)-altura(N->hd)| <=1.
Gabriel Navarro
Tema 3 Arboles
La inserci on en un AVL tambi en es id entica a la del ABB. Sin embargo, tras realizar esta, hay que vericar que el arbol est a equilibrado comenzando desde el padre del nodo insertado hasta la ra z:
1 2
Calcular alturas de aux->hi y aux->hd Si aux est a desequilibrado, entonces equilibrar. En caso contrario, aux= aux->padre
Supondremos que la altura de un nodo inexistente en el arbol es -1 para la implementaci on de los apuntes.
Gabriel Navarro
Tema 3 Arboles
El equilibrado de nodos en un arbol AVL se realiza mediante rotaciones de nodos dentro del arbol. Podemos distinguir 4 casos: Rotaci on simple a la derecha. Rotaci on simple a la izquierda. Rotaci on doble izquierda-derecha. Rotaci on doble derecha-izquierda. El tipo de rotaci on de nodos a realizar depender a de la situaci on dada en el arbol.
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Para equilibrar un nodo, antes hay que observar qu e tipo de desequilibrio tiene:
1 Sea N un nodo desequilibrado. 2 Si H(N->hi) - H(N->hd) > 1, hay desequilibrio por la izquierda y:
1
Si H(N->hi->hi) > H(N->hi->hd), hay desequilibrio izquierda-izquierda. Se aplica Rotaci on simple a la derecha sobre N->hi. En otro caso, hay desequilibrio izquierda-derecha. Se aplica Rotaci on doble. Primero rotaci on a la izquierda sobre N->hi->hd, y rotaci on a la derecha sobre el nuevo nodo N->hi.
Gabriel Navarro
Tema 3 Arboles
Para equilibrar un nodo, antes hay que observar qu e tipo de desequilibrio tiene:
3 Si H(N->hi) - H(N->hd) < -1, hay desequilibrio por la derecha y:
1
Si H(N->hd->hd) > H(N->hd->hi), hay desequilibrio derecha-derecha. Se aplica Rotaci on simple a la izquierda sobre N->hd. En otro caso, hay desequilibrio derecha-izquierda. Se aplica Rotaci on doble. Primero rotaci on a la derecha sobre N->hd->hi, y rotaci on a la izquierda sobre el nuevo nodo N->hd.
Gabriel Navarro
Tema 3 Arboles
Ejercicio Implementar la funciones de rotaci on en un AVL Ejercicio Implementar la funciones de inserci on de un valor en un AVL
Gabriel Navarro
Tema 3 Arboles
Desequilibrio en 15: H(15->hi)-H(15->hd)= 1-(-1)= 2. (Desequilibrio izquierda) H(15->hi->hi) > H(15->hi->hd), 1 > -1. (Desequilibrio izquierda-izquierda) Rotaci on a la Derecha sobre 10.
Gabriel Navarro
Tema 3 Arboles
Soluci on: 20 10 1 15 40
Desequilibrio en 15: H(15->hi)-H(15->hd)= 1-(-1)= 2. (Desequilibrio izquierda) H(15->hi->hi) > H(15->hi->hd), 1 > -1. (Desequilibrio izquierda-izquierda) Rotaci on a la Derecha sobre 10.
Gabriel Navarro
Tema 3 Arboles
Dado un nodo N, una Rotaci on a la izquierda sobre N implica que: El nodo N es hijo a la derecha de su padre. El nodo N reemplar a a su padre, llegando a ser hijo de su abuelo. El padre de N se convertir a en el hijo a la izquierda de N. El hijo a la izquierda de N se convertir a en hijo a la derecha de su antiguo padre.
Gabriel Navarro
Tema 3 Arboles
52 arbol desequilibrado
Tras la inserci on: H(36->hi)-H(36->hd)= 0-2= -2. Desequilibrio por la derecha. H(36->hd->hd) > H(36->hd->hi). Entonces hay desequilibrio derecha-derecha. Se hace rotaci on simple a la izquierda.
Gabriel Navarro
Tema 3 Arboles
40 pasa a ser hijo derecha de 20, y 20 pasa a ser padre de 40. 38 pasa a ser hijo derecha de 36, y 36 pasa a ser padre de 38. 36 pasa a ser hijo izquierda de 40, y 40 padre de 36. 20 9 8 16 36 38 40 50 52
Gabriel Navarro
Tema 3 Arboles
Desequilibrio en 15: H(15->hi)-H(15->hd)= 1-(-1)= 2. (Desequilibrio izquierda) H(15->hi->hi) < H(15->hi->hd), -1 < 1. (Desequilibrio izquierda-derecha) Rotaci on a la Izquierda sobre 11. Rotaci on a la Derecha sobre 11.
Gabriel Navarro
Tema 3 Arboles
Soluci on: 15 11
20 40 10 11
20 40 15
10 Rotaci on izquierda en 11
Rotaci on derecha en 11
Gabriel Navarro
Tema 3 Arboles
Tras la inserci on: H(40->hi)-H(40->hd)= -1-1= -2. Desequilibrio por la derecha. H(40->hd->hd) < H(40->hd->hi). Entonces hay desequilibrio derecha-izquierda. Se hace rotaci on simple a la derecha y luego a la izquierda.
Gabriel Navarro Tema 3 Arboles
20 9 8 16 25 36 40 49 50 Rotaci on dcha. en 49 8 9 16
20 36 25 40 49 50
Rotaci on izq. en 49
Gabriel Navarro
Tema 3 Arboles
La eliminaci on de nodos en un AVL se realiza de igual forma que en un ABB. El nodo eliminado se sustituye por: O bien el mayor de los descendientes a la izquierda. O bien el menor de los descendientes a la derecha. El equilibrado comienza a realizarse desde el padre inicial del nodo seleccionado para cubrir el hueco del nodo eliminado. Ejercicio Implementar la funci on de borrado en un AVL
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
Los Arboles Parcialmente Ordenados y Completos (APOC) son: rboles binarios completos, es decir, tiene todos sus niveles a completos excepto el u ltimo con todas sus hojas a la izquierda, y est an parcialmente ordenados, es decir, el valor de un nodo siempre es menor que el de sus hijos. Permiten recuperar el m nimo de un conjunto de forma eciente, con complejidad O(1).
Gabriel Navarro
Tema 3 Arboles
Ejemplo 1 2 3 10 4 5 7 6 2 3
Gabriel Navarro
Tema 3 Arboles
Es una estructura de datos cl asica para implementar un heap Heap Es una estructura de datos dise nada para almacenar un conjunto de elementos para realizar las siguientes operaciones: Devolver el m nimo Borrar el m nimo Insertar un elemento
Gabriel Navarro
Tema 3 Arboles
Operaciones en un APOC El m nimo se obtiene simplemente accediendo a la ra z. La inserci on de un elemento siempre se realiza lo m as a la izquierda posible dentro del nivel de mayor profundidad y, en caso de estar este completo, se inserta como elemento m as a la izquierda del nivel siguiente. El borrado se realizar au nicamente en la ra z
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Insertamos valor 3 1 2 4 10 3 5 6 2 3
10 3<4, intercambiamos. 1 2 3 10 4 5 6 2 3
Gabriel Navarro
Tema 3 Arboles
10 4 0 0<2, intercambiamos. 1 0 3 10 4 2 5 6 2 3
10 4 5 0<1, intercambiamos. 0 1 3 10 4 2 5 6 2 3
Gabriel Navarro
Tema 3 Arboles
En un APO, el nodo borrado del arbol se sustituye por el nodo m as a la derecha del nivel m as profundo. Seguidamente, se reorganiza el arbol para que se cumplan los requisitos del APO. La reorganizaci on consiste en intercambiar el nodo introducido por su hijo de menor valor hasta que, o bien el nodo sea hoja, o bien el hijo menos tenga valor superior al nodo.
Gabriel Navarro
Tema 3 Arboles
1 3 2 6
2 5 6 3
Tema 3 Arboles
2 5 6 3
Gabriel Navarro
Gabriel Navarro
Tema 3 Arboles
Por tanto, los hijos a la izquierda se encontrar an en las componentes impares y los hijos a la derecha en las pares. La ra z estar a en la componente 0 del vector. Respectivamente: Todo padre de un hijo a la izquierda N est a en la componente (N-1)/2 Todo padre de un hijo a la derecha N est a en la componente (N-2)/2
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
Tema 3 Arboles
ARBOLES N-ARIOS
Gabriel Navarro
Tema 3 Arboles
Arboles n-arios
Son arboles con nodos cuyo n umero de hijos no est a limitado a priori. Por tanto, no procede hablar de Hijo a la Izquierda e Hijo a la Derecha. En su lugar hablaremos de: Hijo a la Izquierda: El hijo de un nodo situado m as a la izquierda. Hermano a la Derecha: El hijo de un nodo que est a situado justo a la derecha de otro nodo hijo del mismo.
Gabriel Navarro
Tema 3 Arboles
B E F H J G Q K I
C L
D M O N P
Gabriel Navarro
Tema 3 Arboles
El tipo Nodo del arbol es entero. La relaci on padre-hijo se representa en un vector P, donde P[i] indica cu al es el nodo padre de i. Si el nodo no tiene padre (es la ra z), P[i] tomar a valor -1. Las etiquetas de los nodos se representan en otro vector de etiquetas. Esta implementaci on es relativamente sencilla y con bajo coste de memoria. Facilita las operaciones de acceso a los ancestros de un nodo (eciencia O(log(n)) para viajar desde un nodo hoja hasta la ra z), pero resulta dif cil gestionar operaciones con los hijos (conocer la altura, determinar los hijos, establecer hijo izquierda y hermano derecha...).
Gabriel Navarro
Tema 3 Arboles
6 3 7 9 8 0
En el ejemplo, resulta dif cil hallar que 5 es hijo a la izquierda de 2. Para solucionar este problema ser a necesario establecer un orden entre los nodos. Esto puede implementarse directamente sobre el vector, o incluyendo otros tipos de datos (por ejemplo, otro vector de hijos izquierda).
El arbol se representa en un vector de listas. Cada ndice de la componente del vector se asocia a un nodo, y cada componentes es una lista de enteros con los ndices de sus nodos hijos. El problema es determinar cu al nodo es el ra z. Para ello, usaremos arbol. una variable raiz que apunte al nodo del Pueden incluirse las etiquetas de los nodos en un vector adicional.
Gabriel Navarro
Tema 3 Arboles
2 5
6 X 4 3 X 2 5 4 3 7 9 1 6 8 0
7 9
8 X 0 X
La implementaci on de arboles con listas, al contrario que la matricial, diculta el acceso a los padres de un nodo y operaciones asociadas con el mismo. Por ejemplo: obtener la profundidad de un nodo es O(n).
Gabriel Navarro
Tema 3 Arboles
Un nodo del arbol ser a una celda reservada con memoria din amica, conteniendo los campos siguientes: Puntero al nodo padre. Puntero al nodo hijo a la izquierda. Puntero al nodo hermano a la derecha. Etiqueta.
Gabriel Navarro
Tema 3 Arboles
Gabriel Navarro
template <class T> class Arbol { public: Arbol(); Arbol( T valor); Arbol(const Arbol<T> & a); Arbol(); void setRaiz(T valor); Nodo getRaiz(); T getEtiqueta(Nodo n) const; void setEtiqueta(Nodo &n, T valor); ...
Gabriel Navarro
Tema 3 Arboles
... Nodo getPadre(Nodo n); Nodo getHijoIzq(Nodo n); Nodo getHermanoDcha(Nodo n); Nodo getHermanoIzq(Nodo n); void insertarHijoIzq(Nodo &p, T valor); void insertarHermanoDcha(Nodo &p, T valor); void podar(Nodo &n); void vaciar(); bool estaVacio() const; Arbol<T> & operator= (const Arbol<T> &a); bool operator== (const Arbol<T> &a) const; };
Gabriel Navarro
Tema 3 Arboles
Lo m as relevante: Inserci on de hijos y hermanos. Poda. Copia de arboles. Ver Especicaci on Completa Ver Implementaci on Completa
Gabriel Navarro
Tema 3 Arboles
Crear una nueva celda aux. Si el nodo N->hijoi != 0, desplazar N->hijoi como hermano a la derecha de aux, haciendo aux->herd= N->hijoi. Asignar N->hijoi= aux y N->hijoi->padre= N.
Gabriel Navarro
Tema 3 Arboles
La inserci on del hermano a la derecha de un nodo N supone realizar las siguientes acciones:
1 2
Crear una nueva celda aux. Asignar el hermano a la derecha de N como hermano a la derecha de aux: aux->herd= N->herd Asignar aux como nuevo hermano a la derecha de N: N->herd= aux Asignar el padre de aux como el padre de N: aux->padre= N->padre
3 4
Gabriel Navarro
Tema 3 Arboles
Si el nodo N a eliminar es nulo, salir. Mientras N tenga hijos a la izquierda, podar(N->hijoi) Asignar aux= hermano a la izquierda de N Si N es nulo, entonces hacer N->padre->hijoi= 0 En otro caso, reasignar hermano a la derecha del hermano a la izquierda de N: aux->herd= N->herd Eliminar nodo N
Gabriel Navarro
Tema 3 Arboles
La copia de un sub arbol con nodo ra z orig en otro con nodo ra z dest supone que inicialmente dest es un sub arbol vac o. Para copiar orig en dest, realizaremos las siguientes acciones:
1 2
Crear la nueva celda dest y asignarle el valor de orig->valor Llamar recursivamente a CopiarNodos de orig->hijoi en dest->hijoi. Si la copia del hijo izquierdo no es nulo, asignar dest->hijoi->padre= dest Copiar recursivamente los hermanos a la derecha de orig->hijoi, de igual forma a como se ha copiado el hijo a la izquierda.
Gabriel Navarro
Tema 3 Arboles