You are on page 1of 116

Tema 3 Arboles

Gabriel Navarro

Estructuras de Datos
Grado en Ingenier a Inform atica

Gabriel Navarro

Tema 3 Arboles

Indice

Concepto de arbol Recorridos en arboles Arboles binarios


Arboles binarios: Implementaci on con celdas enlazadas Iteradores Arboles de expresiones Arboles binarios de b usqueda (ABB) Arboles binarios de b usqueda balanceados (AVL) Arboles parcialmente ordenados (APO)

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

Concepto de arbol: Ejemplo

Tierra

Ant artida

Europa Espa na Alemania

Am erica

Africa Somalia Argelia

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

Arboles: Recorrido en preorden


A

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

Arboles: Recorrido en inorden


A

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

Arboles: Recorrido en postorden


A

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

Arboles: Recorrido por niveles


A

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

Arboles binarios: Representaci on con celdas enlazadas

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

Arboles binarios: Representaci on con celdas enlazadas


Con esta representaci on, Nodo de un arbol es la referencia a la zona de memoria de la celda que lo contiene. Celda se declara como una subclase de Lista: template <class Elemento> class ArbolBinario { ... public: class Celda { private: Elemento et; Celda * padre, hi, hd; public: ... friend class ArbolBinario; // Para permitir al arbol acceder a los atributos }; typedef Celda * Nodo ; ... };
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Representaci on con celdas enlazadas


Representaci on del arbol Celda *raiz; /**< Nodo ra z del arbol */ Funci on de Abstraccion Dado el tipo representado rep={raiz}, el objeto al que representa es un arbol L tal que raiz es la ra z del arbol, raiz->hi contiene su hijo izquierdo y raiz->hd contiene su hijo a la derecha. Recursivamente raiz->hi y raiz->hd ser an a su vez sub arboles del a rbol original. 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.
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Implementaci on con celdas enlazadas

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

Arboles binarios: Implementaci on. Celdas

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

Arboles binarios: Implementaci on. Gesti on de arboles vac os


Diremos que el arbol estar a vac o si raiz==0. Por tanto, cada constructor deber a inicializar raiz= 0; antes de realizar cualquier operaci on.
template <class T> ArbolBin<T>::ArbolBin() { raiz= 0; } template <class T> ArbolBin<T>::ArbolBin(const ArbolBin<T> &a) { raiz= 0; *this= a; } template <class T> bool ArbolBin<T>::estaVacio() { return raiz == 0; }
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Implementaci on. Gesti on de arboles vac os

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

Arboles binarios: Implementaci on. Gesti on de arboles vac os


Dado que un arbol vac o no tiene memoria reservada para la ra z, la inserci on de la misma diere de la inserci on de otros nodos, como los hijos. El m etodo void setRaiz(T valor ); se encarga de comprobar si la ra z est a reservada o no. Si lo est a, vaciar a el arbol. En caso contrario, reservar a memoria para el nodo y le asignar a su etiqueta.
void setRaiz(T valor) { if (raiz != 0) vaciar(); // Recordar que new Celda() hace NULL el padre y los hijos raiz= new (nothrow) Celda (); raiz->valor= valor; }
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Inserci on de hijos


La inserci on de hijos implica varias tareas:
1 2 3 4

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

Arboles binarios: Poda

La poda puede realizarse mediante un procedimiento recursivo como el siguiente:


1

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

Arboles binarios: Poda


void ArbolBin<T>::podar(ArbolBin<T>::Nodo &n) { typename ArbolBin<T>::Nodo aux= n; if (aux == 0) return ; // Descolgamos nodo del padre if (aux->padre != 0) { if (aux->padre->hi == aux) aux->padre->hi= 0; else aux->padre->hd= 0; } // Podamos hijos podar(aux->hi); podar(aux->hd); // Eliminamos nodo delete aux; n= 0; }
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Conocer n umero de nodos

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

Arboles binarios: Conocer n umero de nodos


int ArbolBin<T>::numNodos() const { int suma= 0; Pila<typename ArbolBin<T>::Nodo> p; typename ArbolBin<T>::Nodo aux; if (raiz == 0) return ; // Recorremos en preorden el arbol. // Por cada nodo no nulo, contabilizamos suma++ p.insertar(raiz); while ( !p.estaVacia() ) { aux= p.verElemento(); p.quitar(); suma++; if (aux->hd != 0) p.insertar(aux->hd); if (aux->hi != 0) p.insertar(aux->hi); } return suma; }
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Conocer altura y profundidad

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 ) =

1 1 + max{H (N > hi), H (n > hd)} P (N ) = 1 1 + P (N > padre)

; N == 0 ;

; N == 0 ;

Gabriel Navarro

Tema 3 Arboles

Arboles binarios: Conocer altura y profundidad


int ArbolBin<T>::getAltura(typename ArbolBin<T>::Nodo n) const { int ahi, ahd, max; if (n == 0) return -1; ahi= getAltura(n->hi); ahd= getAltura(n->hd); max= (ahi<ahd)? ahd:ahi; return max+1; } int ArbolBin<T>::getProfundidad(typename ArbolBin<T>::Nodo n) const { if (n == 0) return -1; return 1+getProfundidad(n->padre); }
Gabriel Navarro Tema 3 Arboles

Arboles binarios: Ejemplo de uso


main() { ArbolBin<char> arbol, arbol2; typename ArbolBin<char>::Nodo aux; // Rellenamos arbol arbol.setRaiz(A); aux= arbol.getRaiz(); arbol.insertarHijoIzq(aux, B); arbol.insertarHijoDcha(aux, C); aux= arbol.getHijoIzq(arbol.getRaiz()); arbol.insertarHijoIzq(aux, D); arbol.insertarHijoDcha(aux, E); aux= arbol.getHijoDcha(arbol.getRaiz()); arbol.insertarHijoIzq(aux, F); arbol.insertarHijoDcha(aux, G); aux= arbol.getHijoDcha(aux); arbol.insertarHijoDcha(aux, H); .... }
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

Iteradores: M etodos comunes

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

Iteradores: Implementaci on en arboles


La interfaz de todo iterador, para arboles binarios, debe implementarse como subclase y ser similar a la siguiente:
class Iterador { private: typename ArbolBin<Elemento>::Nodo actual; public: Iterador(const ArbolBin<Elemento> &a); bool nal(); typename ArbolBin<Elemento>::Nodo getNodo(); bool operator!=(typename ArbolBin<Elemento>::Nodo n); }

Gabriel Navarro

Tema 3 Arboles

Iteradores: Implementaci on en arboles. Ejemplo.


template <class T> class ArbolBin { ... public: class IteradorPreorden { private: typename ArbolBin<T>::Nodo actual; public: Iteradorpreorden(const ArbolBin<T> &a); bool nal(); typename ArbolBin<T>::Nodo getNodo(); bool operator!=(typename ArbolBin<T>::Nodo n); }; ... };
Tema 3 Arboles

Gabriel Navarro

Iteradores: Implementaci on en arboles. Ejemplo.


template <class T> ArbolBin<T>::IteradorPreorden::IteradorPreorden(const ArbolBin<T> &a) { actual= a.getRaiz(); } template <class T> ArbolBin<T>::IteradorPreorden::nal() { return 0; } template <class T> typename ArbolBin<T>::Nodo ArbolBin<T>::IteradorPreorden::getNodo() { return actual; }

Gabriel Navarro

Tema 3 Arboles

Iteradores: Implementaci on en arboles. Ejemplo.


template <class T> ArbolBin<T>::IteradorPreorden::operator++(int j) { if ( actual->hi != 0 ) actual= actual->hi; else if ( actual->hd != 0 ) actual= actual->hd; else { if ( actual->padre != 0 ) { while ( (actual->padre != 0) && (actual->padre->hd == actual) ) actual= actual->padre; if ( actual->padre != 0 ) actual= actual->padre->hd; else actual= actual->padre; } else actual= actual->padre; } return *this; }
Gabriel Navarro Tema 3 Arboles

Iteradores: Ejemplo de uso


template <class T> void MostrarPreorden(ArbolBin<T> a) { for (ArbolBin<T>::IteradorPreorden it(a); it!=it.nal(); it++ ) { cout<<a.getEtiqueta(it.getNodo()) << ; } cout<<endl; } main(){ ArbolBin<int>arbol(9); ... MostrarPreorden<int>(arbol); ... }

Gabriel Navarro

Tema 3 Arboles

Iteradores: Ejemplo de uso


template <class T> void MostrarInorden(ArbolBin<T> a) { for (ArbolBin<T>::IteradorInorden it(a); it!=it.nal(); it++ ) { cout<<a.getEtiqueta(it.getNodo()) << ; } cout<<endl; } main(){ ArbolBin<int>arbol(9); ... MostrarInorden<int>(arbol); ... }

Gabriel Navarro

Tema 3 Arboles

Iteradores: Implementaci on en arboles binarios

Ver Especicaci on Completa Ver Implementaci on Completa

Gabriel Navarro

Tema 3 Arboles

ARBOLES DE EXPRESIONES

Gabriel Navarro

Tema 3 Arboles

Denici on de arbol de expresi on

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

Ejemplo de arbol de expresi on


+ 8 3 X * 7

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

Ejemplo de arbol de expresi on


+ 0 8 3 X * 7

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

ARBOLES BINARIOS DE BUSQUEDA

Gabriel Navarro

Tema 3 Arboles

Arboles Binarios de B usqueda


Un arbol binario de b u squeda (ABB) es un arbol binario que cumple las siguientes propiedades: Es un arbol binario. La etiqueta de cada nodo del arbol es menor que cualquiera de los descendientes por su izquierda. La etiqueta de cada nodo del arbol es mayor que cualquiera de los descendientes por su derecha. Ejemplo: 20 9 8 16 25 36 40

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

Arboles Binarios de B usqueda


Denici on Se dice que un ABB est a equilibrado cuando, para cualquier nodo del arbol, la diferencia entre la altura de sus hijos no es superior a 1 (respectivamente, inferior a -1) Ejemplo: 20 9 8 16 25 38 Est a equilibrado 36 40 50 8 9 16 25 38

20 36 40 50

52 No est a equilibrado en 36.


Gabriel Navarro Tema 3 Arboles

Arboles Binarios de B usqueda


Los arboles binarios de b usqueda son la base para arboles m as complejos como los ndices. Se utilizan para reducir la b usqueda de elementos. Si el arbol est a equilibrado esta tiene un coste de O(log(n)). La inserci on en un ABB la realiza el arbol autom aticamente en el nodo hoja que le corresponda, seg un el valor de la etiqueta del nodo. Para preservar las propiedades del arbol, el borrado de nodos en un ABB se realiza sustituyendo el elemento a eliminar por: O bien el descendiente a la izquierda con valor de etiqueta mayor. O bien el descendiente a la derecha con valor de etiqueta menor.
Gabriel Navarro Tema 3 Arboles

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: Representaci on con datos miembro


Representaci on del arbol ArbolBin<T> L; /**< Arbol binario que representa al ABB */ Funci on de Abstraccion Dado el tipo representado rep={raiz}, el objeto al que representa es un arbol L tal que raiz es la ra z del arbol, raiz->hi contiene su hijo izquierdo y raiz->hd contiene su hijo a la derecha. Recursivamente raiz->hi y raiz->hd ser an a su vez sub arboles del a rbol original. 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.
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

ABB: Inserci on de elementos en el arbol

bool Insertar(typename ArbolBinT::Nodo raiz, T valor); El procedimiento de inserci on es el siguiente:


1

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.

Ver Implementaci on Completa

Gabriel Navarro

Tema 3 Arboles

ABB: Inserci on de elementos en el arbol

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

ABB: Borrado de elementos en el arbol

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

ABB: Borrado de elementos en el arbol

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

ABB: Borrado de elementos en el arbol


void ABB<T>::EliminarRaiz (typename ArbolBin<T>::Nodo raiz){ if (raiz -> hi==0 && raiz -> hd ==0 ){// sin hijos delete raiz; raiz = 0; } else if ( raiz -> hi == 0 ){ // s olo hijo derecha typename ArbolBin<T>::Nodo aux =raiz; raiz = raiz -> hd; delete aux; } else if ( raiz -> hd == 0 ){ // s olo hijo izq. typename ArbolBin<T>::Nodo aux =raiz; raiz = raiz -> hd; delete aux; } else {// tiene dos hijos typename ArbolBin<T>::Nodo aux =raiz -> hd; while (aux -> hi !=0 ) aux = aux -> hi; raiz -> et = aux -> et; Borrar (raiz -> hd, aux -> et); } }
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

Arboles AVL: Inserci on

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

aux= padre del nodo insertado. Mientras (aux != NULL), hacer:


1 2 3

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

Arboles AVL: Equilibrado

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

Arboles AVL: Equilibrado


Rotaci on simple a derecha

Gabriel Navarro

Tema 3 Arboles

Arboles AVL: Equilibrado


Rotaci on simple a izquierda

Gabriel Navarro

Tema 3 Arboles

Arboles AVL: Equilibrado


Rotaci on doble izquierda-derecha

Gabriel Navarro

Tema 3 Arboles

Arboles AVL: Equilibrado


Rotaci on doble derecha-izquierda

Gabriel Navarro

Tema 3 Arboles

Arboles AVL: Algoritmo para conocer el tipo de desequilibrio

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

Arboles AVL: Algoritmo para conocer el tipo de desequilibrio

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

Arboles AVL: Ejercicios

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

Arboles AVL: Rotaci on a la derecha. Ejemplo.

Inserci on del valor 1 en el arbol: 20 15 10 40 15 10 1 20 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

Arboles AVL: Rotaci on a la derecha. Ejemplo

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

Arboles AVL: Rotaci on a la izquierda

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

Arboles AVL: Rotaci on a la izquierda. Ejemplo


20 9 8 16 25 38 Insertar 52 36 40 50 8 9 16 25 38 20 36 40 50

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

Arboles AVL: Rotaci on a la izquierda. Ejemplo

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

Arboles AVL: Rotaci on izquierda-derecha. Ejemplo.

Inserci on del valor 11 en el arbol: 20 15 10 40 15 10 11 20 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-derecha) Rotaci on a la Izquierda sobre 11. Rotaci on a la Derecha sobre 11.

Gabriel Navarro

Tema 3 Arboles

Arboles AVL: Rotaci on izquierda-derecha. Ejemplo.

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

Arboles AVL: Rotaci on derecha-izquierda. Ejemplo


20 9 8 16 25 36 40 50 Insertar 49 8 9 16 25 20 36 40 50 49 arbol desequilibrado

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

Arboles AVL: Rotaci on derecha-izquierda. Ejemplo

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

Arboles AVL: Borrado

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

ARBOLES PARCIALMENTE ORDENADOS

Gabriel Navarro

Tema 3 Arboles

Arboles Parcialmente Ordenados y Completos

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

Arboles Parcialmente Ordenados y Completos

Ejemplo 1 2 3 10 4 5 7 6 2 3

Gabriel Navarro

Tema 3 Arboles

Arboles Parcialmente Ordenados y Completos

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

Arboles Parcialmente Ordenados y Completos

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

Arboles Parcialmente Ordenados: Inserci on


Inicialmente, el elemento se inserta en el nivel m as profundo y lo m as a la izquierda posible. Seguidamente, el arbol se reorganiza para colocar el nodo insertado en su sitio, de modo que se cumplan los requisitos del arbol. La reorganizaci on consiste en intercambiar el nodo introducido por su padre hasta que, o bien el nodo sea ra z, o bien el padre tenga valor inferior al nodo. Ejemplo: 1 2 4 5 3 6 4 Insertamos el valor 2 1 2 5 6 3 2
Tema 3 Arboles

Gabriel Navarro

Arboles Parcialmente Ordenados: Inserci on


2<3, intercambiamos. 1 2 4 5 6 2 3 4 Insertamos valor 10. 1 2 5 6 2 3

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

Arboles Parcialmente Ordenados: Inserci on


Insertamos valor 0. 1 2 3 5 6 2 3 3 0<5, intercambiamos. 1 2 0 6 2 3

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

Arboles Parcialmente Ordenados: borrado

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

Arboles Parcialmente Ordenados: borrado


Ejemplo: Eliminamos 0 Sustituimos por 5 5 1 3 3 2 6 2 3

1 3 2 6

10 4 5 Hijo menor 1<5. Intercambiamos. 1 2 3 10 4


Gabriel Navarro

10 4 Hijo menos 2<5. Intercambiamos.

2 5 6 3

Tema 3 Arboles

Arboles Parcialmente Ordenados: borrado


Ejemplo: Eliminamos 1 1 2 3 5 6 2 3 3 Sustituimos por 4 4 2 5 6 2 3

10 4 Hijo menor 2<4. Sustituimos. 2 4 3 10 5 6 2 3

10 Hijo menor 3<4. Sustituimos. 2 3 4 10


Tema 3 Arboles

2 5 6 3

Gabriel Navarro

APO en ordenaci on: HeapSort


Los arboles APO pueden utilizarse para ordenar conjuntos de elemento, haciendo uso de que la ra z siempre ser a el elemento menor del arbol. El algoritmo HeapSort consiste en introducir todos los elementos en el APO, e ir obteniendo y eliminando repetidamente la ra z del mismo. Los elementos se obtendr an en orden creciente y con una eciencia de O(n*log(n)). void HeapSort(double *v, int tam){ APO<double> a; for (int i= 0 ; i<tam; i++ ) a.insertar(v[i]); for (int i= 0 ; i<tam; i++ ) { v[i]= a.getEtiqueta(a.getRaiz()); a.borrar(); } }
Gabriel Navarro Tema 3 Arboles

Arboles Parcialmente Ordenados: Representaci on


La forma m as simple de implementar un APOC es mediante vectores. Representaci on T *v; /**< vector de nodos */ int nelem; /**< N umero de nodos del arbol */ int maxelem; /**< N umero m aximo de nodos del arbol */ Con esta representaci on, se cumplen las siguientes propiedades: Todo hijo a la izquierda de un nodo N se encuentra en la componente 2*N+1 Todo hijo a la derecha de un nodo N se encuentra en la componente 2*N+2

Gabriel Navarro

Tema 3 Arboles

Arboles Parcialmente Ordenados: Representaci on

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

Arboles Parcialmente Ordenados: Representaci on


Funci on de abstracci on Un objeto v alido rep=v,nelem,maxelem del TDA APO representa al APO A tal que: rep.v contiene los elementos del arbol. rep.nelem contiene el n umero de nodos del arbol. rep.maxelem contiene el n umero m aximo de nodos del arbol. Invariante de la Representaci on 0 <= rep.nelm < rep.maxelem rep.v apunta a una zona de memoria reservando un vector con rep.maxelem componentes. Para cada nodo N tal que 2*N+1=rep.nelem, rep.v[N] < rep.v[2*N],rep.v[2*N+1]
Gabriel Navarro Tema 3 Arboles

Arboles Parcialmente Ordenados: Interfaz


template <class T> class APO { ... public: typedef int Nodo ; APO(); APO(T valor); APO(const APO<T> &valor); APO(); Nodo getRaiz(); int getEtiqueta(Nodo n); Nodo getPadre(Nodo n); Nodo getHijoIzq(Nodo n); Nodo getHijoDcha(Nodo n); void insertar(T valor); void borrar(); void vaciar(); bool estaVacio(); APO<T> & operator=(const APO<T> &a); bool operator==(const APO<T> &a); };
Gabriel Navarro Tema 3 Arboles

Arboles Parcialmente Ordenados: Representaci on

Ver Especicaci on Completa Ver Implementaci on Completa

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

Arboles n-arios: Ejemplo

B E F H J G Q K I

C L

D M O N P

Gabriel Navarro

Tema 3 Arboles

Arboles n-arios: Implementaciones


Al igual que en los TDAs estudiados con anterioridad, la forma de implementar un arbol n-ario depender a del problema a resolver y de la capacidad del dise nador. No obstante, existen 3 implementaciones b asicas: Implementaci on matricial. El arbol se representa en un vector de enteros, donde cada componente contiene el ndice de su nodo padre. Implementaci on con listas. Se representa mediante un vector de listas. Cada ndice de las componentes del vector se asocia con un nodo del arbol, y cada componente es una lista con los hijos del nodo. Implementaci on con celdas enlazadas. Cada nodo del arbol es una celda enlazada con un puntero a su padre, a su hijo izquierda y a su hermano derecha.
Gabriel Navarro Tema 3 Arboles

Arboles n-arios: Implementaci on matricial

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

Arboles n-arios: Implementaci on matricial. Ejemplo


1 2 5 P= 0 1 2 3 4 5 6 7 8 9 8 -1 1 2 2 2 1 6 6 8 raiz Etiquetas= 0 1 2 3 4 5 6 7 8 9
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).

Arboles n-arios: Implementaci on con listas

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

Arboles n-arios: Implementaci on con listas. Ejemplo


0 X 1 2 3 X 4 X 5 X 6 7 X 8 9 X raiz= 1;
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

Arboles n-arios: Implementaci on con listas

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

Arboles n-arios: Implementaci on con celdas enlazadas

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

Arboles n-arios: Implementaci on con celdas enlazadas


Celda de un arbol n-ario:
template <class Elemento> class Arbol { ... public: class Celda { private: Elemento et; Celda *padre; Celda *hijoi; // Hijo a la izquierda Celda *herd; // Hermano a la derecha public: ... friend class Arbol; // Para permitir al arbol acceder a los atributos }; typedef Celda * Nodo ;
Tema 3 Arboles

Gabriel Navarro

Arboles n-arios: Representaci on con celdas enlazadas


Representaci on del arbol Celda *raiz; /**< Nodo ra z del arbol */ Funci on de Abstraccion Dado el tipo representado rep={raiz}, el objeto al que representa es un arbol L tal que raiz es la ra z del arbol, y para cualquier nodo N, N->padre contiene el padre de N, N->hijoi contiene su hijo izquierdo y N->herd contiene su hermano a la derecha. Recursivamente N->hijoi y N->herd ser an a su vez sub arboles del a rbol original. Invariante de la Representaci on rep.raiz es null. En caso contrario, rep.raiz->padre y rep.raiz->herd es null. Para todo nodo del arbol N, N->hijoi apunta a su hijo izquierdo, o vale null en caso de no tener. N->herd apunta a su hermano derecho, o vale null en caso de no tener.
Gabriel Navarro Tema 3 Arboles

Arboles n-arios: Interfaz

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

Arboles n-arios: Interfaz

... 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

Arboles n-arios: Interfaz

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

Arboles n-arios: Inserci on de hijos a la izquierda

La inserci on de un hijo a la izquierda supone realizar las siguientes acciones:


1 2

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

Arboles n-arios: Inserci on de hermanos a la derecha

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

Arboles n-arios: Poda de nodos


La poda de un nodo N supone eliminar N y todos sus descendientes, reasignar sus hermanos (a la izquierda y a la derecha) y, en caso de ser hijo a la izquierda, modicar el padre:
1 2 3 4 5

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

Arboles n-arios: Copiar sub 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

You might also like