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: T_REGISTRO);
\r
33 PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO);
\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: T_REGISTRO; 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: T_REGISTRO);
\r
58 e := a.Corriente^.Elem;
\r
61 PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO);
\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 ) then
\r
74 if ( ret = nil ) and ( p^.Izquierda <> nil ) then
\r
75 ret := buscar_padre( p^.Izquierda, h );
\r
76 if ( ret = nil ) and ( p^.Derecha <> nil ) then
\r
77 ret := buscar_padre( p^.Derecha, h );
\r
78 buscar_padre := ret;
\r
84 A.Corriente := a.Raiz;
\r
86 if a.Corriente^.Izquierda = nil then
\r
89 a.Corriente := A.Corriente^.Izquierda;
\r
91 if a.Corriente^.Derecha = nil then
\r
94 a.Corriente := A.Corriente^.Derecha;
\r
96 if a.Corriente = A.Raiz then
\r
99 a.Corriente := buscar_padre( a.Raiz, a.Corriente );
\r
103 PROCEDURE AB_borrar_sub( VAR a: AB_ARBOL; m: AB_MOVIMIENTO );
\r
104 PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO );
\r
106 if p <> nil then begin
\r
107 liberar_subarbol( p^.Izquierda );
\r
108 liberar_subarbol( p^.Derecha );
\r
116 liberar_subarbol( a.Corriente^.Izquierda );
\r
118 liberar_subarbol( a.Corriente^.Derecha );
\r
122 PROCEDURE AB_insertar( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; e: T_REGISTRO; VAR error: BOOLEAN );
\r
128 p^.Izquierda := nil;
\r
133 if a.Raiz = nil then
\r
138 if a.Corriente^.Izquierda = nil then
\r
139 a.Corriente^.Izquierda := p
\r
143 if a.Corriente^.Derecha = nil then
\r
144 a.Corriente^.Derecha := p
\r
151 if error = false then
\r
158 PROCEDURE AB_vaciar( VAR a: AB_ARBOL );
\r
159 PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO );
\r
161 if p <> nil then begin
\r
162 liberar_subarbol( p^.Izquierda );
\r
163 liberar_subarbol( p^.Derecha ); { ARREGLADO, decía p^.Izquierda }
\r
169 liberar_subarbol( a.Raiz );
\r
170 a.Corriente := nil;
\r
173 PROCEDURE AB_copiar( a : AB_ARBOL; VAR b : AB_ARBOL );
\r
174 PROCEDURE copiar_subarbol( o : AB_PUNTERO; VAR d : AB_PUNTERO );
\r
176 if o <> nil then begin
\r
177 { tengo que copiar el nodo y llamar a la copia de los hijos }
\r
178 { el procedimiento va modificando el d como viene por referencia }
\r
180 d^.Elem := o^.Elem;
\r
181 d^.Izquierda := nil;
\r
183 copiar_subarbol( o^.Izquierda, d^.Izquierda );
\r
184 copiar_subarbol( o^.Derecha , d^.Derecha );
\r
188 { tenemos que vaciar primero el arbol b (destino) }
\r
190 { ahora copiamos todo el arbol origen }
\r
191 copiar_subarbol( a.Raiz, b.Raiz );
\r
192 a.Corriente := a.Raiz;
\r