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;