diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml deleted file mode 100644 index 43589db..0000000 --- a/.idea/jsLibraryMappings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Estructuras de Datos.iml b/Estructuras de Datos.iml index 8615095..e78cf63 100644 --- a/Estructuras de Datos.iml +++ b/Estructuras de Datos.iml @@ -5,7 +5,7 @@ - + diff --git a/src/cl/cromer/estructuras/Arbol.java b/src/cl/cromer/estructuras/Arbol.java index 822bb88..239df65 100644 --- a/src/cl/cromer/estructuras/Arbol.java +++ b/src/cl/cromer/estructuras/Arbol.java @@ -54,7 +54,7 @@ public class Arbol { */ public boolean insertar(int valor) { if (this.arbol == null) { - arbol = new ArbolNodo(valor, null); + arbol = new ArbolNodo(valor); size++; setAltura(calcularAltura(arbol)); @@ -69,7 +69,7 @@ public class Arbol { return true; } else { - ArbolNodo nuevo = new ArbolNodo(valor, null); + ArbolNodo nuevo = new ArbolNodo(valor); ArbolNodo actual = arbol; ArbolNodo padre; while (true) { @@ -128,6 +128,10 @@ public class Arbol { * @return boolean: Verdad si fue eliminado, falso si no existe. */ public boolean eliminar(int valor) { + if (arbol == null) { + return false; + } + ArbolNodo actual = arbol; ArbolNodo padre = arbol; boolean izquerda = true; @@ -161,23 +165,29 @@ public class Arbol { else if(actual.getDerecha() == null) { if (actual == arbol) { arbol = actual.getIzquerda(); + arbol.setPadre(null); } else if (izquerda) { padre.setIzquerda(actual.getIzquerda()); + actual.setPadre(padre); } else { padre.setDerecha(actual.getIzquerda()); + actual.setPadre(padre); } } else if(actual.getIzquerda() == null) { if (actual == arbol) { arbol = actual.getDerecha(); + arbol.setPadre(null); } else if (izquerda) { padre.setIzquerda(actual.getDerecha()); + actual.setPadre(padre); } else { padre.setDerecha(actual.getDerecha()); + actual.setPadre(padre); } } else { @@ -192,19 +202,24 @@ public class Arbol { if (successor != actual.getDerecha()) { successorParent.setIzquerda(successor.getDerecha()); successor.setDerecha(actual.getDerecha()); + actual.setPadre(successor); } if (actual == arbol) { arbol = successor; + arbol.setPadre(null); } else if (izquerda) { padre.setIzquerda(successor); + successor.setPadre(padre); } else { padre.setDerecha(successor); + successor.setPadre(padre); } successor.setIzquerda(actual.getIzquerda()); + actual.setPadre(successor); } size--; setAltura(calcularAltura(arbol)); @@ -504,7 +519,7 @@ public class Arbol { } /** - * Esta clase contiene los tipos de arboles. + * Esta clase contiene los arbolTipo de arboles. * * @author Chris Cromer */ diff --git a/src/cl/cromer/estructuras/ArbolController.java b/src/cl/cromer/estructuras/ArbolController.java index c261694..5febe39 100644 --- a/src/cl/cromer/estructuras/ArbolController.java +++ b/src/cl/cromer/estructuras/ArbolController.java @@ -11,6 +11,7 @@ import java.net.URL; import java.util.List; import java.util.Random; import java.util.ResourceBundle; +import java.util.Scanner; /** * Esta clase es para controlar todos la interfaz de Arbol. @@ -63,6 +64,11 @@ public class ArbolController implements Initializable { */ private Arbol arbol; + /** + * El tipo de arbol actual. + */ + Arbol.Tipos arbolTipo; + /** * Inicializar todos los datos y dibujar las graficas. * @@ -86,7 +92,7 @@ public class ArbolController implements Initializable { initializeArbol(); } - /*Random random = new Random(); + Random random = new Random(); int maximo = 99; int minimo = 0; int rango = maximo - minimo + 1; @@ -102,15 +108,7 @@ public class ArbolController implements Initializable { break; } } - }*/ - - arbol.insertar(10); - arbol.insertar(8); - arbol.insertar(9); - arbol.insertar(7); - arbol.insertar(12); - arbol.insertar(11); - arbol.insertar(13); + } generarGrafico(); } @@ -139,8 +137,9 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/insertar")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); if (valorArbol.getText() != null && ! valorArbol.getText().trim().equals("")) { try { @@ -173,8 +172,9 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/eliminar")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); if (valorArbol.getText() != null && ! valorArbol.getText().trim().equals("")) { try { @@ -207,12 +207,28 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/rotarIzquerda")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); - arbol.rotarIzquerda(Integer.valueOf(valorRotar.getText())); - - generarGrafico(); + if (valorRotar.getText() != null && ! valorRotar.getText().trim().equals("")) { + try { + boolean exito = arbol.rotarIzquerda(Integer.valueOf(valorRotar.getText())); + if (exito) { + generarGrafico(); + } + else { + Main.mostrarError(resourceBundle.getString("arbolNoEsta"), resourceBundle); + } + } + catch (NumberFormatException exception) { + // El error no es fatal, sigue + Main.mostrarError(resourceBundle.getString("arbolNoValor"), resourceBundle); + } + } + else { + Main.mostrarError(resourceBundle.getString("arbolNoValor"), resourceBundle); + } } /** @@ -225,12 +241,28 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/rotarDerecha")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); - arbol.rotarDerecha(Integer.valueOf(valorRotar.getText())); - - generarGrafico(); + if (valorRotar.getText() != null && ! valorRotar.getText().trim().equals("")) { + try { + boolean exito = arbol.rotarDerecha(Integer.valueOf(valorRotar.getText())); + if (exito) { + generarGrafico(); + } + else { + Main.mostrarError(resourceBundle.getString("arbolNoEsta"), resourceBundle); + } + } + catch (NumberFormatException exception) { + // El error no es fatal, sigue + Main.mostrarError(resourceBundle.getString("arbolNoValor"), resourceBundle); + } + } + else { + Main.mostrarError(resourceBundle.getString("arbolNoValor"), resourceBundle); + } } /** @@ -243,8 +275,9 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/preOrder")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); Colores colores = new Colores(); @@ -267,8 +300,9 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/inOrder")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); Colores colores = new Colores(); @@ -291,8 +325,9 @@ public class ArbolController implements Initializable { } // Mostrar el codigo - /*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next(); - codigoArray.setText(codigoTexto);*/ + String tipo = getTipoString(); + String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/arbol" + tipo + "/postOrder")).useDelimiter("\\Z").next(); + codigoArbol.setText(codigoTexto); Colores colores = new Colores(); @@ -313,7 +348,24 @@ public class ArbolController implements Initializable { // Make the grid line present on the screen //contenidoArbol.setGridLinesVisible(true); this.arbol = new Arbol(); - Arbol.Tipos tipos = (Arbol.Tipos) scene.getUserData(); + arbolTipo = (Arbol.Tipos) scene.getUserData(); + } + + /** + * Devolver el tipo de arbol en un string. + * + * @return String: El tipo de arbol. + */ + private String getTipoString() { + String tipo; + switch (arbolTipo.getTipo()) { + case Arbol.Tipos.GENERAL: + tipo = "General"; + break; + default: + tipo = "General"; + } + return tipo; } /** diff --git a/src/cl/cromer/estructuras/ArbolNodo.java b/src/cl/cromer/estructuras/ArbolNodo.java index 01fe60c..c0c1514 100644 --- a/src/cl/cromer/estructuras/ArbolNodo.java +++ b/src/cl/cromer/estructuras/ArbolNodo.java @@ -35,10 +35,9 @@ final public class ArbolNodo { * Incilizar. * * @param valor int: El valor del nodo. - * @param padre ArbolNodo: Su nodo padre. */ - public ArbolNodo(int valor, ArbolNodo padre) { - this.padre = padre; + public ArbolNodo(int valor) { + this.padre = null; this.izquerda = null; this.derecha = null; this.valor = valor; diff --git a/src/cl/cromer/estructuras/Array.java b/src/cl/cromer/estructuras/Array.java index 86391b2..0baa9da 100644 --- a/src/cl/cromer/estructuras/Array.java +++ b/src/cl/cromer/estructuras/Array.java @@ -529,7 +529,7 @@ final public class Array { } /** - * Esta clase contiene los tipos de array. + * Esta clase contiene los arbolTipo de array. * * @author Chris Cromer */ diff --git a/src/cl/cromer/estructuras/Grafo.java b/src/cl/cromer/estructuras/Grafo.java index 22a7c2d..67a0461 100644 --- a/src/cl/cromer/estructuras/Grafo.java +++ b/src/cl/cromer/estructuras/Grafo.java @@ -9,7 +9,7 @@ import java.util.*; */ public class Grafo { /** - * Esta clase contiene los tipos de grafo. + * Esta clase contiene los arbolTipo de grafo. * * @author Chris Cromer */ diff --git a/src/cl/cromer/estructuras/ListaEnlace.java b/src/cl/cromer/estructuras/ListaEnlace.java index 17e1681..36e0f30 100644 --- a/src/cl/cromer/estructuras/ListaEnlace.java +++ b/src/cl/cromer/estructuras/ListaEnlace.java @@ -1,7 +1,7 @@ package cl.cromer.estructuras; /** - * Esta interfaz es para los 2 tipos de enlace, {@link ListaEnlaceNormal} y {@link ListaEnlaceCircular}. + * Esta interfaz es para los 2 arbolTipo de enlace, {@link ListaEnlaceNormal} y {@link ListaEnlaceCircular}. * * @author Chris Cromer */ diff --git a/src/cl/cromer/estructuras/ListaEnlazada.java b/src/cl/cromer/estructuras/ListaEnlazada.java index 76be495..7941689 100644 --- a/src/cl/cromer/estructuras/ListaEnlazada.java +++ b/src/cl/cromer/estructuras/ListaEnlazada.java @@ -180,7 +180,7 @@ final public class ListaEnlazada { } /** - * Esta clase contiene los tipos de listas enlazadas. + * Esta clase contiene los arbolTipo de listas enlazadas. * * @author Chris Cromer */ diff --git a/src/cl/cromer/estructuras/ListaEnlazdaController.java b/src/cl/cromer/estructuras/ListaEnlazdaController.java index 9411047..4d94e4e 100644 --- a/src/cl/cromer/estructuras/ListaEnlazdaController.java +++ b/src/cl/cromer/estructuras/ListaEnlazdaController.java @@ -276,6 +276,11 @@ public class ListaEnlazdaController implements Initializable { nuevaLista(); } + /** + * Devolver la string de tipo de lista enlazada. + * + * @return String: El nombre del tipo de lista enlazada. + */ private String getTipoString() { String tipo; switch (listaEnlazadaTipos.getTipo()) { diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/eliminar b/src/cl/cromer/estructuras/code/arbolGeneral/eliminar new file mode 100644 index 0000000..dae17c8 --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/eliminar @@ -0,0 +1,117 @@ +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/inOrder b/src/cl/cromer/estructuras/code/arbolGeneral/inOrder new file mode 100644 index 0000000..5fc5456 --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/inOrder @@ -0,0 +1,39 @@ +public void inOrder(ArbolNodo nodo) { + if (nodo != null) { + inOrder(nodo.getIzquerda()); + System.out.println(nodo.getValor()); + inOrder(nodo.getDerecha()); + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/insertar b/src/cl/cromer/estructuras/code/arbolGeneral/insertar new file mode 100644 index 0000000..c6f6a2e --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/insertar @@ -0,0 +1,69 @@ +public void insertar(int valor) { + if (this.arbol == null) { + // Crear la raiz. + arbol = new ArbolNodo(valor); + return; + } + else { + ArbolNodo nuevo = new ArbolNodo(valor); + ArbolNodo actual = arbol; + ArbolNodo padre; + while (true) { + padre = actual; + if (valor == actual.getValor()) { + // Ya existe. + return; + } + else if (valor < actual.getValor()) { + // Izquerda + actual = actual.getIzquerda(); + if (actual == null) { + // EncontrĂ³ un null, insertar el nodo nuevo. + padre.setIzquerda(nuevo); + return; + } + } + else { + // Derecha + actual = actual.getDerecha(); + if (actual == null) { + // EncontrĂ³ un null, insertar el nodo nuevo. + padre.setDerecha(nuevo); + return; + } + } + } + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/postOrder b/src/cl/cromer/estructuras/code/arbolGeneral/postOrder new file mode 100644 index 0000000..b0a46bb --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/postOrder @@ -0,0 +1,39 @@ +public void postOrder(ArbolNodo nodo) { + if (nodo != null) { + postOrder(nodo.getIzquerda()); + postOrder(nodo.getDerecha()); + System.out.println(nodo.getValor()); + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/preOrder b/src/cl/cromer/estructuras/code/arbolGeneral/preOrder new file mode 100644 index 0000000..402dbc3 --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/preOrder @@ -0,0 +1,39 @@ +public void preOrder(ArbolNodo nodo) { + if (nodo != null) { + System.out.println(nodo.getValor()); + preOrder(nodo.getIzquerda()); + preOrder(nodo.getDerecha()); + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/rotarDerecha b/src/cl/cromer/estructuras/code/arbolGeneral/rotarDerecha new file mode 100644 index 0000000..72b1110 --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/rotarDerecha @@ -0,0 +1,93 @@ +public void rotarDerecha(int valor) { + if (arbol == null) { + // No hay nodos. + return; + } + + ArbolNodo hijo = arbol; + ArbolNodo padre; + ArbolNodo abuelo; + while (true) { + abuelo = padre; + padre = hijo; + if (valor == hijo.getValor()) { + // Se encontrĂ³ + hijo = padre.getIzquerda(); + if (hijo == null) { + return false; + } + + // Rotar los valores. + ArbolNodo hijoDerecha = hijo.getDerecha(); + + if (arbol == padre) { + arbol = hijo; + } + else { + if (abuelo.getDerecha() == padre) { + abuelo.setDerecha(hijo); + } + else { + abuelo.setIzquerda(hijo); + } + } + + hijo.setDerecha(padre); + if (hijoDerecha != null) { + padre.setIzquerda(hijoDerecha); + } + else { + padre.setIzquerda(null); + } + return; + } + else if (valor < hijo.getValor()) { + // Izquerda + hijo = hijo.getIzquerda(); + if (hijo == null) { + // No existe el nodo. + return; + } + } + else { + // Derecha + hijo = hijo.getDerecha(); + if (hijo == null) { + // No existe el nodo. + return; + } + } + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/code/arbolGeneral/rotarIzquerda b/src/cl/cromer/estructuras/code/arbolGeneral/rotarIzquerda new file mode 100644 index 0000000..c93584e --- /dev/null +++ b/src/cl/cromer/estructuras/code/arbolGeneral/rotarIzquerda @@ -0,0 +1,93 @@ +public void rotarIzquerda(int valor) { + if (arbol == null) { + // No hay nodos. + return; + } + + ArbolNodo hijo = arbol; + ArbolNodo padre; + ArbolNodo abuelo; + while (true) { + abuelo = padre; + padre = hijo; + if (valor == hijo.getValor()) { + // Se encontrĂ³ + hijo = padre.getDerecha(); + if (hijo == null) { + return; + } + + // Rotar los valores. + ArbolNodo hijoIzquerda = hijo.getIzquerda(); + + if (arbol == padre) { + arbol = hijo; + } + else { + if (abuelo.getDerecha() == padre) { + abuelo.setDerecha(hijo); + } + else { + abuelo.setIzquerda(hijo); + } + } + + hijo.setIzquerda(padre); + if (hijoIzquerda != null) { + padre.setDerecha(hijoIzquerda); + } + else { + padre.setDerecha(null); + } + return; + } + else if (valor < hijo.getValor()) { + // Izquerda + hijo = hijo.getIzquerda(); + if (hijo == null) { + // No existe el nodo. + return; + } + } + else { + // Derecha + hijo = hijo.getDerecha(); + if (hijo == null) { + // No existe el nodo. + return; + } + } + } +} + +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; + } +} \ No newline at end of file diff --git a/src/cl/cromer/estructuras/fxml/arbol.fxml b/src/cl/cromer/estructuras/fxml/arbol.fxml index 6d7f8ae..a129511 100644 --- a/src/cl/cromer/estructuras/fxml/arbol.fxml +++ b/src/cl/cromer/estructuras/fxml/arbol.fxml @@ -28,7 +28,7 @@