ADDA Segundo Parcial 2012 2013 Ejercicio4
description
Transcript of 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 )
ADDA Convocatoria 2º Parcial Curso 2012/13
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; } }