Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. UNIT uArbol;
  2.  
  3.  
  4. INTERFACE
  5. USES uElem;
  6.  
  7. TYPE
  8.     TArbol = ^TNodo;
  9.  
  10.     TNodo = RECORD
  11.         izq:TArbol;
  12.         rai:TElem;
  13.         der:TArbol;
  14.     END;
  15.  
  16.     PROCEDURE CrearArbolVacio(VAR arbol:TArbol);
  17.  
  18.     FUNCTION EsArbolVacio(arbol:TArbol):boolean;
  19.  
  20.     PROCEDURE ConstruirArbol (VAR arbol:TArbol; i:TArbol; r:TElem; d:TArbol);
  21.  
  22.     FUNCTION Altura(arbol:TArbol):integer;
  23.  
  24.     FUNCTION NumNodos(arbol:TArbol):integer;
  25.  
  26.     FUNCTION NumHojas(arbol:TArbol):integer;
  27.  
  28.     FUNCTION Equilibrado(arbol:TArbol):boolean;
  29.  
  30.     PROCEDURE HijoDer(arbol:TArbol; VAR d:TArbol);
  31.  
  32.     PROCEDURE HijoIzq(arbol:TArbol; VAR i:TArbol);
  33.  
  34.     PROCEDURE Raiz(arbol:TArbol; VAR r:TElem);
  35.  
  36.     PROCEDURE Inorden(arbol:TArbol);
  37.  
  38.     PROCEDURE Postorden(arbol:TArbol);
  39.  
  40.     PROCEDURE Preorden(arbol:TArbol);
  41.  
  42. {A partir de aquí, instrucciones de árbol binario de búsqueda}
  43.  
  44.     PROCEDURE InsertarOrdenado (VAR arbol:TArbol; elem:TElem);
  45.  
  46.     PROCEDURE Mayor (arbol:TArbol; VAR m:TElem);
  47.  
  48.     PROCEDURE Menor (arbol:TArbol; VAR men:TElem);
  49.  
  50.     FUNCTION Pertenece (arbol:TArbol; elem:TElem):boolean;
  51.  
  52.     PROCEDURE Eliminar (VAR arbol:TArbol; elem:TElem);
  53.  
  54. IMPLEMENTATION
  55.  
  56.     PROCEDURE CrearArbolVacio(VAR arbol:TArbol);
  57.         BEGIN
  58.             arbol := NIL;
  59.         END;{CrearArbolVacio}
  60.  
  61.     FUNCTION EsArbolVacio(arbol:TArbol):boolean;
  62.         BEGIN
  63.             EsArbolVacio := (arbol = NIL);
  64.         END;{EsArbolVacio}
  65.  
  66.     PROCEDURE ConstruirArbol (VAR arbol:TArbol; i:TArbol; r:TElem; d:TArbol);
  67.         BEGIN
  68.             new(arbol);
  69.             Asignar( arbol^.rai , r);
  70.             arbol^.izq := i;
  71.             arbol^.der := d;
  72.         END;{ConstruirArbol}
  73.  
  74.     FUNCTION Altura(arbol:TArbol):integer;
  75.         FUNCTION Maximo (a,b:integer):integer;
  76.             BEGIN
  77.                 IF a>b THEN
  78.                     Maximo := a
  79.                 ELSE
  80.                     Maximo := b;
  81.             END;{Maximo}
  82.  
  83.         BEGIN
  84.             IF EsArbolVacio(arbol) THEN
  85.                 Altura := 0
  86.             ELSE
  87.                 BEGIN
  88.                     Altura := 1 + Maximo( Altura(arbol^.izq) , Altura(arbol^.der) );
  89.                 END;{ELSE}
  90.  
  91.         END;{Altura}
  92.  
  93.     FUNCTION NumNodos(arbol:TArbol):integer;
  94.         BEGIN
  95.             IF EsArbolVacio(arbol) THEN
  96.                 NumNodos := 0
  97.             ELSE
  98.                 BEGIN
  99.                     NumNodos := 1 + NumNodos(arbol^.izq) + NumNodos(arbol^.der);
  100.                 END;{ELSE}
  101.         END;{NumNodos}
  102.  
  103.     FUNCTION NumHojas(arbol:TArbol):integer;
  104.         BEGIN
  105.             IF ( EsArbolVacio(arbol^.izq) ) AND ( EsArbolVacio(arbol^.der) ) THEN
  106.                 NumHojas := 1
  107.             ELSE
  108.                 NumHojas := NumHojas(arbol^.izq) + NumHojas(arbol^.der);
  109.         END;{NumHijos}
  110.  
  111.     FUNCTION Equilibrado(arbol:TArbol):boolean;
  112.         BEGIN
  113.             IF EsArbolVacio(arbol) THEN
  114.                 Equilibrado := TRUE
  115.             ELSE
  116.                 Equilibrado := ( NumNodos(arbol^.izq) = NumNodos(arbol^.der) );
  117.  
  118.         END;{Equilibrado}
  119.  
  120.     PROCEDURE HijoDer(arbol:TArbol; VAR d:TArbol);
  121.         BEGIN
  122.             IF NOT(EsArbolVacio(arbol)) THEN
  123.                 d := arbol^.der;
  124.         END;{HijoDer}
  125.  
  126.     PROCEDURE HijoIzq(arbol:TArbol; VAR i:TArbol);
  127.         BEGIN
  128.             IF NOT(EsArbolVacio(arbol)) THEN
  129.                 i := arbol^.izq;
  130.         END;{HijoIzq}
  131.  
  132.     PROCEDURE Raiz(arbol:TArbol; VAR r:TElem);
  133.         BEGIN
  134.             IF NOT(EsArbolVacio(arbol)) THEN
  135.                 Asignar(r , arbol^.rai);
  136.         END;{Raiz}
  137.  
  138.     PROCEDURE Inorden(arbol:TArbol);
  139.         BEGIN
  140.             IF NOT(EsArbolVacio(arbol)) THEN
  141.                 BEGIN
  142.                     Inorden(arbol^.izq);
  143.                     Mostrar(arbol^.rai);
  144.                     Inorden(arbol^.der);
  145.                 END;{IF}
  146.         END;{Inorden}
  147.  
  148.     PROCEDURE Postorden(arbol:TArbol);
  149.         BEGIN
  150.             IF NOT(EsArbolVacio(arbol)) THEN
  151.                 BEGIN
  152.                     Postorden(arbol^.izq);
  153.                     Postorden(arbol^.der);
  154.                     Mostrar(arbol^.rai);
  155.                 END;{IF}
  156.         END;{Postorden}
  157.  
  158.     PROCEDURE Preorden(arbol:TArbol);
  159.         BEGIN
  160.             IF NOT(EsArbolVacio(arbol)) THEN
  161.                 BEGIN
  162.                     Mostrar(arbol^.rai);
  163.                     Preorden(arbol^.izq);
  164.                     Preorden(arbol^.der);
  165.                 END;{IF}
  166.         END;{Postorden}
  167.  
  168. {A partir de aquí, instrucciones de árbol binario de búsqueda}
  169.  
  170.     PROCEDURE InsertarOrdenado (VAR arbol:TArbol; elem:TElem);
  171.         VAR
  172.             i,d:TArbol;
  173.         BEGIN
  174.             CrearArbolVacio(i);
  175.             CrearArbolVacio(d);
  176.             IF EsArbolVacio(arbol) THEN
  177.                 BEGIN
  178.                     ConstruirArbol(arbol , i , elem , d);
  179.                 END{IF}
  180.             ELSE
  181.                 IF EsMayor( elem , arbol^.rai ) THEN
  182.                     InsertarOrdenado(arbol^.der , elem)
  183.                 ELSE
  184.                     IF EsMayor( arbol^.rai , elem) THEN
  185.                         InsertarOrdenado(arbol^.izq , elem);
  186.         END;{InsertarOrdenado}
  187.  
  188.     PROCEDURE Mayor (arbol:TArbol; VAR m:TElem);
  189.         BEGIN
  190.             IF NOT(EsArbolVacio(arbol)) THEN
  191.                 IF arbol^.der = NIL THEN
  192.                     m := arbol^.rai
  193.                 ELSE
  194.                     Mayor(arbol^.der , m);
  195.  
  196.         END;{Mayor}
  197.  
  198.     PROCEDURE Menor (arbol:TArbol; VAR men:TElem);
  199.         BEGIN
  200.             IF NOT(EsArbolVacio(arbol)) THEN
  201.                 IF arbol^.izq = NIL THEN
  202.                     men := arbol^.rai
  203.                 ELSE
  204.                     Menor(arbol^.izq , men);
  205.  
  206.         END;{Mayor}
  207.  
  208.     FUNCTION Pertenece (arbol:TArbol; elem:TElem):boolean;
  209.         BEGIN
  210.             IF EsArbolVacio(arbol) THEN
  211.                 Pertenece := FALSE
  212.             ELSE
  213.                 IF EsMayor(elem , arbol^.rai) THEN
  214.                     Pertenece(arbol^.der , elem)
  215.                 ELSE
  216.                     IF EsMayor( arbol^.rai , elem) THEN
  217.                         Pertenece(arbol^.izq , elem)
  218.                     ELSE
  219.                         Pertenece := TRUE;
  220.         END;{Pertenece}
  221.  
  222.     PROCEDURE Eliminar (VAR arbol:TArbol; elem:TElem);
  223.         VAR
  224.             aux:TArbol;
  225.             min:TElem;
  226.         BEGIN
  227.             IF NOT(EsArbolVacio(arbol)) THEN
  228.                 BEGIN
  229.                     IF Iguales(arbol^.rai , elem) THEN
  230.                         IF EsArbolVacio(arbol^.der) THEN
  231.                             BEGIN
  232.                                 aux := arbol;
  233.                                 arbol := arbol^.izq;
  234.                                 dispose(aux);
  235.                             END{IF}
  236.                         ELSE
  237.                             IF EsArbolVacio(arbol^.izq) THEN
  238.                                 BEGIN
  239.                                     aux := arbol;
  240.                                     arbol := arbol^.der;
  241.                                     dispose(aux);
  242.                                 END{IF}
  243.                             ELSE
  244.                                 BEGIN
  245.                                     Menor(arbol^.der , min);
  246.                                     Asignar(arbol^.rai , min);
  247.                                     Eliminar(arbol^.der , min);
  248.                                 END{ELSE}
  249.                     ELSE
  250.                         IF EsMayor( elem , arbol^.rai) THEN
  251.                             Eliminar(arbol^.der , elem)
  252.                         ELSE
  253.                             Eliminar(arbol^.izq , elem);
  254.                 END; {IF}
  255.         END; {Eliminar}
  256.  
  257. END.