cuentaprof.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Escribir una function CUENTA_PROF (n: nodo; m: integer;
  A: arbol): integer; que dado un nodo n en un \'arbol A
  cuenta el n\'umero de nodos del sub\'arbol de A cuya
  raiz es n y que est\'an a profundidad m o menor (con
  respecto a n). [Tomado en el Examen Final del 11 de
  julio de 2002] keywords: arbol

FIN DE DESCRIPCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: cuentaprof.pas 2002/07/12 20:30 mstorti Exp mstorti$ }
program cuentaprof_p;
uses u_arborip;
type
  arbol = arborip;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CUENTA_PROF (n: nodo;m: integer;a: arbol): integer;
var
  c : nodo;
  s : integer;
begin
  { El nodo no existe o la profundidad es negativa }
  if (n = lambda) or (m < 0) then
    s := 0
  else begin
    { El nro de nodos es igual a 1 mas el nro de nodos de }
    { los hijos con una profundidad tope menor en uno     }
    s := 1;
    c := a.HIJO_MAS_IZQ (n);
    while (c <> lambda) do begin
      s := s + CUENTA_PROF (c,m-1,a);
      c := a.HERMANO_DER (c);
    end;
   end;
   CUENTA_PROF := s;
end; { CUENTA_PROF }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CUENTA_HIJOS (n: nodo; a: arbol): integer;
var
   c : nodo;
begin
   c := a.HIJO_MAS_IZQ (n);
   cuenta_hijos := 0;
   while (c <> lambda) do begin
      cuenta_hijos := cuenta_hijos + 1;
      c := a.hermano_der(c);
   end; {while}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CUENTA_HERM (n: nodo; a: arbol): integer;
begin
   CUENTA_HERM := CUENTA_HIJOS (a.PADRE (n), a);
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ Genera un arbol aleatorio con nn nodos }
procedure RANDOM_ARB (a :arbol;  nn :integer );
var
  j, m, k, v: integer ;
  max_herm  : integer;
  n, q	    : nodo;
begin
  a.ANULA (a.RAIZ);
  m := 100;
  max_herm := 4;
  n := a.AGREGA_HIJO_MAS_IZQ (random (m), lambda);
  for j := 1 to nn do begin
    for k :=1 to 20 do begin
      if    (random (2) = 0)
        and (a.HIJO_MAS_IZQ (n) <> lambda) then
        n := a.HIJO_MAS_IZQ (n)
      else begin
        q := a.HERMANO_DER (n);
        if (q =lambda)  then q := a.PADRE (n);
        if (q <>lambda) then n := q;
      end; {if}
    end; {k}
    if   (random (3) = 0)
      or (a.PADRE (n) = lambda)
      or (CUENTA_HERM (n,a) >= max_herm) then begin
      while (CUENTA_HIJOS (n,a) >= max_herm) do begin
        n := a.HIJO_MAS_IZQ (n);
      end ; {while}
      v := random (m);
      a.AGREGA_HIJO_MAS_IZQ (v,n); end {then}
    else begin
      v := random (m);
      a.AGREGA_HERM_DER (v,n);
    end; {if}
  end; {j}
end; { RANDOM_ARB }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  a                 : arbol;
  n                 : nodo;
  prof, cant, cantt : integer;
begin
  a.INICIALIZA;
  { Crea un arbol aleatorio con 10 nodos }
  RANDOM_ARB (a,10);
  a.IMPRIME_ARB ('arbol: ');
  n := a.RAIZ;
  cant := 0;
  prof := 0 ;
 {Va calculando la cantidad de nodos hasta profundidad prof}
 {con prof variable. Cuando da lo mismo en prof y prof+1 }
 {es que se acabaron los nodos. }
  while true do begin
    cantt := CUENTA_PROF (n, prof, a);
    if (cantt = cant) then break;
    cant := cantt;
    writeln (cantt,' nodos hasta el nivel ', prof);
    prof := prof + 1;
  end; {while}
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.