Ejercicio 1) a) b)

Anuncio
Ejercicio 1)
a)
TYPE
ArbGen
= POINTER TO ArbNodo;
ArbNodo = RECORD
data : T;
hermano : ArbGen;
hijo
: ArbGen;
END;
b)
PROCEDURE ArbolHoja(elem :
VAR arbol: ArbGen;
BEGIN
NEW (arbol);
arbol^.data :=
arbol^.hermano
arbol^.hijo :=
RETURN arbol;
END ArbolHoja;
T) : ArbGen;
elem;
:= NIL;
NIL;
PROCEDURE EsArbolHoja(a : ArbGen) : Boolean;
BEGIN
RETURN (a^.hijo = NIL);
END EsArbolHoja;
(* Proc. auxiliar que realiza la búsqueda de un nodo del árbol. *)
(* Retorna el nodo v si pertence a a, o NIL en cualquier otro caso *)
PROCEDURE Buscar(a: ArbGen; v : T):ArbGen;
VAR aux: ArbGen;
BEGIN
IF (a = NIL) THEN
RETURN NIL;
ELSIF (a^.data = v) THEN
RETURN a;
ELSE
aux := Buscar(a^.hijo,v);
IF (aux = NIL) THEN
aux := Buscar(a^.hermano,v);
END;
RETURN aux;
END;
END Buscar;
PROCEDURE Pertenece(a : ArbGen; elem : T) : Boolean;
BEGIN
RETURN (Buscar(a,elem)<> NIL)
END Pertenece;
PROCEDURE Borrar(a : ArbGen; elem : T) : ArbGen;
BEGIN
IF (a^.data = elem) THEN
RETURN a;
ELSE RETURN Borrar_aux(a,elem);
END;
END Borrar;
PROCEDURE Borraraux(a : ArbGen; elem : T) : ArbGen;
VAR aux: ArbGen;
BEGIN
IF (a^.data = elem) THEN
IF EsArbolHoja(a) THEN
aux := a^.hermano;
DISPOSE(a);
RETURN aux;
END;
ELSE IF (NOT EsArbolHoja(a)) THEN
a^.hijo := Borraraux(a^.hijo,elem);
END;
IF (a^.hermano <> NIL) THEN
a^.hermano := Borraraux(a^.hermano,elem);
END;
END;
RETURN a;
END Borraraux;
PROCEDURE Insertar(a : ArbGen; v, w : T) : ArbGen;
VAR aux,nuevo: ArbGen;
BEGIN
IF (NOT Pertenece(a, v)) THEN
aux := Buscar(a, w);
IF (aux <> NIL) THEN
nuevo :=ArbolHoja(v);
IF (aux^.hijo = NIL) THEN
aux^.hijo := nuevo;
ELSE
aux := aux^.hijo;
WHILE (aux^.hermano <> NIL) DO
aux := aux^.hermano;
END;
aux^.hermano := nuevo;
END;
END;
END;
RETURN a;
END Insertar;
Ejercicio 2)
a)
(* TAD Arbol Binario de Naturales *)
PROCEDURE NullTree() : ABN;
(* Devuelve el árbol vacio *)
PROCEDURE ConsTree(raiz : CARDINAL; hder , hizq : ABN) : ABN;
(* Crea un árbol no vacío a partir de un natural y otros dos árboles
*)
PROCEDURE IsEmptyTree(a : ABN) : Boolean;
(* Determina si un árbol dado es o no vacío *)
PROCEDURE RootTree(a : ABN) : CARDINAL;
(* Devuelve el valor en la raíz de un árbol no vacío *)
PROCEDURE RightTree(a : ABN) : ABN;
(* Devuelve el subárbol derecho de un árbol no vacío *)
PROCEDURE LeftTree(a : ABN) : ABN;
(* Devuelve el subárbol derecho de un árbol no vacío *)
b) Es necesario utilizar un TAD Cola de ABN y el TAD Stack de Cardinal
(* TAD Cola de ABN *)
PROCEDURE NullQ() : QueueABN;
(* Crea la cola de ABN Vacia *)
PROCEDURE Enqueue(a : ABN; q : QueueABN) : QueueABN;
(* Inserta el elemento a al final de la cola q *)
PROCEDURE EmptyQ(q : QueueABN) : Boolean;
(* Retorna true sii la cola q es vaica *)
PROCEDURE Front(q : QueueABN) : ABN;
(* Retorna el primer elemento de la cola q, si q es no vacío. *)
PROCEDURE Dequeue(q : QueueABN) : QueueABN;
(* Retorna la cola resultado de borrar el primer elemento, si q es no
vacío. *)
(* TAD Stack de Cardinal *)
PROCEDURE NullS() : StackCard;
(* Crea el stack de CARDINAL Vacio *)
PROCEDURE Push(a : CARDINAL; s : StackCard) : StackCard;
(* Agrega el elemento en el tope del stack y retorna el stack
resultado *)
PROCEDURE EmptyS(s : StackCard) : Boolean;
(* Retorna true sii el stack es vacio *)
PROCEDURE Top(s : StackCard) : CARDINAL;
(* Retorna el primer elemento del stack s, si s es no vacío *)
PROCEDURE Pop(s : StackCard) : StackCard;
(* Saca del stack s el primer elemento, si s es no vacío *)
PROCEDURE Listar(a : ABN);
VAR
q : QueueABN;
s : StackCard;
a : ABN;
BEGIN
q:= CrearQueue();
s := CrearStack();
q := Enqueue(a, q);
WHILE (NOT EmptyQ(q)) DO
a := Front(q);
IF NOT IsEmptyTree(a) THEN
s := Push(Root(a),s);
q := Enqueue(RightTree(a), q);
q := Enqueue(LeftTree(a), q);
END;
q := Dequeue(q);
END;
WHILE (NOT EmptyS(s)) DO
WriteCard(Top(s),6);
s := Pop(s);
END;
END Listar;
Descargar