126 lines
2.3 KiB
Java
126 lines
2.3 KiB
Java
package cl.cromer.estructuras;
|
|
|
|
public class Arbol {
|
|
private ArbolNodo arbol;
|
|
private int size;
|
|
private int altura;
|
|
private int ancho;
|
|
|
|
public enum PrimerLado {
|
|
IZQUERDA,
|
|
DERECHA
|
|
}
|
|
|
|
public Arbol() {
|
|
this.arbol = null;
|
|
this.altura = 0;
|
|
this.ancho = 0;
|
|
}
|
|
|
|
public boolean insertar(int valor) {
|
|
if (this.arbol == null) {
|
|
arbol = new ArbolNodo(valor);
|
|
arbol.setY(1);
|
|
arbol.setX(1);
|
|
ancho = 1;
|
|
altura = 1;
|
|
return true;
|
|
}
|
|
else {
|
|
PrimerLado primerLado = null;
|
|
ArbolNodo nuevo = new ArbolNodo(valor);
|
|
ArbolNodo actual = arbol;
|
|
ArbolNodo padre;
|
|
while (true) {
|
|
padre = actual;
|
|
if (valor == actual.getValor()) {
|
|
// Ya existe.
|
|
return false;
|
|
}
|
|
else if (valor < actual.getValor()) {
|
|
// Izquerda
|
|
if (primerLado == null) {
|
|
primerLado = PrimerLado.IZQUERDA;
|
|
nuevo.setX(1);
|
|
}
|
|
else {
|
|
nuevo.setX(nuevo.getX() + 1);
|
|
}
|
|
nuevo.setY(nuevo.getY() + 1);
|
|
actual = actual.getIzquerda();
|
|
if (actual == null) {
|
|
padre.setIzquerda(nuevo);
|
|
size++;
|
|
if (primerLado == PrimerLado.IZQUERDA) {
|
|
ancho++;
|
|
}
|
|
setAltura(getAlturaRecursivo(arbol));
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
// Derecha
|
|
if (primerLado == null) {
|
|
primerLado = PrimerLado.DERECHA;
|
|
nuevo.setX(1);
|
|
}
|
|
else {
|
|
nuevo.setX(nuevo.getX() + 1);
|
|
}
|
|
nuevo.setY(nuevo.getY() + 1);
|
|
actual = actual.getDerecha();
|
|
if (actual == null) {
|
|
padre.setDerecha(nuevo);
|
|
size++;
|
|
if (primerLado == PrimerLado.DERECHA) {
|
|
ancho++;
|
|
}
|
|
setAltura(getAlturaRecursivo(arbol));
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public ArbolNodo getArbol() {
|
|
return arbol;
|
|
}
|
|
|
|
public int size() {
|
|
return size;
|
|
}
|
|
|
|
public int getAltura() {
|
|
return altura;
|
|
}
|
|
|
|
public void setAltura(int altura) {
|
|
this.altura = altura;
|
|
}
|
|
|
|
public int getAncho() {
|
|
return ancho;
|
|
}
|
|
|
|
public void setAncho(int ancho) {
|
|
this.ancho = ancho;
|
|
}
|
|
|
|
public int getAlturaRecursivo(ArbolNodo nodo) {
|
|
if (nodo == null) {
|
|
return 0;
|
|
}
|
|
else {
|
|
int alturaIzquerda = getAlturaRecursivo(nodo.getIzquerda());
|
|
int alturaDercha = getAlturaRecursivo(nodo.getDerecha());
|
|
if (alturaIzquerda > alturaDercha) {
|
|
return (alturaIzquerda + 1);
|
|
}
|
|
else {
|
|
return (alturaDercha + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|