miércoles, 29 de abril de 2009


RECORRIDO DE UN ARBOL

public class Test{
public static void main(String args[]){
CArbolBinarioDeBusqueda arbolbb=new CArbolBinarioDeBusqueda();
String nombre;
double nota;
int i=0,cod;
System.out.println("Introducir datos. Finalizar con Ctrl+z.");
System.out.println("nombre: ");
while((nombre=Leer.dato())!=null) {
System.out.print("nota: ");
nota=Leer.datoDouble();
cod=arbolbb.insertar(new CDatos(nombre,nota));
if(cod==CArbolBinarioDeBusqueda.YA_EXISTE) {
CDatos datos=(CDatos)arbolbb.buscar(new CDatos(nombre,nota));
if(nota>=0)
datos.asignarNota(nota);
else {
if(arbolbb.borrar(new CDatos(nombre,nota))==null)
System.out.println("nodo borrado porque no existe");
else System.out.println("nodo borrado");
}
}
System.out.print("nombre: ");
}
System.out.println("\n");
System.out.println("\nArbolInorden: ");
arbolbb.visitarInorden();
System.out.println("\nArbol posorden: ");
arbolbb.visitarPosorden();
System.out.println("\nArbol preorden: ");
arbolbb.visitarPreorden();
}
CREACION DE ARBOLES


MAPA CONCEPTUAL


ARBOLES MULTICAMINOS

ARBOLES BINARIOS

Un árbol binario es un grafo conexo, acíclico y no dirigido tal que el grado de cada vértice no es mayor a 3». De esta forma sólo existe un camino entre un par de nodos.
Un árbol binario con enraizado es como un grafo que tiene uno de sus vértices, llamado raíz, de grado no mayor a 2. Con la raíz escogida, cada vértice tendrá un único padre, y nunca más de dos hijos. Si reusamos el requerimiento de la conectividad, permitiendo múltiples componentes conectados en el grafo, llamaremos a esta última estructura un bosque.


Tipos de árboles binarios
Un árbol binario es un árbol con raíz en el que cada nodo tiene como máximo dos hijos.
Un árbol binario lleno es un árbol en el que cada nodo tiene cero o dos hijos.
Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas (vértices con cero hijos) están a la misma profundidad (distancia desde la raíz, también llamada altura)
A veces un árbol binario perfecto es denominado árbol binario completo. Otros definen un árbol binario completo como un árbol binario lleno en el que todas las hojas están a profundidad n o n-1, para alguna n.
Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. En un árbol binario cada nodo puede tener cero, uno o dos hijos (subárboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho.


ARBOL AVL



Arboles balanceados o equilibrados: · Un árbol binario de búsqueda es k-equilibrado si cada nodo lo es. · Un nodo es k-equilibrado si las alturas de sus subárboles izquierdo y derecho difieren en no más de k. Arboles AVL (Adel’son, Vel’skii, Landis) · Un árbol binario de búsqueda 1-equilibrado se llama árbol AVL. Cabe destacar que un árbol AVL no es un Tipo de dato abstracto sino una estructura de datos.


Árbol-B
B-árbol es un árbol de búsqueda que puede estar vacío o aquel cuyos nodos pueden tener varios hijos, existiendo una relación de orden entre ellos, tal como muestra el dibujo .
Un arbol-B de orden M (el máximo número de hijos que puede tener cada nodo) es un arbol que satisface las siguientes propiedades:
Cada nodo tiene como máximo M hijos.
Cada nodo (excepto raiz y hojas) tiene como mínimo M/2 hijos.
La raiz tiene al menos 2 hijos si no es un nodo hoja.
Todos los nodos hoja aparecen al mismo nivel,y no tienen hijos.
Un nodo no hoja con k hijos contiene k-1 elementos almacenados.
Los hijos que cuelgan de la raíz (r1, · · · rm) tienen que cumplir ciertas condiciones :
El primero tiene valor menor que r1.
El segundo tiene valor mayor que r1 y menor que r2 etc.
El último hijo tiene mayor que rm .
Un arbol B es un tipo de estructura de datos de árboles. Representa una colección de datos ordenados de manera que se permite una inserción y borrado eficientes de elementos. Es un índice, multinivel, dinámico, con un límite máximo y mínimo en el número de claves por nodo.

Crear el arbol B
Conserva las caracteristicas de los arboles binarios, AVL, y ABB.
Se busca la calve a insertar.
Si no esta en el arbol se comienza a insertar.
Si Esta llena la pagina:
Se divide la pagina en dos paginas al mismo nivel extrayendo la clave media
Con esta mediana se sube por el camino de busqueda.
Buscar
Clave = EB
Clave <= EB
Clave >= EB
ARBOL B+
Un árbol-B+ es una variación de un árbol-B. En un árbol-B+, en contraste respecto un árbol-B, toda la información se guarda en las hojas. Los nodos internos sólo contienen claves y punteros. Todas las hojas se encuentran en el mismo, más bajo nivel. Los nodos hoja se encuentran unidos entre sí como una lista enlazada para permitir búsqueda secuencial.
El número máximo de claves en un registro es llamado el orden del árbol-B+.
El mínimo número de claves por registro es la mitad del máximo número de claves. Por ejemplo, si el orden de un árbol-B+ es n, cada nodo (exceptuando la raíz) debe tener entre n/2 y n claves.
El número de claves que pueden ser indexadas usando un árbol-B+ está en función del orden del árbol y su altura.
Para un árbol-B+ de orden n, con una altura h:
Número máximo de claves es: nh
Número mínimo de claves es: 2(n / 2)h − 1

CARACTERISTICAS
  • Nodos internos solo contienen las claves o apuntadores.
  • Todas las hojas se encuentran al mismo nivel.
  • Nodos hojas se encuentran ligados como una lista enlazada para permitir la busqueda mas eficiente.
  • El minimo de claves es 2
    OPERACIONES
  • Buscar
  • Insertar
  • Eliminar

PROGRAMA ARBOLES B+

public class BTree {

private BTree izquierda= null;

private BTree derecha= null;

private Object elemento;

public static int LADO_IZDO= 1;

public static int LADO_DRCHO= 2;

public BTree(Object elemento) {

this.elemento = elemento ;

}

public Object getElement() {

return elemento;

}

public BTree getIzquierda() {

return izquierda;

}

public BTree getDerecha() {

return derecha;

}

public void insertar(BTree tree, int lado) throws BTreeException {

if (lado==LADO_IZDO) {

if (izquierda==null) izquierda= tree;

else throw new BTreeException("Ya hay un ?rbol enlazado");

}

else if (lado==LADO_DRCHO) {

if (derecha==null) derecha= tree;

else throw new BTreeException("Ya hay un ?rbol enlazado");

}

else throw new BTreeException("Lado incorrecto");

}

public BTree extraer(int lado) throws BTreeException {

BTree subarbol;if (lado==LADO_IZDO) {

subarbol= izquierda;

izquierda= null;

}

else if (lado==LADO_DRCHO) {

subarbol= derecha;

derecha= null;

}

else

throw new BTreeException("Lado incorrecto");

return subarbol;

}

public void imprimePreOrden() {

System.out.println(elemento);

if (izquierda!=null) izquierda.imprimePreOrden();

if (derecha!=null) derecha.imprimePreOrden();

}

public void imprimePostOrden() {

if (izquierda!=null) izquierda.imprimePostOrden();if (derecha!=null) derecha.imprimePostOrden();System.out.println(elemento); } public void imprimeEnOrden() {if (izquierda!=null) izquierda.imprimeEnOrden();System.out.println(elemento);if (derecha!=null) derecha.imprimeEnOrden(); }}*****************public class BTreeException extends Exception { public BTreeException (String mensaje) {super(mensaje); }}******************public class Trabalenguas { public static void main(String args[]) {BTree trabalenguas, subarbol, temporal;try { trabalenguas= new BTree("Tres"); subarbol= new BTree("tristes"); trabalenguas.insertar(subarbol, BTree.LADO_IZDO); temporal= new BTree("tigres"); trabalenguas.insertar(temporal, BTree.LADO_DRCHO); temporal= new BTree("com?an"); subarbol.insertar(temporal, BTree.LADO_IZDO); temporal= new BTree("trigo"); subarbol.insertar(temporal, BTree.LADO_DRCHO);} catch (BTreeException ex) { System.out.println(ex.getMessage()); return;}trabalenguas.imprimePreOrden();System.out.println("------------------");trabalenguas.imprimeEnOrden();System.out.println("------------------");trabalenguas.imprimePostOrden();System.out.println("------------------");System.out.println("------------------");try { subarbol= trabalenguas.extraer(BTree.LADO_IZDO);} catch (BTreeException ex) { System.out.println(ex.getMessage()); return;}trabalenguas.imprimePreOrden(); }}


COLAS

COLAS

Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO(del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir.
Las colas se utilizan en sistemas informaticos, transportes y operaciones de investigacion (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

CODIGO EN JAVA DE COLAS

public void inserta(Elemento x) {
Nodo Nuevo;
Nuevo=new Nodo(x, null);
if (NodoCabeza==null)
NodoCabeza=Nuevo;
else
NodoFinal.Siguiente=Nuevo;
NodoFinal=Nuevo;
}
public Elemento cabeza()throws IllegalArgumentException {
if (NodoCabeza == null) throw new IllegalArgumentException();
else return NodoCabeza.Info;
}
public Cola(){
// Devuelve una Cola vacía
NodoCabeza=null;
NodoFinal=null;
}

Tipos de Colas

Colas circulares (anillos): en las que el último elemento y el primero están unidos. Colas de prioridad: En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:
Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad.
Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.
Bicolas: son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes: Bicolas de entrada restringida: Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al inicio ó al final.
Bicolas de salida restringida: Son aquellas donde sólo se elimina por el final, aunque se puede insertar al inicio y al final.

martes, 28 de abril de 2009

ESTRUCTURAS NO LINEALES

ARBOLES

Un árbol consiste en un conjunto de nodos y un conjunto de aristas, de forma que se puede distinguir un nodo llamado raíz
· A cada nodo h, excepto la raíz, le llega una arista de otro nodo p (p padre de h, h uno de los hijos de p).
· Para cada nodo hay un camino (secuencia de aristas) único desde la raíz.










Terminología
· Un nodo es externo, si no tiene hijos (es hoja).
· Un nodo es interno, si tiene uno o más hijos.
· Un nodo es ascendiente de otro, si es padre de él o ascendiente de su padre.
· Un nodo es descendiente de otro, si este es ascendiente del primero.
· Los descendientes de un nodo determinan un subárbol en el que ese nodo hace el papel de raíz.

· Existe un orden lineal para todos sus hijos.
· Un árbol binario es un árbol ordenado, en el que cada nodo tiene 0, 1 o 2 hijos (el hijo izquierdo y el derecho).

Un camino de un nodo a otro, es una secuencia de aristas consecutivas que llevan del primero al segundo. Su longitud es el número de aristas que tiene.
La profundidad de un nodo es la longitud del camino de la raíz a ese nodo.
La altura de un árbol es la profundidad del nodo más profundo.

Factor de equilibrio
Cada nodo, además de la información que se pretende almacenar, debe tener los dos punteros a los árboles derecho e izquierdo, igual que los arboles binarios de busqueda (ABB), y además el dato que controla el factor de equilibrio.
El factor de equilibrio es la diferencia entre las alturas del árbol derecho y el izquierdo:
FE = altura subárbol derecho - altura subárbol izquierdo;
Por definición, para un árbol AVL, este valor debe ser -1, 0 ó 1.
Si el factor de equilibrio de un nodo es:
0 -> el nodo está equilibrado y sus subárboles tienen exactamente la misma altura.
1 -> el nodo está equilibrado y su subárbol derecho es un nivel más alto.
-1 -> el nodo está equilibrado y su subárbol izquierdo es un nivel más alto.
Si el factor de equilibrio Fe≥2 o Fe≤-2 es necesario reequilibrar.
Recorrido preorden

Recorrido postorden

Recorridos Preorden: Se recorrido es Raiz - Izquierda - Derecha [*, + , A , B , - , C , D]
Recorridos Inorden: Se recorrido es Izquierda - Raiz - Derecha [A , + , B, * , C , - , D ]
Recorridos Postorden: Su recorrido es Izquierda - Derecha - Raiz [A , B , + , C , D , - , * , ]

Árboles binarios de búsqueda
Un árbol binario de búsqueda es un árbol binario en el que para cada nodo n, todas las claves de los nodos del subárbol izquierdo son menores que la clave de n (o iguales) y todas las del subárbol derecho mayores (o iguales).

Operaciones
· Búsqueda
· Inserción
· Eliminación

EJEMPLO:
Buscamos el “3”:
• 3<4:>2: Subárbol derecho
• 3=3: Elemento encontrado
Inserción
Nos desplazamos dependiendo del resultado de la comparación, cuando lleguemos a una hoja insertamos.
– Si la clave del elemento a insertar coincide con la del nodo raíz el elemento a insertar sustituye al que había.
– Si es menor buscamos en el subárbol izquierdo.
– Si es mayor buscamos en el subárbol derecho.
– Si llegamos a un nodo degenerado .
– Si es menor insertamos a la izquierda.
– Si es mayor insertamos a la derecha.

Eliminación
· Es complicado ya que los nodos internos mantienen al árbol conectado. Para eliminar:
· Si se trata de una hoja se elimina directamente.
· Si tiene un único hijo se elimina el nodo haciendo que su nodo padre pase a referenciar a su nodo hijo.
· Si tiene dos hijos :
· Se sustituye el nodo por el Elimino el 5 (1 hijo).
· Menor elemento de su subárbol derecho.
· Se elimina el nodo correspondiente a dicho menor elemento.