Sei sulla pagina 1di 11

Estructuras de Datos. Curso 2011/2012 Grado en Ingenier Informtica a a Enunciado de la Prctica a 1.

Introduccin o

La prctica consiste en implementar la clase Arbol General y usarla para implementar algunas funciones a concretas.

2.

Representacin del tipo Arbol General o

Se usar como representacin del rbol general la del hijo-mas-a-la-izquierda/hermano-a-la-derecha. a o a A continuacin se da una breve descripcin de lo que podr ser la clase, aunque se tiene libertad para aadir o o a n o quitar las funciones que se estimen oportunas, o incluso disear la clase de otra forma. n

2.1.

Interfaz: arbolgeneral.h

#ifndef __ArbolGeneral_h__ #define __ArbolGeneral_h__ /** @memo T.D.A. ArbolGeneral @doc {\bf Definicin:} o Una instancia $a$ del tipo de dato abstracto {\em ArbolGeneral} sobre un dominio {\em Tbase} se puede construir como \begin{itemize} \item Un objeto vaco (rbol vaco) si no contiene ningn elemento. Lo a u denotamos \{\} \item Un rbol que contiene un elemento destacado, el nodo raz, con un a valor {\em e} en el dominio {\em Tbase} (denominado {\em etiqueta}), y $k$ subrboles ($T_1$ $\ldots$ $T_k$) del T.D.A. {\em ArbolGeneral} a sobre {\em Tbase}. Se establece una relacin {\em padre-hijomasalaizquierda-hermanoaladerecha} entre cada nodo o y los nodos raz de los subrboles (si los hubiera) que cuelgan de l. a e \end{itemize} Para poder usar el tipo de dato {\em ArbolGeneral} se debe incluir el fichero \begin{center} {\em ArbolGeneral.h} \end{center} El espacio requerido para el almacenamiento es O(n). Donde n es el nmero de nodos del rbol. u a @author @version 1.0

