-- AUTOR: Elvira Mayordomo Cámara
-- PROYECTO: módulo de implementación del
-- TAD arboles binarios de búsqueda
-- FICHERO: abb.adb
-- FECHA: 14-11-03

with unchecked_deallocation;
with text_io;
use text_io;

package body abb is

procedure disponer is new unchecked_deallocation(nodo,arbin);

procedure creaVacio(a:out arbin) is
-- Post: a=aVacío
-- coste en tiempo O(1)
begin
a:=null;
end creaVacio;

procedure insertar(a:in out arbin; e:in
elemento) is
-- Pre: a=a0; padre es el padre de a
-- Post: a=insertar(a0,e)
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin
	if a=null then 
		a:=new nodo'(e,null,null);
	elsif (e<=a.dato) then
		insertar(a.izq,e);
	else insertar(a.der,e);
	end if;
end insertar;

function esta(a:arbin; e:elemento) return
boolean is
-- Post: esta(a,e)= está?(a,e)
-- coste en tiempo: para un árbol de n nodos tarda O(n)
resultado: boolean;
begin
	resultado:=false;
	if a/=null then 
		if (a.dato = e) then resultado:=true;
		elsif (e<=a.dato) then
		resultado:=esta(a.izq,e);
		else resultado:=esta(a.der,e);
		end if;
	end if;
	return resultado;	
end esta;

function min(a:arbin) return elemento is
-- Pre: not(esvacío(a))
-- Post: min(a)= min(a)
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin
	if a.izq=null then return a.dato;
	else return min(a.izq);
	end if;
end min;

function max(a:arbin) return elemento is
-- Pre: not(esvacío(a))
-- Post: max(a)= max(a)
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin
	if a.der=null then return a.dato;
	else return max(a.der);
	end if;
end max;

procedure borrar(a:in out arbin; e:in
elemento) is
-- Pre: a=a0
-- Post: a=borrar(a0,e)
-- coste en tiempo: para un árbol de n nodos tarda O(n)
aux:arbin; 
nuevaraiz:elemento;
begin
	if a/=null then 
		if (a.dato = e) then 
			if a.der=null and a.izq=null then
				aux:=a;
				a:=null;
				disponer(aux);
			elsif a.izq/=null then
				nuevaraiz:=max(a.izq);
				a.dato:=nuevaraiz;
				borrar(a.izq,nuevaraiz);
			else
				nuevaraiz:=min(a.der);
				a.dato:=nuevaraiz;
				borrar(a.der,nuevaraiz);	
			end if;
		elsif (e<=a.dato) then
			borrar(a.izq,e);
		else borrar(a.der,e);
		end if;
	end if;
end borrar;

procedure preOrden(a:in arbin) is
-- muestra por pantalla el preorden de a
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin 
	if a/=null then
		put(a.dato);
		preOrden(a.izq);
 		preOrden(a.der);
 	end if;
end preOrden;

procedure postOrden(a:in arbin) is
-- muestra por pantalla el preorden de a
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin 
	if a/=null then
		postOrden(a.izq);
 		postOrden(a.der);
		put(a.dato);
 	end if;
end postOrden;

procedure mostrar(a:in arbin) is
-- Muestra por pantalla preorden y postorden
-- coste en tiempo: para un árbol de n nodos tarda O(n)
begin
	put_line("El preorden es:");
	preOrden(a);
	put_line("");
	put_line("El postorden es:");
	postOrden(a);
	put_line("");
end mostrar;	

end abb; 


syntax highlighted by Code2HTML, v. 0.9.1