Added code display to trees.

Fixed some bugs in trees.
This commit is contained in:
Chris Cromer 2016-07-19 14:00:08 -04:00
parent 201ed14bdd
commit 4a7e1e17ab
18 changed files with 603 additions and 49 deletions

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="PROJECT" libraries="{dtjava}" />
</component>
</project>

View File

@ -5,7 +5,7 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="dtjava" level="application" />
</component>

View File

@ -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
*/

View File

@ -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;
}
/**

View File

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

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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()) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,7 +28,7 @@
<HBox alignment="CENTER" spacing="10">
<Button text="%arbolRotarIzquerda" onAction="#botonRotarIzquerda"/>
<Button text="%arbolRotarDerecha" onAction="#botonRotarDerecha"/>
<TextFieldLimited fx:id="valorRotar" maxLength="3" prefWidth="50" text="10"/>
<TextFieldLimited fx:id="valorRotar" maxLength="3" prefWidth="50" text=""/>
</HBox>
<HBox fx:id="contenidoOrder" alignment="CENTER"/>
<ScrollPane fitToHeight="true" fitToWidth="true" VBox.vgrow="ALWAYS">