PRÁCTICA 5. Estructura de datos Árbol binario
#Problema 1. Implementación dinámica de un árbol de cadenas.
UNIT ARBOL;
INTERFACE
TYPE
Persona = String;
TArbol = ^Nodo;
Nodo = Record
info: Persona;
izq, der: TArbol;
end;
{ Crea un arbol vacio }
PROCEDURE CrearArbol (var A: TArbol);
{ Genera un arbol a partir de dos subarboles y un elemento }
FUNCTION ConstArbol (subi,subd: TArbol; e: Persona): TArbol;
{ Devuelve cierto si el arbol esta vacio }
FUNCTION ArbolVacio (A: TArbol): Boolean;
{ Devuelve el subarbol izquierdo }
FUNCTION SubIzq (A: TArbol): TArbol;
{ Devuelve el subarbol derecho }
FUNCTION SubDer (A: TArbol): TArbol;
{ Devuelve el dato raiz del arbol }
FUNCTION DatoRaiz (A: TArbol): Persona;
{ Busca el subarbol de A cuya raiz contiene la persona }
PROCEDURE BuscaNodo (A: TArbol; e:Persona; Res: TArbol);
IMPLEMENTATION
PROCEDURE CrearArbol (var A: TArbol);
begin
A := NIL;
end;
FUNCTION ConstArbol (subi,subd: TArbol; e: Persona): TArbol;
var
A: TArbol;
begin
new(A);
A^.izq := subi;
A^.der := subd;
A^.info := e;
ConstArbol := A;
end;
FUNCTION ArbolVacio (A: TArbol): Boolean;
begin
ArbolVacio := A=NIL;
end;
FUNCTION SubIzq (A: TArbol): TArbol;
begin
SubIzq := A^.Izq;
end;
FUNCTION SubDer (A: TArbol): TArbol;
begin
SubDer := A^.der;
end;
FUNCTION DatoRaiz (A: TArbol):Persona;
begin
DatoRaiz := A^.info;
end;
PROCEDURE BuscaNodo (A: TArbol; e: Persona; Res: TArbol);
VAR
Aux : TArbol;
Encontrado : Boolean;
BEGIN
IF NOT Encontrado THEN BEGIN
IF (NOT ArbolVacio(A)) THEN BEGIN
IF DatoRaiz(A) = e THEN BEGIN
Res := A;
Encontrado := True
END;
BuscaNodo(SubIzq(A),e,Res);
BuscaNodo(SubDer(A),e,Res)
END
END
END;
END.
PROGRAM Prueba;
USES
Arbol;
VAR
Nom, Pad, Mad: Persona;
A: TArbol;
BEGIN
CrearArbol(A);
REPEAT
Write('Introduce el nombre del hijo ('' para fin): '); Readln(Nom);
IF Pad <> '' THEN BEGIN
Write('Introduce el nombre del padre : '); Readln(Pad);
CrearArbol(APad);
Write('Introduce el nombre de la madre : '); Readln(Mad);
A := ConstArbol(Pad, Mad, Nom);
UNIT ARBOL;
INTERFACE
TYPE
persona = string;
TIPOARBOL = ^NODO;
NODO = record
info: INTEGER;
izq, der: TIPOARBOL;
end;
{ Crea un arbol vacio }
PROCEDURE CrearArbol (var A: TIPOARBOL);
{ Genera un arbol a partir de dos subarboles y un elemento }
FUNCTION ConstArbol (subi,subd: TIPOARBOL; e: INTEGER): TIPOARBOL;
{ Devuelve cierto si el arbol esta vacio }
FUNCTION ArbolVacio (A: TIPOARBOL): BOOLEAN;
{ Devuelve el subarbol izquierdo }
FUNCTION SubIzq (A: TIPOARBOL): TIPOARBOL;
{ Devuelve el subarbol derecho }
FUNCTION SubDer (A: TIPOARBOL): TIPOARBOL;
{ Devuelve el dato raiz del arbol }
FUNCTION DatoRaiz (A: TIPOARBOL): INTEGER;
{ Busca el subarbol de A cuya raiz contiene la persona }
FUNCTION BuscaNodo (A: TIPOARBOL; e:INTEGER): TIPOARBOL;
IMPLEMENTATION
PROCEDURE CrearArbol (var A: TIPOARBOL);
begin
A := NIL;
end;
FUNCTION ConstArbol (subi,subd: TIPOARBOL; e: INTEGER): TIPOARBOL;
var
A: TIPOARBOL;
begin
new(A);
A^.izq := subi;
A^.der := subd;
A^.info := e;
ConstArbol := A;
end;
FUNCTION ArbolVacio (A: TIPOARBOL): BOOLEAN;
begin
ArbolVacio := A=NIL;
end;
FUNCTION SubIzq (A: TIPOARBOL): TIPOARBOL;
begin
SubIzq := A^.Izq;
end;
FUNCTION SubDer (A: TIPOARBOL): TIPOARBOL;
begin
SubDer := A^.der;
end;
FUNCTION DatoRaiz (A: TIPOARBOL):INTEGER;
begin
DatoRaiz := A^.info;
end;
END.