Anda di halaman 1dari 17

ARBOLES

Un rbol es una estructura de datos ampliamente usada que imita la forma de un rbol (un conjunto de nodos conectados). CARACTERISTICAS: -Permite almacenar una coleccin de datos -Los datos en un rbol se encuentran organizados jerrquicamente en diferentes niveles -Existe un dato en el nivel ms alto, llamado raz del rbol -ste contiene otros datos los cuales estaran en un nivel ms bajo y seran datos subordinados (hijos) de la raz -Estos datos a su vez pueden contener ms datos, de manera que podemos as construir toda una jerarqua para organizar la informacin -La definicin de rbol es recursiva pues cada hijo de un dato (rbol) es a su vez un rbol

Un nodo es la unidad sobre la que se construye el rbol y puede tener cero o ms nodos hijos conectados a l. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, tambin decimos que b es hijo de a). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo que no tiene hijos se conoce como hoja. Los dems nodos (tienen padre y uno o varios hijos) se les conoce como rama.

DEFINICIN FORMAL DE RBOL Nodos: Elementos (datos) del rbol a) rbol vaco: rbol que no contiene ningn nodo. b) Un solo nodo es un rbol. Es a su vez la raz del rbol. c) Si tenemos un rbol A, y k rboles A1, A2,...,Ak, podemos formar un nuevo rbol, tomando a A como raz del nuevo rbol y a A1, A2,...,Ak, como sus descendientes directos. A1, A2,...,Ak, son los hijos de A, por tanto son hermanos entre s. Hijo: Descendiente directo de un nodo. Hoja: Un nodo que no contiene hijos. (EJEMPLO)

Descripcin. A1, A2, A3, A4 y A5 son hijos de A A21 y A22 son hijos de A2 A51, A52 y A53 son hijos de A5 A511 es hijo de A51 A5111 y A5112 son hijos de A511 A1, A21, A22, A3, A4, A5111, A5112, A52 y A53 son Hojas

Otras Definiciones Orden de los nodos: Los nodos hermanos se ordenan de izquierda a derecha. Si un nodo est a la izquierda de otro, entonces todos sus descendientes estn tambin a la izquierda del otro.

Descripcin. A1 est a la izq de A2 A2 est a la izq de A3 A21 est a la izq de A3

Camino: Un camino es una secuencia de nodos del rbol donde cada nodo es padre del siguiente. Longitud del camino: Cantidad de nodos del camino, menos uno.

Descripcion de Caminos (y su longitud): A , A1 (1) A, A2 (1) A, A2, A22 (2) A5, A51, A511 (2) A, A5, A51, A511, A5111 (4)

Altura de un rbol: Longitud del camino ms largo desde la raz hasta las hojas.

Todos los caminos desde la raz hasta las hojas A , A1 (1) A, A2, A21 (2) A, A2, A22 (2) A, A3 (1) A, A4 (1) A, A5, A51, A511, A5111 (4) A, A5, A51, A511, A5112 (4) A, A5, A52 (2) A, A5, A53 (2) Altura = 4 (mayor)

Algoritmos sobre rboles Por la propia definicin recursiva de rbol, los algoritmos de procesamiento de rboles son tambin recursivos. Recorrido de rboles El recorrido de un rbol es un algoritmo que permite visitar todos los nodos de un rbol. La accin de visitar se refiere al hecho de realizar determinado procesamiento con el nodo en cuestin. Por ejemplo, imprimir su informacin, contarlo, comparar su contenido, etc. Se definen bsicamente tres recorridos sobre rboles: Recorrido en preorden (RPR) Recorrido en orden simtrico (ROS) Recorrido en postorden (RPO)

1) Recorrido de un rbol vaco es vaco 2) Recorrido de una hoja A es: visitar(A) 3) Recorrido de un rbol A, con descendientes A1, A2,...Ak. a) Recorrido en preorden (RPR) RPR(A) = visitar(A), RPR(A1), RPR(A2),...,RPR(Ak) b) Recorrido en orden simtrico (ROS) ROS(A)= ROS(A1), visitar(A), ROS(A2),...,ROS(Ak) c) Recorrido en postorden (RPO) RPO(A)= RPO(A1), RPO(A2),...,RPO(Ak), visitar(A) Lo que vara entre un recorrido y otro es el momento en que se visita la raz del rbol. Los recorridos estn definidos de manera recursiva

