4 IMPLEMENTACION : ARBOLES BINARIOS
\r
5 ALMACENAMIENTO : PUNTEROS
\r
10 { usa las funciones generales de TDAs }
\r
13 { tipos propios del arbol binario }
\r
15 AB_movimiento = ( AB_raiz, AB_izquierda, AB_derecha, AB_padre );
\r
17 AB_puntero = ^AB_nodo;
\r
22 Derecha : AB_puntero;
\r
27 Corriente: AB_puntero;
\r
30 PROCEDURE AB_crear( VAR a: AB_arbol );
\r
31 FUNCTION AB_vacio( a: AB_arbol): BOOLEAN;
\r
32 PROCEDURE AB_elem_cte( a: AB_arbol; VAR e: Tipo_Elem);
\r
33 PROCEDURE AB_modif_cte( VAR a: AB_arbol; e: Tipo_Elem);
\r
34 PROCEDURE AB_mover_cte( VAR a: AB_arbol; m: AB_movimiento; VAR error: BOOLEAN );
\r
35 PROCEDURE AB_borrar_sub( VAR a: AB_arbol; m: AB_movimiento );
\r
36 PROCEDURE AB_insertar( VAR a: AB_arbol; m: AB_movimiento; e: Tipo_Elem; VAR error: BOOLEAN );
\r
37 PROCEDURE AB_vaciar( VAR a: AB_arbol );
\r
38 PROCEDURE AB_copiar( a: AB_arbol; VAR b: AB_arbol );
\r
43 { Estas son los dos procedimientos principales de la aplicaciĆ³n }
\r
45 PROCEDURE AB_crear( VAR a: AB_arbol );
\r
51 FUNCTION AB_vacio( a: AB_arbol): BOOLEAN;
\r
53 AB_vacio := ( a.Raiz = NIL);
\r
56 PROCEDURE AB_elem_cte( a: AB_arbol; VAR e: Tipo_Elem);
\r
58 e := a.Corriente^.Elem;
\r
61 PROCEDURE AB_modif_cte( VAR a: AB_arbol; e: Tipo_Elem);
\r
63 a.Corriente^.Elem := e;
\r
66 PROCEDURE AB_mover_cte( VAR a: AB_arbol; m: AB_movimiento; VAR error: BOOLEAN );
\r
67 FUNCTION buscar_padre( p: AB_puntero; h: AB_puntero ) : AB_puntero;
\r
72 IF ( p^.Izquierda = h ) OR ( p^.Derecha = h )
\r
75 IF ( ret = NIL ) AND ( p^.Izquierda <> NIL )
\r
77 ret := buscar_padre ( p^.Izquierda, h );
\r
78 IF ( ret = NIL ) AND ( p^.Derecha <> NIL )
\r
80 ret := buscar_padre ( p^.Derecha, h );
\r
81 buscar_padre := ret;
\r
87 A.Corriente := a.Raiz;
\r
89 IF a.Corriente^.Izquierda = NIL
\r
93 a.Corriente := A.Corriente^.Izquierda;
\r
95 IF A.Corriente^.Derecha = NIL
\r
99 a.Corriente := A.Corriente^.Derecha;
\r
101 IF a.Corriente = A.Raiz
\r
105 a.Corriente := buscar_padre( a.Raiz, a.Corriente );
\r
109 PROCEDURE AB_borrar_sub( VAR a: AB_arbol; m: AB_movimiento );
\r
110 PROCEDURE liberar_subarbol( VAR p : AB_puntero );
\r
114 liberar_subarbol( p^.Izquierda );
\r
115 liberar_subarbol( p^.Izquierda );
\r
123 liberar_subarbol( a.Corriente^.Izquierda );
\r
125 liberar_subarbol( a.Corriente^.Derecha );
\r
129 PROCEDURE AB_insertar( VAR a: AB_arbol; m: AB_movimiento; e: Tipo_Elem; VAR error: BOOLEAN );
\r
135 p^.Izquierda := NIL;
\r
146 IF a.Corriente^.Izquierda = NIL
\r
148 a.Corriente^.Izquierda := p
\r
152 IF a.Corriente^.Derecha = NIL
\r
154 a.Corriente^.Derecha := p
\r
169 PROCEDURE AB_vaciar( VAR a: AB_arbol );
\r
170 PROCEDURE liberar_subarbol( VAR p : AB_puntero );
\r
174 liberar_subarbol( p^.Izquierda );
\r
175 liberar_subarbol( p^.Derecha );
\r
181 liberar_subarbol( a.Raiz );
\r
182 a.Corriente := NIL;
\r
185 PROCEDURE AB_copiar( a : AB_arbol; VAR b : AB_arbol );
\r
186 PROCEDURE copiar_subarbol( o : AB_puntero; VAR d : AB_puntero );
\r
190 { tengo que copiar el nodo y llamar a la copia de los hijos }
\r
191 { el procedimiento va modificando el d como viene por referencia }
\r
193 d^.Elem := o^.Elem;
\r
194 d^.Izquierda := NIL;
\r
196 copiar_subarbol( o^.Izquierda, d^.Izquierda );
\r
197 copiar_subarbol( o^.Derecha , d^.Derecha );
\r
201 { tenemos que vaciar primero el arbol b (destino) }
\r
203 { ahora copiamos todo el arbol origen }
\r
204 copiar_subarbol( a.Raiz, b.Raiz );
\r
205 a.Corriente := a.Raiz;
\r