13.07.2015 Views

3. Tanto el subárbol derecho como el izquierdo son ... - QueGrande

3. Tanto el subárbol derecho como el izquierdo son ... - QueGrande

3. Tanto el subárbol derecho como el izquierdo son ... - QueGrande

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ASIGNATURATITULACIÓNAPELLIDOSESTRUCTURA DE DATOS Y DE LA INFORMACIÓNEJERCICIO 1 (3 PUNTOS)GRUPOCURSOCONVOCATORIANOMBRE2003 / 2004EXTRAORDINARIA-SEPTIEMBRECALIFICACIÓNDado <strong>el</strong> tipo abstracto de datos (TAD) tArbolBin que sirve para representarárboles binarios con nodos coloreados (rojo o negro), d<strong>el</strong> que sólo se conoce laparte de la interfaz siguiente:TypetValor = …;tColor = (rojo,negro);tInfo = recordinfo: tValor;color: tColor;end;tArbolBin = …function EsArbolVacio(a: tArbolBin): boolean;function Color (a: tArbolBin): tColor;function RamaIzqda (a: tArbolBin): tArbolBin;function RamaDcha (a: tArbolBin): tArbolBin;(Las funciones Color, RamaIzqda y RamaDcha tienen <strong>como</strong>precondición que <strong>el</strong> árbol no sea vacio)EJERCICIO 2 (3 PUNTOS)A) Sea <strong>el</strong> árbol binario AVL de la figura siguiente:45Se pide:Realizar las operaciones que se15 60detallan a continuación, dibujar <strong>el</strong>estado d<strong>el</strong> árbol después de cada5565 operación indicando <strong>el</strong> Factor deEquilibrio (FE) de cada nodo,reflejar las reestructuraciones que10 2035 50sean necesarias (dibujando los3040estados intermedios) e indicar <strong>el</strong>tipo de rotación aplicado cuandoproceda.● Inserción d<strong>el</strong> <strong>el</strong>emento 28● Sobre <strong>el</strong> resultado de la inserción anterior, <strong>el</strong>iminar <strong>el</strong> <strong>el</strong>emento 655 25B) Dada la estructura de la figura siguiente:1015 2530 32 2726Se pide:●Marcar con una cruz quétipo(s) de árbol representa,justificando la respuesta:A) Definir una operación que cuente <strong>el</strong> número de nodos rojos de un árbolbinario.numNodosRojos(tArbolBin) integerB) Un árbol rojo-negro cumple las siguientes propiedades:1. Todos los nodos hoja tienen color negro2. El número de nodos rojos d<strong>el</strong> subárbol <strong>izquierdo</strong> y d<strong>el</strong> subárbol<strong>derecho</strong> difiere <strong>como</strong> mucho en 1.<strong>3.</strong> <strong>Tanto</strong> <strong>el</strong> subárbol <strong>derecho</strong> <strong>como</strong> <strong>el</strong> <strong>izquierdo</strong> <strong>son</strong> árboles rojonegro(NOTA: El árbol vacío es rojo-negro)Construir una operación que decida si un árbol es rojo-negro.EsArbolRojoNegro (tArbolBin) boolean40MontículoMinÁrbolbinario debúsquedaÁrbolllenoÁrbolAVLSi NoJustificación


