Professional Documents
Culture Documents
rboles Binarios
Introduccin
!! Los rboles binarios son estructuras de almacenamiento fundamentales para la programacin !! Combina las ventajas de de un arreglo ordenado y de una lista enlazada:
!! Bsqueda rpida !! Insercin y eliminacin rpida
Insercin
Eliminacin
rboles Binarios
qu es un rbol ?
!! Un rbol consiste en la conexin de nodos (nodes) a travs de aristas (edges). !! Los rboles son casos especiales de una estructura ms general llamada grafo, que revisaremos ms adelante. !! Los nodos representan normalmente entidades (personas, autos, reservaciones, etc.) !! Las aristas representan la forma en que los nodos estn relacionados. !! Las aristas son referencias y sirven para llegar de uno nodo a otro. !! Hay normalmente un nodo principal en la parte superior del rbol, el cual se conecta a otros nodos del nivel siguiente. !! Hay diferentes tipos de rboles: binarios y mltiples.
nodo principal arista
rbol no-binario
nodo
rboles Binarios
!! !! Ruta: es el camino de un nodo a otro. Raz : nodo (nico) ubicado en la parte superior del rbol. Existe slo un camino entre la raz y cualquier otro nodo. Padre: es un nodo superior de otro nodo conectado por una arista. Hijo : es un nodo inferior a otro nodo conectado por una arista. Hoja : Es un nodo que no tiene hijos. Sub-rbol : cualquier nodo puede considerarse como la raz de un subrbol. Visitar : Un nodo es visitado cuando cuando el control del programa llega al nodo, para ejecutar una operacin. (slo asar por el nodo, no es visitar). Atravesar : Atravesar significa visitar todos los nodos en un cierto orden. Niveles : Es el nmero de generaciones desde la raz. Clave (Key) : Es el valor de un nodo que permite buscar y ejecutar operaciones.
B es padre de D y E
Terminologa
raiz
!! !! !! !!
A
ruta
Nivel 0
B
D es el hijo izquierdo de B
E es el hijo derecho de B
Nivel 1
!!
Nivel 2
!! !! !!
Nivel 3
rboles Binarios
rboles Binarios
!! Cada nodo puede tener mximo dos nodos hijo (hijo izquierdo, hijo derecho). !! En un rbol de Bsqueda Binario: el nodo padre es siempre mayor que su hijo de la izquierda y mayor o igual a su hijo de la derecha.
30 53
72
14
39
61
84
23
34
47
79
rboles Binarios
applet
rboles Binarios
rboles Desbalanceados
53
!! Algunos rboles son generados en forma desbalanceada: tienen la mayor parte de sus nodos en un de los lados de la raz.
72
30
!! El desbalanceo se origina a travs del orden en que son insertados los elementos.
!! Aleatorio : ms o menos balanceado. !! Ascendente : hacia la derecha. !! Descendente: hacia la izquierda.
14
39
61
23
34
47
rboles Binarios
!! La ms comn es almacenar los nodos como posiciones independientes en memoria y luego conectarlas usando referencias.
rboles Binarios
!! Tambin necesitamos una clase para el rbol. !! Tree contiene todos los nodos. !! Tree contiene una sola variable, el nodo raz (root). !! No necesita campos para otros nodos, ya que estos son accedidos a travs de la 2013 - Patricio Galeas raz.
rboles Binarios
rboles Binarios
Simulacin de un rbol
applet
rboles Binarios
Encontrando un Nodo
!! La variable current contiene el nodo actualmente examinado. !! key es el valor buscado. !! La rutina parte en el nodo root. !! Compara key con current.iData
!! key < current.iData : se va por la izquierda !! Key > current.iData : se va por la derecha. !! Si no encuentra nada, retorna Null.
rboles Binarios
Insertando un Nodo
!! La idea es buscar el padre del nodo que queremos insertar, y luego conectarlo, segn su valor a su izquierda o derecha. !! Parte creando un nuevo nodo con los datos de los argumentos. !! Luego utiliza cdigo similar al de find(), para encontrar la posicin del nuevo nodo e insertarlo. !! Se usa parent como referencia para hacer la conexin, ya que current queda en Null cuando se encuentra la posicin final del nuevo nodo.
rboles Binarios
Recorriendo el rbol
!! El recorrer (traversing) rboles significa visitar los nodos de un rbol en un orden determinado. !! Esta operacin no es tan comn como: find(), insert() o delete() y adems es ms lenta. !! Recorrer un rbol es tericamente interesante y muy til en algunas circunstancias. !! Hay 3 formas de recorrer un rbol:
!! Pre-Orden !! In-Orden !! Post-Orden
rboles Binarios
Recorriendo el rbol
In-Orden
!! Si es un rbol de bsqueda binario. los nodos son visitados en orden ascendente.
!! La manera ms fcil es recursivamente. La cual parte en el nodo raz. !! El mtodo slo hace tres cosas:
!! Se llama a si mismo para recorrer el sub-rbol izquierdo. !! Visita el nodo. !! Se llama a si mismo para recorrer el sub-rbol derecho.
!! Parte con el nodo raz, y se llama recursivamente hasta que no queden ms nodos por recorrer. !! Revisemos Trav en el Applet applet
2013 - Patricio Galeas
rboles Binarios
Recorriendo el rbol
*
A
!! Este tipo de recorrido es til para analizar expresiones algebraicas. !! Un rbol binario (no necesariamente de bsqueda) sirve para representar expresiones algebraicas. !! Recorriendo el rbol en In-Orden generar la expresin en Infix correcta. Slo hay que agregar los parntesis. !! Para Pre- y Post-orden se usan los mismo pasos que en InOrden, slo la secuencia es diferente. !! Para Pre-Orden:
!! Visitar el nodo. !! Se llama a si mismo para recorrer el sub-rbol izquierdo. !! Se llama a si mismo para recorrer el sub-rbol derecho.
+
B C
!! Para Post-Orden:
!! Se llama a si mismo para recorrer el sub-rbol izquierdo. !! Se llama a si mismo para recorrer el sub-rbol derecho. !! Visitar el nodo.
rboles Binarios
63 47 53 33 50 60 67 71
11
17
49
51
rboles Binarios
Eliminando un nodo
!! Eliminar un nodo es la operacin ms compleja en rboles de bsqueda binarios. !! Se parte buscando el nodo que se desea eliminar: find().
63
47 53 50 60 67
71
17
49
51
rboles Binarios
Eliminando un nodo
CASO 1 : El nodo a eliminar es una hoja
!! Una vez encontrado el nodo a eliminar, simplemente se cambia en el padre el valor del hijo a correspondiente a Null. !! El nodo seguir existiendo, pero no ser ms parte del rbol. Y ser removido automticamente de la memoria (garbage collection). !! Revisemos como funciona en el applet.
applet
2013 - Patricio Galeas
10
10
5 Null
3 antes
3 despus
rboles Binarios
Eliminando un nodo
CASO 1 : El nodo a eliminar es una hoja
!! La primera parte del cdigo para eliminar es similar a find() e insert().
rboles Binarios
Eliminando un nodo
CASO 1 : El nodo a eliminar es una hoja
!! Despus de encontrar al nodo !! Hay que verificar el caso de que no tenga hijos. !! Si no tiene hijos, se verifica el caso especial de la raz.
rboles Binarios
Eliminando un nodo
CASO 2 : El nodo a eliminar tiene un hijo
!! Este caso tampoco es muy complicado !! El nodo tiene slo dos conexiones:
!! Una con su padre !! Una con su nico hijo
48 71 48 63 52 80 80 52
a borrar
63
67
67
despus
applet
2013 - Patricio Galeas
rboles Binarios
Eliminando un nodo
CASO 2 : El nodo a eliminar tiene un hijo
!! Esta situacin se maneja con 4 variaciones:
!! El hijo del nodo a ser borrado puede ser izquierdo o derecho !! El nodo a ser borrado, puede ser hijo izquierdo o derecho de su padre.
!! Tambin incluye el caso especial en que el nodo a eliminar es el raz. !! Gracias a las referencias, el mover un sub-rbol a otra posicin es relativamente simple.
2013 - Patricio Galeas
rboles Binarios
Eliminando un nodo
CASO 3 : El nodo a eliminar tiene dos hijos
!! Por que no simplemente reemplazar por uno de sus hijos? !! Por ejemplo: reemplazar por el hijo derecho. !! Que hacemos entonces con el nodo 30 ? no nos sirve el reemplazo !
! La buena noticia: ! Existe un truco para resolver el problema. ! La mala noticia: ! Este truco involucra una serie de casos especiales.
rboles Binarios
Eliminando un nodo
CASO 3 : El nodo a eliminar tiene dos hijos
!! TRUCO: Para eliminar a un nodo con dos hijos, reemplazar el nodo con su sucesor (in-orden).
! Los nodos permanecen en orden. ! El reemplazo es simple en el caso de que el sucesor no tenga hijos. ! Cmo encontrar al sucesor algortmicamente?
rboles Binarios
Eliminando un nodo
CASO 3 : El nodo a eliminar tiene dos hijos
Para encontrar el sucesor algortmicamente: Ir al nodo hijo derecho, y luego elegir siempre al nodo de la izquierda, hasta llegar al ltimo nodo de la izquierda, el cual es su sucesor.
larger than the node. Then it goes to this right childs left child this left childs left child, and so on, following down the path of last left child in this path is the successor of the original node, a 8.17.
To find successor of this node 38 Go to right child
26
Go to left child
72
90
92
En realidad, estamos buscando al menor de los nodos mayores que el nodo a eliminar.
2013 - Patricio Galeas
No left child
43
74
FIGURE 8.17
rboles Binarios
Eliminando un nodo
CASO 3 : El nodo a eliminar tiene dos hijos
!! Si el sucesor es el hijo derecho del nodo a borrar. Es decir, el hijo derecho del nodo a borrar no tiene hijos izquierdos. !! Entonces, habra que mover el subrbol donde el sucesor es raiz, a la posicin del nodo eliminado. !! Esta operacin requiere 2 pasos:
1.! Desconectar de su padre el nodo a borrar (current), y apuntar esta conexin del padre directamente con el sucesor. 2.! Desconectar el hijo izquierdo del nodo a borrar y conectar este hijo como hijo izquierdo del sucesor.
2013 - Patricio Galeas
rboles Binarios
Eliminando un nodo
CASO 3 : El nodo a eliminar tiene dos hijos
!! Si el sucesor es un descendiente izquierdo del hijo derecho del nodo a eliminar. Es decir, el hijo derecho del nodo a eliminar tiene hijos izquierdos. !! Esta operacin requiere 4 pasos:
1.! Conectar el hijo derecho del sucesor como hijo izquierdo del padre del sucesor. 2.! Conectar el hijo derecho del nodo a eliminar como el hijo derecho del sucesor. 3.! Desconectar el nodo a eliminar de la posicin de hijo derecho de su padre y colocar al sucesor en su posicin. 4.! Desconectar el hijo izquierdo del nodo a eliminar y conectarlo como hijo izquierdo de sucesor.
2013 - Patricio Galeas
rboles Binarios
Eliminando un nodo
!! No es trivial !
!! Algunos programadores simplemente agregan una variable booleana a la clase Nodo para definir si el no fuel eliminado. !! Cul podra ser la desventaja?
2013 - Patricio Galeas
rboles Binarios
N = 2L !1 N +1 = 2L L = log 2 ( N + 1)
Es decir, el orden para ejecutar operaciones en un rbol binario es : O(logN)
2013 - Patricio Galeas
rboles Binarios
rboles Binarios
Valores duplicados
!! Al igual que en otras estructuras, el manejo de valores duplicados debe ser considerada. !! Por ejemplo en el Applet, el ingreso de un nodo con un valor duplicado es insertado a la derecha de su gemelo. !! find(), debe ser modificado para chequear tems adicionales. !! Si quiero prohibir valores duplicados, debo modoficar el mtodo insert().
2013 - Patricio Galeas
rboles Binarios
Resumen
!! Los rboles son nodos conectados a travs de aristas. !! El raz, es el nodo superior del rbol y no tiene padres. !! En un rbol de bsqueda binario, todos los nodos que son descendientes izquierdos de un nodo A, tienen valor menores que A; y todos los nodos que son descendientes derechos de A tienen valores mayores que A.
!! Los rboles ejecutan bsquedas, inserciones y eliminaciones en tiempo O(log N). !! Los nodos representan los objetos de informacin que estn almacenados en el rbol. !! Las aristas son representadas comnmente en un programa como referencias a los hijos de un nodo ( y a veces a su padre). !! Recorrer un rbol significa visitar todos los nodos en un orden determinado. !! Los recorridos ms simples son: pre-orden, in-orden, y post-orden. !! Un rbol desbalanceado es aquel donde la raz tiene tiene muchos mas descendientes al lado izquierdo que el derecho, o viceversa. !! Buscar un nodo involucra comparar el valor buscado con los valores de cada nodo, yendo por su hijo izquierdo si el valor es menor y por el lado derecho si el valor es mayor.
rboles Binarios
Resumen
!! La insercin involucra primero encontrar el lugar donde insertar el nuevo nodo, y luego cambiar sus referencias a los hijos. !! En el recorrido in-orden los valores se visitan en orden ascendente. !! Pre-Orden y Post-Orden son tiles para evaluar evaluar expresiones algebraicas. !! Cuando un nodo no tiene hijos, este puede ser eliminado simplemente definiendo la conexin con su padre como Null. !! Cuando un nodo tiene 1 hijo, puede ser eliminado conectando la referencia del hijo de su padre con su hijo. !! Cuando un nodo tiene 2 hijos, reemplazando a este con su sucesor. !! El sucesor de un nodo A puede ser encontrado buscando el mnimo nodo en el sub-rbol del hijo derecho de A. !! En la eliminacin de un nodo con 2 hijos, afloran varias situaciones distintas, dependiendo si el sucesor es el hijo derecho del nodo a ser eliminado o uno de los descendientes de su hijo izquierdo. !! Los rboles tambin pueden ser representados en la memoria del computador como arreglos. !! Los nodos con valores duplicados pueden causar algunos problemas en arreglos, por que slo el primer elemento puede ser encontrado
rboles Binarios
Experimentos
!! Use el applet del rbol binario y cree 20 arboles . qu porcentaje de estos rboles es desbalanceado? !! Cree un diagrama UML de las distintas posibilidades cuando se elimina un nodo en un rbol binario. Esto debe considerar los tres casos, con ambos hijos (derecho e izquierdo) y el caso especial de la eliminacin de la raz. !! Utilice el applet para verificar el borrado de nodos en todas los casos posibles descritos.