Árboles Hilvanados<br />
Existe un problema con los arboles binarios….<br />El recorrido con recursivo de los árboles resulta costoso, ya que impli...
Es posible recorrer los árboles de manera iterativa, en lugar de recursiva, pero para esto ocupamos una estructura de tipo...
¿Cuál es la solución?<br />Árboles Hilvanados<br />
Un árbol hilvanado utiliza los punteros nulos  para poder conseguir ciertas ventajas.<br />A esos punteros nulos, los llam...
Definición<br />Es un árbol binario en el que cada hijo izquierdo de valor nulo es sustituido por un enlace  al nodo que l...
Nodo tipo para árbol hilvanado por la derecha…<br />struct nodo {<br />		int info;<br />		struct nodo *left;<br />		struct...
Construcción de los hilos<br />Un NULL en un enlace derecho de un nodo p se reemplaza por un puntero al nodo que se visita...
Recorrer un árbol hilvanado a la derecha<br />Iniciamos en el nodo más a la izquierda del árbol, lo procesamos, y seguimos...
Ejemplo<br />Salida<br />1<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Iniciamos en el nodo más ...
Ejemplo<br />Salida<br />1<br />3<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el hilo a...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Segu...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br ...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />11<br />6<br />8<br />3<br />7<br />5<br />11<br...
Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />11<br />13<br />6<br />8<br />3<br />7<br />5<br...
Node leftMost(Node n) {<br />    Node ans = n;<br />    if (ans == null) {<br />         return null;<br />    }<br />    ...
Que modificación le podemos hacer a este árbol??<br />Todavía estamos desperdiciando punteros, la mitad de nuestros punter...
Arbol Hilvanado a la derecha y a la izquierda.<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />
Ventajas<br />Mejorar el aprovechamiento de la memoria.<br />Los hilos evitan el uso de recursividad y de pilas.<br />Reco...
Desventajas<br />Espacio extra en memoria para identificar los hilos.<br />Inserciones y eliminaciones menos eficientes y ...
Próxima SlideShare
Cargando en…5
×

Arboles parte 2

1.353 visualizaciones

Publicado el

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
1.353
En SlideShare
0
De insertados
0
Número de insertados
7
Acciones
Compartido
0
Descargas
26
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Arboles parte 2

  1. 1. Árboles Hilvanados<br />
  2. 2. Existe un problema con los arboles binarios….<br />El recorrido con recursivo de los árboles resulta costoso, ya que implica un gasto adicional:<br />Memoria<br />Tiempo de ejecución<br />Esto puede provocar, en el caso de un árbol muy grande, que el stack del sistema se desborde rápidamente.<br />
  3. 3. Es posible recorrer los árboles de manera iterativa, en lugar de recursiva, pero para esto ocupamos una estructura de tipo PILA.<br />En un árbol binario hay más punteros NULL que punteros a nodos.<br />
  4. 4. ¿Cuál es la solución?<br />Árboles Hilvanados<br />
  5. 5. Un árbol hilvanado utiliza los punteros nulos para poder conseguir ciertas ventajas.<br />A esos punteros nulos, los llamaremos HEBRAS o HILOS, para diferenciarlos de los punteros no nulos.<br />Existen varias formas de enhebrado. Veremos el entreorden. (De hecho, la definición de árbol hilvanado que veremos, estará basada en este tipo de recorrido)<br />
  6. 6. Definición<br />Es un árbol binario en el que cada hijo izquierdo de valor nulo es sustituido por un enlace al nodo que le antecede en entreorden (excepto el primer nodo) …. Esto es un árbol hilvanado por la izquierda.<br />Es un árbol binario en el que cada hijo derecho de valor nulo es sustituido por un enlace al nodo que le sigue en el recorrido en entreorden (excepto el último nodo) …. Esto es un árbol hilvanado por la derecha.<br />
  7. 7. Nodo tipo para árbol hilvanado por la derecha…<br />struct nodo {<br /> int info;<br /> struct nodo *left;<br /> struct nodo *right;<br /> int rthread; //1 – Es Hilo, 0 – no Hilo<br />}<br />
  8. 8. Construcción de los hilos<br />Un NULL en un enlace derecho de un nodo p se reemplaza por un puntero al nodo que se visitaría después de p en un recorrido en entreorden. (sucesor)<br />Un NULL en un enlace izquierdo de un nodo p se reemplaza por un puntero al nodo que se visitaría antes de p en un recorrido en entreorden. (predecesor)<br />
  9. 9. Recorrer un árbol hilvanado a la derecha<br />Iniciamos en el nodo más a la izquierda del árbol, lo procesamos, y seguimos hacia su hilo derecho.<br />Si seguimos hacia el hilo derecho, procesamos el nodo y continuamos hacia el vinculo a su derecha.<br />Si seguimos a un vinculo a la derecha, nos movemos hacia el nodo más hacia la izquierda, procesamos el nodo y continuamos con la lógica.<br />
  10. 10. Ejemplo<br />Salida<br />1<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Iniciamos en el nodo más a la izquierda, y lo procesamos<br />
  11. 11. Ejemplo<br />Salida<br />1<br />3<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el hilo a la derecha, procesamos el nodo.<br />
  12. 12. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.<br />
  13. 13. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el hilo a la derecha, procesamos el nodo.<br />
  14. 14. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.<br />
  15. 15. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el hilo a la derecha, procesamos el nodo.<br />
  16. 16. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.<br />
  17. 17. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />11<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el hilo a la derecha, procesamos el nodo.<br />
  18. 18. Ejemplo<br />Salida<br />1<br />3<br />5<br />6<br />7<br />8<br />9<br />11<br />13<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.<br />
  19. 19. Node leftMost(Node n) {<br /> Node ans = n;<br /> if (ans == null) {<br /> return null;<br /> }<br /> while (ans.left != null) {<br /> ans = ans.left;<br /> }<br /> return ans;<br />}<br />void inOrder(Node n) {<br /> Node cur = leftmost(n);<br /> while (cur != null) {<br /> print(cur);<br /> if (cur. rthread == 1){<br /> cur = cur.right;<br /> } else {<br /> cur = leftmost(cur.right);<br /> }<br /> }<br />}<br />
  20. 20. Que modificación le podemos hacer a este árbol??<br />Todavía estamos desperdiciando punteros, la mitad de nuestros punteros hoja siguen siendo nulos.<br />Podemos agregar hilos a los nodos previos en un recorrido entreorden, lo cual nos va a permitir hacer recorridos hacia atras o incluso hacer recorridos en postorden.<br />
  21. 21. Arbol Hilvanado a la derecha y a la izquierda.<br />6<br />8<br />3<br />7<br />5<br />11<br />1<br />13<br />9<br />
  22. 22. Ventajas<br />Mejorar el aprovechamiento de la memoria.<br />Los hilos evitan el uso de recursividad y de pilas.<br />Recorrido entreorden más rápido.<br />Determinación del predecesor y sucesor entreorden muy simple y eficiente.<br />Mediante otro tipo de hilvanado se pueden conseguir los mismos resultados para otros recorridos.<br />
  23. 23. Desventajas<br />Espacio extra en memoria para identificar los hilos.<br />Inserciones y eliminaciones menos eficientes y un poco más complejas.<br />

×