EJERCICIO 3(4 PUNTOS)Una tabla de símbolos es una estructura que almacena convenientementepares de la forma (nombre, lista de valores), donde cada nombre tiene asociadoun conjunto de valores enteros posibles. La tabla se encuentra ordenada pornombres, y <strong>el</strong> número máximo de nombres y valores posibles no es conocido apriori.Esta estructura se implementa mediante una multilista que mantieneordenadamente los nombres en una lista y, además, hace uso d<strong>el</strong> TADLista paraguardar, para cada nombre, las lista de valores asociados.Se pide:A) Realizar en lenguaje Pascal la definición de tipos d<strong>el</strong> TADLista (quemantiene una lista de valores) y <strong>el</strong> TADTabladeSimbolos (que secorresponde con la estructura completa de nombres y valores).Deberá justificarse la <strong>el</strong>ección de la implementación de ambas(estática o dinámica).B) Suponiendo implementadas las funciones siguientes para <strong>el</strong>TADLista,ListaVacia (Lista) → Lista{Objetivo: Crear una lista vacíaSalida: Una lista vacía}EsListaVacía (Lista) → Boolean{Objetivo: Determinar si una lista está vacíaEntrada: ListaSalida: true si la lista está vacía, false en caso contrario.PreCond: La Lista debe estar inicializada}Insertar (Lista, valor) → Lista{Objetivo: Añadir a la lista un valor (se permiten repetidos)Entrada: Lista y ValorSalida: Lista con un nuevo valorPreCond: La lista debe estar inicializada, y se supone memoria suficiente}Realizar la implementación de las operaciones definidas acontinuación para <strong>el</strong> TADTabladeSimbolos, usando la definición detipos especificada en <strong>el</strong> apartado A). Tabla es de tipo tTabla; nombrees de tipo tNombre, valor es de tipo tValor, y tLista es la lista devalores.TablaVacia (Tabla) → Tabla{Objetivo: Crear una Tabla vacíaSalida: Una Tabla vacía}EsTablaVacia (Tabla) → Boolean{Objetivo: Determinar si una Tabla está vacíaEntrada: TablaSalida: true si la tabla está vacía, false en caso contrario.PreCond: La tabla debe estar inicializada }Existe (Tabla, nombre) → boolean{Objetivo: Indica si <strong>el</strong> nombre está en en la tablaEntrada: Tabla de nombres y valores, Nombre a buscarSalida: true si <strong>el</strong> nombre está en <strong>el</strong> Tabla, false en caso contrarioPreCond: La tabla debe estar inicializada }Valores (Tabla, nombre) → Lista{Objetivo: Devu<strong>el</strong>ve la lista de valores asociados al nombreEntrada: Tabla de nombres y valores, y nombre a encontrarSalida: Lista de valores asociadosPreCond: La tabla debe estar inicializada, y <strong>el</strong> nombre debe existir en la tabla }InsertarEnTabla (Tabla, nombre, valor) → Tabla{Objetivo: Añadir a la tabla un par <strong>el</strong>emento-valorEntrada: Tabla, Nombre y ValorSalida: Tabla con un nuevo valor para <strong>el</strong> nombre si éste ya existía,o un nuevo par nombre-valor si <strong>el</strong> nombre no pertenecía a la tablaPreCond: La tabla debe estar inicializada, y se supone memoria suficiente}BorrarEnTabla (Tabla, nombre) → Tabla{Objetivo: Elimina <strong>el</strong> nombre de la tabla y la lista de valores asociadosEntrada: Tabla, Nombre a buscarSalida: La tabla sin <strong>el</strong> nombrePreCond: El nombre debe pertenecer a la tabla }BorrarLista (Lista) → Lista{Objetivo: Elimina todos los <strong>el</strong>ementos de la listaEntrada: Lista a <strong>el</strong>iminarSalida: Lista vaciaPreCond: La lista debe estar inicializada}


SOLUCIONESEliminar 654545-2EJERCICIO 11560-2115550A) 1’5 puntos5 3055-15 300 50 60 0function numNodosRojos (a: tArbolBin): integer;beginif EsArbolVacio(a)then numNodosRojos:= 0<strong>el</strong>se if Color(a)=rojothen numNodosRojos:= 1 + numNodosRojos (RamaIzqda(a))+ numNodosRojos(RamaDcha(a))<strong>el</strong>se numNodosRojos:= numNodosRojos (RamaIzqda(a))+ numNodosRojos (RamaDcha(a));end;10 25200 152835405030 045II:60-55010 2520283540ID 45-15-30B) 1,5 puntos51 25 0 35 155 0function EsArbolRojoNegro (a: tArbolBin): boolean;beginif EsArbolVacio (a)then EsArbolRojoNegro:= true (* Arbol vacio *)<strong>el</strong>se if EsArbolVacio (RamaIzqda(a)) andEsArbolVacio (RamaDrcha(a)) (* Hoja *)then EsArbolRojoNegro:= Color(a)= negro (* Es negro *)<strong>el</strong>se EsArbolRojoNegro:= (abs(numNodosRojos(RamaIzqda(a))- numNodosRojos(RamaDcha(a)))


EJERCICIO 2A)La implementación más adecuada, tanto para la lista que mantiene los nombres <strong>como</strong> para laque mantiene los valores, es la dinámica ya que, en ningún caso <strong>el</strong> número máximo de valoreso nombre es conocido ni estable. La definición de tipos sería la siguiente:UNIT TADLista;INTERFACEtypetvalor = integer;tPosLista = ^tNodoLista;tNodoLista = recordvalor: tvalor;sig: tPosLista;end;tLista = tPosLista;yUNIT TADTabladeSimbolos;INTERFACEUSES TADLista;constnulo=nil;typetNombre = string;tPosTabla = ^tNodoTabla;tNodoTabla = recordnombre: tNombre;valores: tLista;sig: tPosTabla;end;tTabla = tPosTabla;B) Definición + TablaVacia + EsTablaVacia = 0.75Insertar = 1Borrar = 1Existe = 0.625Valores = 0.625Procedure TablaVacia (var Tabla: tTabla);{Objetivo: Crear una Tabla vacíaSalida: Una Tabla vacía}beginTabla:=nulo;end;Function Existe (Tabla: tTabla; nombre: tNombre): boolean;{Objetivo: Indica si <strong>el</strong> nombre está en en la tablaEntrada: Tabla, Nombre a buscarSalida: true si <strong>el</strong> nombre está en <strong>el</strong> Tabla, false en caso contrarioPreCond: La tabla debe estar inicializada }beginif EsTablaVacia (Tabla)then Existe:=false<strong>el</strong>se beginwhile (Tabla ^. nombre < nombre) and (Tabla ^.sig nulo) doTabla:= Tabla ^.sig;Existe:= (Tabla ^. nombre = nombre);endend;function Valores (Tabla: tTabla; nombre: tNombre): tLista;{Objetivo: Devu<strong>el</strong>ve la lista de valores asociados al nombreEntrada: Tabla y nombre a encontrarSalida: Lista de valores asociadosPreCond: La tabla debe estar inicializada, y <strong>el</strong> nombre debe existir en la tabla }beginwhile (Tabla ^. nombre nombre) doTabla:= Tabla ^.sig;Valores:= Tabla^.valores;end;Para implementar la operación de Inserción desarrollamos las dos operacionesauxiliares siguientes:Procedure Crear_nodo (var nuevo: tPosTabla; nombre: tNombre; valor: tValor);{Objetivo: crea la variable dinámica asociada a un punteroEntrada: n: nombre a almacenar en la variable dinámicanuevo: puntero a la nueva variable creadaSalida: nuevo apuntará a la nueva variable creadaPosCond: la variable tiene todos sus campos inicializados}beginnew(nuevo);nuevo ^.nombre:=nombre;nuevo ^.sig:=nulo;Insertar (nuevo^.valores, valor);end;function EsTablaVacia (Tabla: tTabla): Boolean;{Objetivo: Determinar si una Tabla está vacíaEntrada: TablaSalida: true si la tabla está vacía, false en caso contrario.PreCond: La tabla debe estar inicializada }BeginEsTablaVacia:=(Tabla=nulo);End;


