Abb Balanceado
public class Arbol {
// variable de instancia del Objeto Arbol
private NodoArbol raiz;
int cantidadDeNodos;
int cantidadDeEliminados;
// constructor del Objeto Arbol
public Arbol() {
this.raiz=null;
this.cantidadDeNodos=0;
this.cantidadDeEliminados=0;
}
// funciòn principal utilizada para insertar elementos alàrbol (sin chequear que el àrbol llegue a estar desbanlaceado)
public void insertarNodo(int d){
if(this.raiz==null){
this.raiz=new NodoArbol(d);
this.cantidadDeNodos++;
}
else{
raiz.insertar(d);
this.cantidadDeNodos++;
}
}
// funciòn principal que genera un nuevo àrbol ordenado y balanceado(con los mismos elementos que el
// àrbol desequilibrado)
private NodoArbol insercionBalanceada()
{
int i;
Arbol arbol=new Arbol();
for(i=1; i nuevoArbol.dato )
{
nuevoArbol.derecha = insercionBalanceada( x, nuevoArbol.derecha );
// en caso de que el àrbol se encuentre desbanlaceado por su rama derecha
if( altura( nuevoArbol.derecha ) - altura(nuevoArbol.izquierda ) == 2 )
{
if( x > nuevoArbol.derecha.dato )
{
nuevoArbol = rotarSubarbolDerecho( nuevoArbol );
}
}
}
// luego de cada inserciòn se va actualizando la altura del arbol, de manera recursiva
nuevoArbol.altura = Math.max( altura( nuevoArbol.izquierda ), altura( nuevoArbol.derecha ) ) + 1;
//finalmente, se devuelve un àrbol balanceado
return nuevoArbol;
}
// funciòn que balancea al nuevo àrbol, cuando este se encuentre desbanlaceado por su rama izquierda
private static NodoArbol rotarSubarbolIzquierdo( NodoArbol raizDelArbol )
{
// se realizan algunos corrimientos de nodos (que lograràn luego el balanceo, cuando la funciòn sea invocada)
NodoArbol futuraNuevaRaiz= raizDelArbol.izquierda;
raizDelArbol.izquierda = futuraNuevaRaiz.derecha;
futuraNuevaRaiz.derecha = raizDelArbol;
// se actualizan las alturas de los nodos involucrados en la funciòn
raizDelArbol.altura = Math.max( altura(raizDelArbol.izquierda), altura(raizDelArbol.derecha)) + 1;
futuraNuevaRaiz.altura = Math.max( altura( futuraNuevaRaiz.izquierda ),raizDelArbol.altura ) + 1;
//finalmente, la funciòn devuelve al subàrbol izquierdo (que en realidad serà, luego, la nueva raìz del àrbol)
return futuraNuevaRaiz;
}
//funciòn que balancea al nuevo àrbol, cuando este se encuentre desbanlaceado por su rama derecha
private static NodoArbol rotarSubarbolDerecho( NodoArbol raizDelArbol )
{
// se realizan algunos corrimientos denodos (que lograràn luego el balanceo, cuando la funciòn sea invocada)
NodoArbol futuraNuevaRaiz = raizDelArbol.derecha;
raizDelArbol.derecha = futuraNuevaRaiz.izquierda;
futuraNuevaRaiz.izquierda = raizDelArbol;
// se actualizan las alturas de los nodos involucrados en la funciòn
raizDelArbol.altura = Math.max( altura(raizDelArbol.izquierda), altura(raizDelArbol.derecha) ) +1;
futuraNuevaRaiz.altura = Math.max( altura( futuraNuevaRaiz.derecha ), raizDelArbol.altura ) + 1;
//finalmente, la funciòn devuelve al subàrbol derecho (que en realidad serà, luego, la nueva raìz del àrbol)
return futuraNuevaRaiz;
}
// funciòn que reemplaza al àrbol desequlibrado por otro igual, en cuanto a sus elementos, pero balanceado
public voidbalancear()
{
this.raiz = insercionBalanceada();
}
public boolean buscar(int numero)
{
if (buscar(this.raiz, numero) == true)
{
return true;
}
else
{
return false;
}
}
private boolean buscar (NodoArbol n, int numero){
if(n != null)
{
if(n.dato == numero)
{
return true;
}
// se busca recursivamente en "ok1" y "ok2" si el...
Regístrate para leer el documento completo.