Vous êtes sur la page 1sur 4

// MTODO Retira

public boolean Retira(NodoABB<T> R, T Infor) { // SE CREA EL MTODO BOOLEANO Retira QUE RECIBE UN NODO GENRICO DE
ARBOL DE BUSQUEDA BINARIA R Y UNA VARIABLE GENRICA Infor

boolean b=true; // SE CREA LA VARIABLE BOOLEANA b, SE MARCA CMO VERDADERA

NodoABB<T> Ant=null; // SE CREA EL NODO Ant, SE MARCA CMO NULO

String Llave=Infor.toString(); // SE CREA LA VARIABLE STRING Llave, SE LE ASIGNA EL VALOR STRING DE Infor

while (R != null) { // MIENTRAS QUE R NO SEA NULA, ENTRA AL CICLO

if ( Llave.compareTo( R.Info.toString() ) < 0 ) // SI Llave TIENE UN VALOR MENOR A R, ENTRA

Ant=R; // A Ant SE LE ASIGNA EL VALOR DE R, PARA QUE EL NODO ACTUAL SE CONVIERTA EN EL ANTERIOR

R=R.DameSubIzq(); // AL NODO R SE LE ASIGNA SU HIJO IZQUIERDO, PARA AVANZAR DE FORMA NO RECURSIVA EN EL


ARBOL

b=false; // b SE MARCA COMO FALSO

else // EN CASO DE QUE Llave NO TENGA UN VALOR MENOR A R, ENTRA

if ( Llave.compareTo( R.Info.toString() ) > 0 ) // SI Llave TIENE UN VALOR MAYOR A R, ENTRA

Ant=R; // SE DECLARA COMO NODO ANTERIOR AL NODO ACTUAL

R=R.DameSubDer(); // AL NODO R SE LE ASIGNA SU HIJO IZQUIERDO

b=true; // b SE MARCA COMO VERDADERO

}
else // EN CASO DE QUE Llave TENGA UN VALOR IGUAL A R, ENTRA

break; // SE TERMINA EL CICLO

if (R==null) // SI R ES NULO, ENTRA

return false; // SE RETORNA FALSO, SE TERMINA EL MTODO

if (R.DameSubIzq() != null && R.DameSubDer() != null) { // SI EL HIJO IZQUIERDO Y EL HIJO DERECHO DE R NO SON
NULOS, ENTRA

NodoABB<T> Temp=R.DameSubDer(); // SE CREA UN NODO TEMPORAL Temp CON EL VALOR DEL HIJO DERECHO DE R

NodoABB<T> Aux=R; // SE CREA UN NODO AUXILIAR Aux CON EL VALOR DEL NODO ACTUAL R

boolean RamaIzq=false; // SE CREA UNA VARIABLE BOOLEANA RamaIzq MARCADA COMO FALSA

while (Temp.DameSubIzq() != null) // MIENTRAS QUE EL HIJO IZQUIERDO DE Temp NO SEA NULO, ENTRA AL CICLO

Aux=Temp; // AL NODO Aux SE LE ASIGNA EL NODO Temp

Temp=Temp.DameSubIzq(); // AL NODO Temp SE LE ASIGNA SU HIJO IZQUIERDO

RamaIzq=true; // SE MARCA COMO VERDADERO A RamaIzq

Dr = R.Info; // A LA VARIABLE Dr (LTIMO VALOR ELIMINADO DEL ARBOL) SE LE ASIGNA LA VIARIABLE Info DEL NODO
R

R.Info = Temp.Info; // A LA VARIABLE Info DEL NODO R SE LE ASIGNA LA VARIABLE Info DEL NODO Temp

if (RamaIzq) // SI LA VARIABLE BOOLEANA RamaIzq ES VERDADERA, ENTRA

if (Temp.DameSubIzq() == null) // SI EL HIJO DERECHO DE Temp ES NULO, ENTRA


Aux.setSubIzq(Temp.DameSubDer()); // AL HIJO IZQUIERDO DE Aux SE LE ASIGNA EL HIJO DERECHO DE Temp

else // EN CASO DE QUE EL HIJO DERECHO DE Temp NO SEA NULO, ENTRA

Aux.setSubIzq(Temp.DameSubIzq()); // AL HIJO IZQUIERDO DE Aux SE LE ASIGNA EL HIJO IZQUIERDO DE Temp

else // EN CASO DE QUE RamaIzq SEA FALSA, ENTRA

Aux.setSubDer(Temp.DameSubDer()); // AL HIJO DERECHO DE Aux SE LE ASIGNA EL HIJO DERECHO DE Temp

return true; // SE RETORNA VERDADERO, SE TERMINA EL MTODO

else // EL HIJO IQUIERDO Y/O EL HIJO DERECHO DE R RESULTAN SER NULOS, ENTRA

if (R==Root) // SI EL NODO R ES IGUAL A LA RAZ PRINCIPAL DEL ARBOL (Root), ENTRA

Dr=R.Info; // A LA VARIABLE Dr (LTIMO VALOR ELIMINADO DEL ARBOL) SE LE ASIGNA LA VIARIABLE Info DEL
NODO R

if (R.DameSubIzq()==null) // SI EL HIJO IZQUIERDO DE R ES NULO, ENTRA

Root=R.DameSubDer(); // A LA RAZ PRINCIPAL DEL ARBOL (Root) SE LE ASIGNA EL HIJO DERECHO DE R

else // EN CASO DE EL HIJO IQUIERDO DE R NO SEA NULO, ENTRA

Root=R.DameSubIzq(); // A LA RAZ PRINCIPAL DEL ARBOL (Root) SE LE ASIGNA EL HIJO IZQUIERDO DE R

}
else // EN CASO DE QUE EL NODO R NO SEA IGUAL A LA RAZ PRINCIPAL DEL ARBOL (Root), ENTRA

Dr=R.Info; // A LA VARIABLE Dr (LTIMO VALOR ELIMINADO DEL ARBOL) SE LE ASIGNA LA VIARIABLE Info DEL NODO
R

if (R.DameSubIzq() == null) // SI EL HIJO IZQUIERDO DE R ES NULO, ENTRA

if (b) // SI LA VARIABLE BOOLEANA b EST MARCADA COMO VERDADERA, ENTRA

Ant.setSubDer(R.DameSubDer()); // AL HIJO DERECHO DE Ant SE LE ASIGNA EL HIJO DERECHO DE R

else // EN CASO DE QUE LA VARIABLE BOOLEANA b NO EST MARCADO COMO VERDADERO, ENTRA

Ant.setSubIzq(R.DameSubDer()); // AL HIJO IZQUIERDO DE Ant SE LE ASIGNA EL HIJO DERECHO DE R

else // EN CASO DE QUE EL HIJO IQUIERDO DE R NO SEA NULO, ENTRA

if (b) // SI LA VARIABLE BOOLEANA b EST MARCADA COMO VERDADERA, ENTRA

Ant.setSubDer(R.DameSubIzq()); // AL HIJO DERECHO DE Ant SE LE ASIGNA EL HIJO IQUIERDO DE R

else // EN CASO DE QUE LA VARIABLE BOOLEANA b NO EST MARCADO COMO VERDADERO, ENTRA

Ant.setSubIzq(R.DameSubIzq()); // AL HIJO IQUIERDO DE Ant SE LE ASIGNA EL HIJO IZQUIERDO DE R

return true; // SE RETORNA TRUE, SE TERMINA EL MTODO