Recorrido en preorden (RPR): A, A1, A2, A21, A22, A3, A4, A5, A51, A511, A5111,A5112, A52, A53 Recorrido en orden simtrico (ROS): A1, A, A21, A2, A22, A3, A4, A5111, A511, A5112, A51, A5, A52, A53 Recorrido en post orden (RPO): A1, A21, A22, A2, A3, A4, A5111, A5112, A511, A51, A52, A53, A5, A

rboles Binarios Los nodos slo tienen como mximo dos hijos Se les llama Hijo Izquierdo e Hijo Derecho Para la implementacin es ms conveniente representar explcitamente los dos hijos mediante dos campos (izq y der), en lugar de utilizar la definicin general de rbol la cual est implementada mediante una lista de hijos. A diferencia de los rboles generales, cuando un nodo en un rbol binario tiene un solo hijo, se especifica cual de los dos es: el de la izquierda el de la derecha.

RECORRIDOS 1) Cualquier recorrido de un rbol vaco es vaco 2) Los recorridos de un rbol A (no vaco), con descendientes izq y der, seran: a) Recorrido en preorden (RPR) RPR(A) = visitar(A), RPR(izq), RPR(der) b) Recorrido en orden simtrico (ROS) ROS(A) = ROS(izq), visitar(A), ROS(der) c) Recorrido en postorden (RPO) RPO(A) = RPO(izq), RPO(der), visitar(A) Lo que vara entre un recorrido y otro es el momento en que se visita la raz del rbol. Los recorridos estn definidos de manera recursiva

RPR(A) = A, B, C, D, E, F, G, H, I, J, K ROS(A) = C, B, D, A, H, G, F, I, E, J, K RPO(A) = C, D, B, H, G, I, F, K, J, E, A

rbol kd
En ciencias de la computacin, un rbol kd (abreviatura de rbol k-dimensional) es una estructura de datos de particionado del espacio que organiza los puntos en un Espacio eucldeo de k dimensiones. Los rboles kd son un caso especial de los rboles BSP. Un rbol kd emplea slo planos perpendiculares a uno de los ejes del sistema de coordenadas. Esto difiere de los rboles BSP, donde los planos pueden ser arbitrarios. Adems, todos los nodos de un rbol kd, desde el nodo raz hasta los nodos hoja, almacenan un punto. Mientras tanto, en los rboles BSP son las hojas los nicos nodos que contienen puntos (u otras primitivas geomtricas). Como consecuencia, cada plano debe pasar a travs de uno de los puntos del rbol kd. Tcnicamente, la letra k se refiere al nmero de dimensiones. Un rbol kd tridimensional podra ser llamado un rbol 3d. Sin embargo se suele emplear la expresin "rbol kd tridimensional". (Tambin es ms descriptivo, ya que un rbol tridimensional puede ser varias cosas, pero el trmino rbol kd se refiere a un tipo en concreto de rbol de particionado.)

Construir un rbol k Dado que hay muchas maneras posibles de elegir planos alineados a los ejes, hay muchas maneras de generar rboles kd. El sistema habitual es: Conforme se desciende en el rbol, se emplean ciclos a travs de los ejes para seleccionar los planos. (Por ejemplo, la raz puede tener un plano alineado con el eje x, sus descendientes tendran planos alineados con el y y los nietos del raz alineados con el z, y as sucesivamente) En cada paso, el punto seleccionado para crear el plano de corte ser la mediana de los puntos puestos en el rbol kd, lo que respeta sus coordenadas en el eje que est siendo usado. Este mtodo lleva a un rbol kd balanceado, donde cada nodo hoja est a la misma distancia de la raz. De todas formas, los rboles balanceados no son necesariamente ptimos para todas las aplicaciones.