function Pos_inser (n: tnombre; Tabla: tTabla ): tPosTabla ;{Objetivo: buscar la posición de un <strong>el</strong>emento (si existe) en una tabla ordenada por <strong>el</strong> campo n,o la posición donde deberá insertarse si no existe.Entradas: n, campo de ordenaciónTabla, acceso a la listaSalidas: la posición d<strong>el</strong> <strong>el</strong>emento buscado o d<strong>el</strong> nodo anterior a donde se deberá insertar si noexiste, o nulo si se ha de insertar en primer lugarPrecond: Tabla no vacía}var anterior: tPosTabla; {posición d<strong>el</strong> nodo después d<strong>el</strong> que habrá que insertar}beginanterior:= nulo;while (n > Tabla^.nombre) and (Tabla ^.sig nulo) dobeginanterior:= Tabla;Tabla:= Tabla ^.sig;end;if n >= Tabla ^. nombre {Hay que insertar al final o <strong>el</strong> <strong>el</strong>emento ya existe}then anterior:= Tabla;Pos_inser:=anterior;end;procedure InsertarEnTabla (var Tabla: tTabla; nombre: tNombre; valor: tValor);{Objetivo: Añadir a la tabla un par <strong>el</strong>emento-valorEntrada: Tabla, Nombre y ValorSalida: Tabla con un nuevo valor para <strong>el</strong> nombre si éste ya existía,o un nuevo par si <strong>el</strong> nombre no pertenecía a la tablaPreCond: La tabla debe estar inicializada, y se supone memoria suficiente}var pos, nuevo: tPosTabla;beginCrear_nodo (nuevo,nombre,valor);if EsTablaVacia(Tabla) then Tabla:=nuevo<strong>el</strong>se beginpos:= Pos_inser (nombre, Tabla);if pos =nulo then {se añade <strong>como</strong> primer nodo}beginnuevo^.sig:= Tabla;Tabla:=nuevo;end;endend<strong>el</strong>seif pos ^.nombre nombrethen begin {no existe ese nombre y se añade en <strong>el</strong> medio o al final}nuevo^.sig:= pos ^.sig;pos ^.sig:=nuevo;end<strong>el</strong>se {<strong>el</strong> nombre ya existe en la lista, solo hay que insertar <strong>el</strong> valor}Insertar (pos^.valores, valor);procedure BorrarEnTabla (var Tabla: tTabla; nombre: tNombre);{Objetivo: Elimina <strong>el</strong> nombre de la tabla y la lista de valores asociadosEntrada: Tabla, Nombre a buscarSalida: La tabla sin <strong>el</strong> nombrePreCond: El nombre debe pertenecer a la tabla }Var pos: tPosTabla;beginend;if nombre=Tabla^.nombre {si hay que <strong>el</strong>iminar <strong>el</strong> primero}then beginborrar:= Tabla;Tabla:= Tabla^.sigend<strong>el</strong>se begin {si hay que <strong>el</strong>iminar al medio o al final}pos:=Tabla;while (pos^.sig^. nombre nombre) dopos:= pos^.sig;{al salir d<strong>el</strong> bucle pos^.sig es <strong>el</strong> nodo a <strong>el</strong>iminar}borrar:= pos^.sig;pos^.sig:= pos^.sig^.sig;end; {<strong>el</strong>se}BorrarLista(borrar^.valores);dispose(borrar)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!