ADDA Segundo Parcial 2012 2013 Ejercicio4

3
ADDA Convocatoria 2º Parcial Curso 2012/13 Ejercicio 4: Árboles Un árbol de directorio es una forma de mostrar todos los directorios de una unidad de almacenamiento (como un disco duro por ejemplo) en forma de estructura de árbol. El siguiente árbol de directorios contiene nodos de tipo Tree<Directory>. El tipo Directory contiene varios atributos, entre ellos: Size: Tamaño en Kbytes del directorio. Name: Nombre del directorio. Type: Indica si el nodo es de tipo “Fichero” o “Carpeta”. Las hojas pueden ser de tipo Fichero o Carpeta. Solo los nodos de tipo “Fichero” ocupan espacio, el tamaño o Size de un nodo tipo “Carpeta” es 0 por defecto. Extension: Formato del directorio si es de tipo “Fichero”. Las “Carpetas” no tienen extensión, este campo es vacío para las carpetas. Se pide: 1. Realizar el método: Public Tree<Directory> updateSizeDirectories(Tree<Directory> dir): que actualice lo que ocupan cada uno de los directorios (atributo Size) tras haber realizado cambios. Para la realización del método considere alguno de los esquemas de recorrido en profundidad que se han visto en clase. Tenga en cuenta que para calcular el tamaño de un nodo primero tiene que calcular el tamaño de sus nodos hijos. Por ejemplo, para el árbol de directorios de la figura A, el resultado sería el árbol de directorios de la figura B. NOTAS: El árbol de directorio de entrada no se puede modificar. Tiempo estimado: 35 min. Puntuación: 20 % A ) B )

description

ADDA

Transcript of ADDA Segundo Parcial 2012 2013 Ejercicio4

Page 1: ADDA Segundo Parcial 2012 2013 Ejercicio4

ADDA Convocatoria 2º Parcial Curso 2012/13

Ejercicio 4: Árboles

Un árbol de directorio es una forma de mostrar todos los directorios de una unidad de

almacenamiento (como un disco duro por ejemplo) en forma de estructura de árbol.

El siguiente árbol de directorios contiene nodos de tipo Tree<Directory>. El tipo

Directory contiene varios atributos, entre ellos:

• Size: Tamaño en Kbytes del directorio.

• Name: Nombre del directorio.

• Type: Indica si el nodo es de tipo “Fichero” o “Carpeta”. Las hojas pueden ser de

tipo Fichero o Carpeta. Solo los nodos de tipo “Fichero” ocupan espacio, el tamaño

o Size de un nodo tipo “Carpeta” es 0 por defecto.

• Extension: Formato del directorio si es de tipo “Fichero”. Las “Carpetas” no tienen

extensión, este campo es vacío para las carpetas.

Se pide:

1. Realizar el método: Public Tree<Directory> updateSizeDirectories(Tree<Directory> dir):

que actualice lo que ocupan cada uno de los directorios (atributo Size) tras haber

realizado cambios. Para la realización del método considere alguno de los esquemas

de recorrido en profundidad que se han visto en clase. Tenga en cuenta que para

calcular el tamaño de un nodo primero tiene que calcular el tamaño de sus nodos

hijos. Por ejemplo, para el árbol de directorios de la figura A, el resultado sería el

árbol de directorios de la figura B.

NOTAS: • El árbol de directorio de entrada no se puede modificar.

Tiempo estimado: 35 min. Puntuación: 20 %

A ) B )

Page 2: ADDA Segundo Parcial 2012 2013 Ejercicio4

ADDA Convocatoria 2º Parcial Curso 2012/13

Page 3: ADDA Segundo Parcial 2012 2013 Ejercicio4

ADDA Convocatoria 2º Parcial Curso 2012/13 public Tree<Directory> updateSizeDirectories(Tree<Directory> dir){

//crear arbol resultado 0.5 punto Tree<Directory> res = new Tree<Directory>();

0,5 punto filtro del árbol nulo y no vacío

if (dir != null && !dir.isEmpty()){

//Definición del caso base, 2 puntos if (dir.isLeaf()){

res = new Tree<Directory>(dir.getLabel());

//Definición del caso recursivo, 2 puntos }else {

//variable acumuladora 1 punto Integer totalSize = 0; res = new Tree<Directory>(dir.getLabel()); for (int i = 0; i < dir.getNumChildren(); i++){

//Bucle for + llamada recursiva -> 1 punto Tree<Directory> arb =

updateSizeDirectories(dir.getElement(i));

res.add(arb); //insertar hijos 1 punto

//actualizar variable acumuladora 1 punto totalSize = totalSize + arb.getLabel().getSize(); }

//actualizar el tamaño del nodo 1 res.getLabel().setSize(totalSize); } } return res; } }