*/ template <class Tbase> class ArbolGeneral { private: /** @name Implementacin de T.D.A. ArbolGeneral o @memo Parte privada. */ /*@{*/ /** @memo Nodo @doc En cada estructura {\em nodo} se almacena una etiqueta del a rbol, que se implementa como un conjunto de nodos enlazados segn la relacin padre-hijo-hermano u o */ struct nodo { /** @memo Elemento almacenado @doc En este campo se almacena la etiqueta que corresponde a este nodo */ Tbase etiqueta; /** @memo Puntero al hijo ms a la izquierda a @doc En este campo se almacena un puntero al nodo raz del subrbol ms a la izquierda, o el valor 0 si no tiene. a a */ nodo *izqda; /** @memo Puntero al hermano derecho @doc En este campo se almacena un puntero al nodo raz del subrbol hermano derecho, o el valor 0 si no tiene. a */ nodo *drcha; /** @memo Puntero al padre @doc En este campo se almacena un puntero al nodo padre, o el valor 0 si es la raiz. */ nodo }; /** @memo @doc a la

*padre;

Puntero a la raiz. Este miembro es un puntero al primer nodo, que corresponde raz del rbol. Vale cero sin el arbol es vaco a

*/ nodo *laraiz;

/** @name Invariante de la representacin o @memo Inv. de ArbolGeneral @doc A~adir el Invariante n

*/ /** @name Funcin de abstraccin o o @memo F.A. de ArbolGeneral. @doc A~adir la funcin n o */ /** */ /** @memo Destruye el subrbol a @param n: nodo que destruir junto con sus descendientes @doc libera los recursos que ocupa {\em n} y sus descendientes. */ void destruir(nodo * n); /** @memo Copia un subrbol a @param dest: referencia al puntero del que cuelga la copia @param orig: puntero a la raiz del subrbol a copiar a @doc Hace una copia de todo el subrbol que cuelga de {\em orig} en el a puntero {\em dest}. Es importante ver que en {\em dest->padre} (si existe) no se asigna ningn valor, pues no se conoce. u */ void copiar(nodo *& dest, nodo * orig); /** @memo Cuenta el nmero de nodos u @param n: nodo del que cuelga el subrbol de nodos a contabilizar. a @doc Copia cuntos nodos cuelgan de {\em n}, includo este. a */ void contar(const nodo * n)const; /** @memo Comprueba igualdad de subrbol a @param n1: Primer subrbol a comparar a @param n2: Segundo subrbol a comparar a @doc Comprueba si son iguales los subrboles que cuelgan de {\em n1} a y {\em n2}. Para ello debern tener los mismos nodos en las a mismas posiciones y con las mismas etiquetas. */ bool soniguales(const nodo * n1,const nodo * n2)const;

/** @memo Escribe un subrbol a @param out: stream de salida donde escribir @param nod: nodo del que cuelga el subrbol a escribir a @doc Escribe en la salida todos los nodos del subrbol que cuelga a del nodo {\em nod} siguiendo un recorrido en preorden. La forma de impresin de cada nodo es: o \begin{itemize} \item Si el nodo es {\em nodo_nulo}, imprime el carcter x a \item Si el nodo no es {\em nodo_nulo}, imprime el carcter n a seguido de un espacio, al que sigue la impresin de la etiqueta. o \end{itemize} */ void escribe_arbol(std::ostream& out, nodo * nod) const; /** @memo Lee un subrbol a @param in: stream de entrada desde el que leer @param nod: referencia al nodo que contendr el subrbol ledo a a @doc Lee de la entrada {\em in} los elementos de un arbol segn el u formato que se presenta en la funcin de escritura. o @see escribe_arbol */ void lee_arbol(std::istream& in, nodo *& nod); /*@}*/ public: /** @memo Tipo Nodo @doc Este tipo nos permite manejar cada uno de los nodos del arbol. Los valores que tomar sern tantos como nodos en el arbol (para a a poder referirse a cada uno de ellos) y adems un valor destacado a {\em nodo_nulo}, que indica que no se refiere a ninguno de ellos. Una variable {\em n} de este tipo se declara \begin{center} {\em ArbolGeneral::Nodo n}; \end{center} Las operaciones vlidas sobre el tipo nodo son: a - Operador de Asignacin (=) o - Operador de comprobacin de igualdad (==). o - Operador de comprobacin de no igualdad (!=). o */ typedef struct nodo * Nodo;

/** */ /** @memo Nodo nulo @doc El valor de nodo nulo se podr indicar como a {\em ArbolGeneral::nodo_nulo} */ // static const Nodo nodo_nulo = 0; /** */ /** @name Operaciones de T.D.A. arbol General @memo Operaciones sobre ArbolGeneral */ /*@{*/ /** @memo Constructor por defecto @doc Reserva los recursos e iniciliza el arbol a vaco \{\}. La operacin se realiza en tiempo O(1). o */ ArbolGeneral(); /** @memo Constructor de raiz @doc Reserva los recursos e iniciliza el arbol con un unico nodo raiz que tiene la etiqueta {\em e}, es decir, el arbol \{e,\{\},\{\}\}. La operacin se realiza en tiempo O(1). o */ ArbolGeneral(const Tbase& e); /** @memo Constructor de copias @param v: ArbolGeneral a copiar @doc Construye el rbol duplicando el contenido a de {\em v} en el rbol receptor. a La operacin se realiza en tiempo O(n), donde {\em n} es el nmero o u de elementos de {\em v}. */ ArbolGeneral (const ArbolGeneral<Tbase>& v); /** @memo Destructor @doc Libera los recursos ocupados por el arbol receptor. La operacin o se realiza en tiempo O(n) donde {\em n} es el nmero de u elementos del rbol receptor. a */ ~ArbolGeneral(); /**

@memo Asignacin o @param v: ArbolGeneral a copiar @return Referencia al rbol receptor. a @doc Asigna el valor del rbol duplicando el contenido a de {\em v} en el rbol receptor. a La operacin se realiza en tiempo O(n), donde {\em n} es el nmero o u de elementos de {\em v}. */ ArbolGeneral<Tbase>& operator=(const ArbolGeneral<Tbase> &v); /** @memo Asignar nodo raz @param e: etiqueta a asignar al nodo raz @doc Vaca el rbol receptor y le asigna como valor el arbol de un a u nico nodo cuya etiqueta es {\em e}. */ void AsignaRaiz(const Tbase& e); /** @memo Raz del rbol a @return Nodo raz del rbol receptor a @doc Devuelve el nodo raz, que coincide con {\em nodo_nulo} si el rbol est vaco. a a La operacin se realiza en tiempo O(1). o */ Nodo raiz() const; /** @memo Hijo ms a la izquierda a @param n: nodo del que se quiere obtener el hijo ms a la izquierda. a {\em n} no es {\em nodo_nulo} @return Nodo hijo ms a la izquierda a @doc Devuelve el nodo hijo ms a la izquierda de {\em n}, que valdr a a {\em nodo_nulo} si no tiene hijo ms a la izquierda. a La operacin se realiza en tiempo O(1). o */ Nodo hijomasizquierda(const Nodo n) const; /** @memo Hermano derecha @param n: nodo del que se quiere obtener el hermano a la derecha. {\em n} no es {\em nodo_nulo} @return Nodo hermano a la derecha @doc Devuelve el nodo hermano a la derecha de {\em n}, que valdr a {\em nodo_nulo} si no tiene hermano a la derecha. La operacin se realiza en tiempo O(1). o */ Nodo hermanoderecha(const Nodo n) const; /** @memo Nodo padre @param n: nodo del que se quiere obtener el padre. {\em n} no

es {\em nodo_nulo} @return Nodo padre @doc Devuelve el nodo padre de {\em n}, que valdr a {\em nodo_nulo} si es la raz. La operacin se realiza en tiempo O(1). o */ Nodo padre(const Nodo n) const; /** @memo Etiqueta en un nodo @param n: nodo en el que se encuentra el elemento. {\em n} no es {\em nodo_nulo} @return Referencia al elemento del nodo {\em n} @doc Devuelve una referencia al elemento del nodo {\em n} y por tanto se puede modificiar o usar el valor. La operacin se realiza en tiempo O(1). o */ Tbase& etiqueta(const Nodo n); /** @memo Etiqueta en un nodo @param n: nodo en el que se encuentra el elemento. {\em n} no es {\em nodo_nulo} @return Referencia constante al elemento del nodo {\em n}. @doc Devuelve una referencia al elemento del nodo {\em n}. Es constante y por tanto no se puede modificiar el valor. La operacin se realiza en tiempo O(1). o */ const Tbase& etiqueta(const Nodo n) const; /** @memo Copia Subrbol a @param orig: rbol desde el que se va a copiar una rama a @param nod: nodo raz del subrbol que se copia. Es un nodo a del rbol {\em orig} y no es {\em nodo_nulo} a @doc El rbol receptor acaba con un valor copia del subrbol que cuelga a a del nodo {\em nod} en el arbol {\em orig}. La operacin se realiza o en tiempo O(n) donde {\em n} es el nmero de nodos del subrbol u a copiado. */ void asignar_subarbol(const ArbolGeneral<Tbase>& orig, const Nodo nod); /** @memo Podar subrbol ms a la izquierda a a @param n: Nodo al que se le podar la rama hijo ms a la izquierda. No es a a {\em nodo_nulo} y es un nodo vlido del arbol receptor. a @param dest: rbol que recibe la rama cortada a @doc Asigna un nuevo valor al arbol {\em dest}, con todos los elementos del subrbol izquierdo del nodo {\em n} en el arbol receptor. a e ste se queda sin dichos nodos. La operacin se realiza en tiempo O(1). o

*/ void podar_hijomasizquierda(Nodo n, ArbolGeneral<Tbase>& dest); /** @memo Podar subrbol hermano derecha a @param n: Nodo al que se le podar la rama hermano derecha. No es a {\em nodo_nulo} y es un nodo vlido del arbol receptor. a @param dest: rbol que recibe la rama cortada a @doc Asigna un nuevo valor al arbol {\em dest}, con todos los elementos del subrbol hermano derecho del nodo {\em n} en el arbol receptor. a e ste se queda sin dichos nodos. La operacin se realiza en tiempo O(1). o */ void podar_hermanoderecha(Nodo n, ArbolGeneral<Tbase>& dest); /** @memo Insertar subrbol izquierda a @param n: Nodo al que se insertar el arbol {\em rama} como a hijo ms a la izquierda. No es a {\em nodo_nulo} y es un nodo vlido del arbol receptor a @param rama: rbol que se insertar como hijo ms a la izquierda. a a a @doc El rbol {\em rama} se inserta como hijo ms a la izquierda del nodo a a {\em n} del rbol receptor. El arbol {\em rama} queda vaco a y los nodos que estaban en el subrbol hijo ms a la izquierda de {\em n} a a se desplazan a la derecha, de forma que el anterior hijo ms a la izquierda pasa a ser a el hermano a la derecha del nuevo hijo ms a la izquierda. a */ void insertar_hijomasizquierda(Nodo n, ArbolGeneral<Tbase>& rama); /** @memo Insertar subrbol derecha a @param n: Nodo al que se insertar el arbol {\em rama} como a hermano a la derecha. No es {\em nodo_nulo} y es un nodo vlido del arbol receptor a @param rama: rbol que se insertar como hermano derecho. a a @doc El rbol {\em rama} se inserta como hermano derecho del nodo a {\em n} del rbol receptor. El arbol {\em rama} queda vaco a y los nodos que estaban a la derecha del nodo n pasan a la derecha del nuevo nodo. */ void insertar_hermanoderecha(Nodo n, ArbolGeneral<Tbase>& rama); /** @memo Borra todos los elementos @doc Borra todos los elementos del arbol receptor. Cuando termina, el rbol est vaco. La operacin se realiza a a o en tiempo O(n), donde {\em n} es el nmero u de elementos del rbol receptor. a */ void clear(); /**

@memo Nmero de elementos u @return El nmero de elementos del arbol receptor. u @doc La operacin se realiza en tiempo O(n). o @see contar */ int size() const; /** @memo Vaco @return Devuelve {\em true} si el nmero de elementos del arbol u receptor es cero, {\em false} en otro caso. @doc La operacin se realiza en tiempo O(1). o */ bool empty() const; /** @memo Igualdad @param v: ArbolGeneral con la que se desea comparar. @return Devuelve {\em true} si el arbol receptor tiene los mismos elementos y en el mismo orden. {\em false} en caso contrario. @doc La operacin se realiza en tiempo O(n). o @see soniguales */ bool operator==(const ArbolGeneral<Tbase>& v) const; /** @memo Distintos @param v: ArbolGeneral con la que se desea comparar. @return Devuelve {\em true} si el arbol receptor no tiene los mismos elementos y en el mismo orden. {\em false} en caso contrario. @doc La operacin se realiza en tiempo O(n). o */ bool operator!=(const ArbolGeneral<Tbase>& v) const; /** @memo Entrada @name operator>> @param in: stream de entrada @param v: rbol que leer a @return referencia al stream de entrada @doc Lee de {\em in} un rbol y lo almacena en {\em v}. El formato a aceptado para la lectura se puede consultar en la funcin o de salida. @see lee_arbol *//** */

template<class T> friend std::istream& operator>>(std::istream& in, ArbolGeneral<T>& v); /** @memo Salida @name operator<< @param out: stream de salida @param v: rbol que escribir a @return referencia al stream de salida @doc Escribe en la salida todos los nodos del arbol {\em v} siguiendo un recorrido en preorden. La forma de impresin de cada nodo o es: \begin{itemize} \item Si el nodo es {\em nodo_nulo}, imprime el carcter x a \item Si el nodo no es {\em nodo_nulo}, imprime el carcter n a seguido de un espacio, al que sigue la impresin de la etiqueta. o \end{itemize} @see escribe_arbol *//** */ template<class T> friend std::ostream& operator<< (std::ostream& out, const ArbolGeneral<T>& v); /*@}*/ }; #endif

