Estructuras_de_Datos/src/cl/cromer/estructuras/code/arbolGeneral/eliminar

117 lines
2.2 KiB
Plaintext

public void eliminar(int valor) {
if (arbol == null) {
// No hay nodos.
return;
}
ArbolNodo actual = arbol;
ArbolNodo padre = arbol;
boolean izquerda = true;
while (actual.getValor() != valor) {
padre = actual;
if (valor < actual.getValor()) {
izquerda = true;
actual = actual.getIzquerda();
}
else {
izquerda = false;
actual = actual.getDerecha();
}
if (actual == null) {
return;
}
}
if (actual.getIzquerda() == null && actual.getDerecha() == null) {
if (actual == arbol) {
arbol = null;
}
else if (izquerda) {
padre.setIzquerda(null);
}
else {
padre.setDerecha(null);
}
}
else if(actual.getDerecha() == null) {
if (actual == arbol) {
arbol = actual.getIzquerda();
}
else if (izquerda) {
padre.setIzquerda(actual.getIzquerda());
}
else {
padre.setDerecha(actual.getIzquerda());
}
}
else if(actual.getIzquerda() == null) {
if (actual == arbol) {
arbol = actual.getDerecha();
}
else if (izquerda) {
padre.setIzquerda(actual.getDerecha());
}
else {
padre.setDerecha(actual.getDerecha());
}
}
else {
ArbolNodo successorParent = actual;
ArbolNodo successor = actual;
ArbolNodo current = actual.getDerecha();
while (current != null) {
successorParent = successor;
successor = current;
current = current.getIzquerda();
}
if (successor != actual.getDerecha()) {
successorParent.setIzquerda(successor.getDerecha());
successor.setDerecha(actual.getDerecha());
}
if (actual == arbol) {
arbol = successor;
}
else if (izquerda) {
padre.setIzquerda(successor);
}
else {
padre.setDerecha(successor);
}
successor.setIzquerda(actual.getIzquerda());
}
}
final public class ArbolNodo {
private ArbolNodo izquerda;
private ArbolNodo derecha;
private int valor;
public ArbolNodo(int valor) {
this.izquerda = null;
this.derecha = null;
this.valor = valor;
}
public ArbolNodo getIzquerda() {
return izquerda;
}
public void setIzquerda(ArbolNodo izquerda) {
this.izquerda = izquerda;
}
public ArbolNodo getDerecha() {
return derecha;
}
public void setDerecha(ArbolNodo derecha) {
this.derecha = derecha;
}
public int getValor() {
return valor;
}
}