Aadir elementos a un rbol kd Los nodos se aaden a un rbol kd de la misma forma que se aaden a cualquier otro rbol. Primero, se recorre el rbol empezando por la raz y siguiendo por el nodo de la izquierda o de la derecha dependiendo de si el punto que se quiere insertar est en la derecha o en la izquierda del plano de corte. Una vez que se llega a un nodo hoja, se aade el nuevo punto a la izquierda o a la derecha del nodo hoja, de nuevo dependiendo de en que lado del plano se encuentra el nuevo punto.

Eliminar elementos de un rbol kd Eliminar un punto de un rbol kd sin romper el invariante. (POR HACER)

Cargar un fichero de propiedades en Java En esta entrada voy a explicar cmo cargar un fichero de propiedades de Java. Esta operacin aunque sencilla puede ayudarnos mucho en la separacin de responsabilidades entre las distintas partes de nuestro sistema.

Por ejemplo, si tenemos que mostrar una serie de mensajes por pantalla. En lugar de embeber los mensajes dentro del cdigo Java escribiremos dichos mensajes en un fichero .properties asociados cada uno a una clave. Si en un futuro queremos cambiar los mensajes, podemos simplemente cambiar el fichero de propiedades sin tener la necesidad de cambiar el cdigo fuente y volver a compilar la clase donde estuvieran.

En primer lugar vamos a hablar de la localizacin de los ficheros de propiedades. Los ficheros de propiedades deben guardarse en los paquetes Java, junto a las clases. Aunque podemos crear un paquete especfico para dicho fichero. Supongamos a partir de ahora que hemos creado el fichero de propiedades en el paquete: org.tutorialexception Supongamos que nuestro fichero de propiedades tiene como nombre mensajes.properties y cuyo contenido es el siguiente:

#Mensajes saludo=Hola sujeto=amigo

Pues bien, podemos cargar y utilizar el fichero de propiedades de la siguiente forma:

package org.tutorialexception;

import java.io.IOException; import java.util.Properties;

public class Main { public static void main(String[] args) { Properties info = new Properties(); try { info.load(Main.class.getResourceAsStream("/org/tutorialexception/mensajes.properties")); String saludo = info.getProperty("saludo"); String sujeto = info.getProperty("sujeto"); System.out.println(saludo + " " + sujeto); } catch (IOException ex) { System.out.println(ex); } } }

Esta clase debe guardarse en el mismo sitio que el fichero de propiedades. Si ejecutamos tenemos que obtener la siguiente salida:
Hola amigo

Si cambiamos los valores de 'saludo' y 'sujeto' por #Mensajes saludo=Hi sujeto=friend

y volvemos a ejecutar (sin compilar) la clase Main veremos que el resultado cambia: Hi friend
Nota 1: Puede verse que la llamada a getResourceAsStream se a hecho especificando la ruta completa del paquete empezando por '/' (ruta absoluta). Si consultamos la API del mtodo podemos ver que si la ruta empieza por la barra ('/') la ruta se trata como a bsoluta y tenemos que poner todo el paquete. Si por el contrario no ponemos la barra, se trata como ruta relativa a partir de la clase. Por este motivo, puesto que el fichero de propiedades est situado en el mismo paquete que la clase Main, podramos haber escrito: info.load(Main.class .getResourceAsStream("mensajes.properties")); Nota 2: La llamada a info.getProperty puede hacerse pasando un segundo argumento adicional que representa un valor por defecto en el caso de no encontrar la clave especificada. Esto puede llegar a resultar muy til sobre todo cuando existen multitud de claves, ya que puede darse el caso de que nos olvidemos escribir alguna. En nuestro ejemplo podramos haber escrito: String saludo = info.getProperty("saludo", "Hola"); String sujeto = info.getProperty("sujeto", "humano"); Con estas dos observaciones, nuestro programa mejorado quedara:

package org.tutorialexception; import java.io.IOException; import java.util.Properties;

public class Main { public static void main(String[] args) { Properties info = new Properties(); try { info.load(Main.class.getResourceAsStream( "mensajes.properties" )); String saludo = info.getProperty("saludo", "Hola"); String sujeto = info.getProperty("sujeto", "humano"); System.out.println(saludo + " " + sujeto); } catch (IOException ex) { System.out.println(ex);}}}