// // Created by Julio Tentor // public class BinarySearchTree> extends BinaryTree { public BinarySearchTree() { super(); } public void add(ELEMENT item) { if (this.root == null) { this.root = new BTNode(item, null, null); } else { BTNode temp = this.root; BTNode prev = null; while (temp != null ) { prev = temp; if (item.compareTo(temp.item) < 0) { temp = temp.left; } else { temp = temp.right; } } temp = new BTNode(item, null, null); if (item.compareTo(prev.item) < 0) { prev.left = temp; } else { prev.right = temp; } } } public ELEMENT remove(ELEMENT item) { return removeByCopy(item); //return removeByFusion(item); } private ELEMENT removeByCopy(ELEMENT item) { BTNode find = this.root; BTNode prev = null; while ((find != null) && (find.item.compareTo(item) != 0)) { prev = find; if (item.compareTo(find.item) < 0) { find = find.left; } else { find = find.right; } } if (find == null) { throw new RuntimeException("No existe el elemento o el árbol está vacío"); } // find es el nodo con el valor a extraer y prev el padre de ese nodo ELEMENT save = find.item; BTNode node = find; if (node.right == null) { // no hay subarbol derecho node = node.left; // nodo con un descendiente u hoja } else { if (node.left == null) { // no hay subarbol izquierdo node = node.right; // nodo con un descendiente u hoja } else { // dos descendientes BTNode last = node; BTNode temp = node.right; // a la derecha (mayores) while (temp.left != null) { // busca a la izquierda el menor last = temp; temp = temp.left; } // temp es el menor de los mayores node.item = temp.item; // hace la copia if (last == node) { last.right = temp.right; } else { last.left = temp.right; } temp.right = null; } } // reajustar el arbol if (find == this.root) { this.root = node; } else { if (prev.left == find) { prev.left = node; } else { prev.right = node; } } return save; } private ELEMENT removeByFusion(ELEMENT item) { BTNode find = this.root; BTNode prev = null; while ((find != null) && (find.item.compareTo(item) != 0)) { prev = find; if (item.compareTo(find.item) < 0) { find = find.left; } else { find = find.right; } } if (find == null) { throw new RuntimeException("No existe el elemento o el árbol está vacío"); } ELEMENT save = find.item; BTNode node = find; if (node.right == null) { node = node.left; } else { if (node.left == null) { node = node.right; } else { BTNode temp = node.right; while (temp.left != null) { temp = temp.left; } temp.left = node.left; node = node.right; } } if (find == this.root) { this.root = node; } else { if (prev.left == find) { prev.left = node; } else { prev.right = node; } } find.left = find.right = null; return save; } }