SlideShare una empresa de Scribd logo
1 de 23
Árboles Hilvanados
Existe un problema con los arboles binarios…. El recorrido con recursivo de los árboles resulta costoso, ya que implica un gasto adicional: Memoria Tiempo de ejecución Esto puede provocar, en el caso de un árbol muy grande, que el stack del sistema se desborde rápidamente.
Es posible recorrer los árboles de manera iterativa, en lugar de recursiva, pero para esto ocupamos una estructura de tipo PILA. En un árbol binario hay más punteros NULL que punteros a nodos.
¿Cuál es la solución? Árboles Hilvanados
Un árbol hilvanado utiliza los punteros nulos  para poder conseguir ciertas ventajas. A esos punteros nulos, los llamaremos HEBRAS o HILOS, para diferenciarlos de los punteros no nulos. 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)
Definición 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. 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.
Nodo tipo para árbol hilvanado por la derecha… struct nodo { 		int info; 		struct nodo *left; 		struct nodo *right; 		int  rthread; 	//1 – Es Hilo, 0 – no Hilo }
Construcción de los hilos 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) 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)
Recorrer un árbol hilvanado a la derecha Iniciamos en el nodo más a la izquierda del árbol, lo procesamos, y seguimos hacia su hilo derecho. Si seguimos hacia el hilo derecho, procesamos el nodo y continuamos hacia el vinculo a su derecha. 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.
Ejemplo Salida 1 6 8 3 7 5 11 1 13 9 Iniciamos en el nodo más a la izquierda, y lo procesamos
Ejemplo Salida 1 3 6 8 3 7 5 11 1 13 9 Seguimos el hilo a la derecha, procesamos el nodo.
Ejemplo Salida 1 3 5 6 8 3 7 5 11 1 13 9 Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.
Ejemplo Salida 1 3 5 6 6 8 3 7 5 11 1 13 9 Seguimos el hilo a la derecha, procesamos el nodo.
Ejemplo Salida 1 3 5 6 7 6 8 3 7 5 11 1 13 9 Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.
Ejemplo Salida 1 3 5 6 7 8 6 8 3 7 5 11 1 13 9 Seguimos el hilo a la derecha, procesamos el nodo.
Ejemplo Salida 1 3 5 6 7 8 9 6 8 3 7 5 11 1 13 9 Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.
Ejemplo Salida 1 3 5 6 7 8 9 11 6 8 3 7 5 11 1 13 9 Seguimos el hilo a la derecha, procesamos el nodo.
Ejemplo Salida 1 3 5 6 7 8 9 11 13 6 8 3 7 5 11 1 13 9 Seguimos el vinculo a la derecha, nos movemos al nodo más a la izquierda y lo procesamos.
Node leftMost(Node n) {     Node ans = n;     if (ans == null) {          return null;     }     while (ans.left != null) {         ans = ans.left;     }     return ans; } void inOrder(Node n) {     Node cur = leftmost(n);     while (cur != null) {         print(cur);         if (cur. rthread == 1){             cur = cur.right;         } else {             cur = leftmost(cur.right);         }     } }
Que modificación le podemos hacer a este árbol?? Todavía estamos desperdiciando punteros, la mitad de nuestros punteros hoja siguen siendo nulos. 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.
Arbol Hilvanado a la derecha y a la izquierda. 6 8 3 7 5 11 1 13 9
Ventajas Mejorar el aprovechamiento de la memoria. Los hilos evitan el uso de recursividad y de pilas. Recorrido entreorden más rápido. Determinación del predecesor y sucesor entreorden muy simple y eficiente. Mediante otro tipo de hilvanado se pueden conseguir los mismos resultados para otros recorridos.
Desventajas Espacio extra en memoria para identificar los hilos. Inserciones y eliminaciones menos eficientes y un poco más complejas.

Más contenido relacionado

Similar a Arboles parte 2

Similar a Arboles parte 2 (20)

Estructura de dato unidad 4
Estructura de dato unidad 4Estructura de dato unidad 4
Estructura de dato unidad 4
 
Unidad cuatro estructura de datos
Unidad cuatro estructura de datosUnidad cuatro estructura de datos
Unidad cuatro estructura de datos
 
Arboles
ArbolesArboles
Arboles
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Arboles binarios
Arboles binariosArboles binarios
Arboles binarios
 
Algoritmo Heap Sort
Algoritmo Heap SortAlgoritmo Heap Sort
Algoritmo Heap Sort
 
Presentacion Algoritmo heapsort
Presentacion Algoritmo heapsortPresentacion Algoritmo heapsort
Presentacion Algoritmo heapsort
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 
Arboles presentacion
Arboles presentacionArboles presentacion
Arboles presentacion
 
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
 
04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles04 curso-prope-py ed-arboles
04 curso-prope-py ed-arboles
 
Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Arboles ej
Arboles ejArboles ej
Arboles ej
 
Estructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no LinealesEstructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no Lineales
 
Arboles
Arboles Arboles
Arboles
 
Iv unidad estructuras no lineales
Iv unidad estructuras no linealesIv unidad estructuras no lineales
Iv unidad estructuras no lineales
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
Heap sort
Heap sortHeap sort
Heap sort
 
Heapsort
HeapsortHeapsort
Heapsort
 

Arboles parte 2

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