Prctica a realizar a
En esta prctica se propone la implementacin de la clase arbolgeneral y su aplicacin en la implementacin a o o o de las siguientes funciones: Implementar los recorridos preorden, inorden, postorden y por niveles y calcular la altura del rbol a Construir una funcin para determinar un rbol general a partir de sus 3 recorridos. Tenga en cuenta o a que puede existir claves repetidas. Construir una funcin para reejar un rbol general, entendiendo por reejado de un rbol general o a a aquel que se obtiene con la misma raiz y permutando de orden todos sus hijos, haciendo lo mismo de forma recursiva en todos los niveles. Como implementacin para subir nota (o para compensar que no se haga alguna o algunas de las funciones o anteriores) se propone: Construir una clase iteradora preorden. Entre los mtodos de esta clase deben aparecer el operador e ++ y operador . Construir una clase iteradora reverse preorden. Entre los mtodos de esta clase deben aparecer el e operador ++ y operador .

10

Normas generales para la elaboracin y entrega de la Prctica o a

3.

Documentacin y entrega o

La documentacin a entregar en la prctica es la siguiente: o a 1. Documentacin. Todo lo necesario para explicar exhaustivamente la clase arbolgeneral que se haga o por lo que debern detallarse los procesos de abstraccin, representacin e implementacin realizados a o o o para su construccin. o 2. Cdigo. Listado de los cheros fuente (.cpp y .h) de los programas y el chero Makele. o Una vez hecho lo anterior: 1. Se enviarn los cdigos (as como cualquier otro material que se considere relevante) a travs del acceso a o e identicado de moodle, empaquetando todo en un chero tar comprimido (con el gzip) con nombre practica.tgz o en un chero zip con nombre practica.zip.

Debern observarse tambin las siguientes normas generales: a e 1. Las funciones que se usen debern estar correctamente documentadas1 . a 2. La elaboracin de la prctica es individual. Su valor es de 1 punto y su entrega es voluntaria. o a 3. La fecha l mite de entrega es el: Viernes, 27 de Enero de 2012 a las 23.55h. No se admitir ninguna a prctica entregada fuera del plazo establecido. a

1 Se

sugiere utilizar la herramienta doxygen para ello.

11

Potrebbero piacerti anche