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; } }