Arboles Enhebrados

ÁRBOLES ENHEBRADOS. • • • • • INTRODUCCIÓN. DEFINICIÓN. EJEMPLOS. IMPLEMENTACIONES. CONCLUSIONES. CONCLUSIONES. INTROD

Views 93 Downloads 2 File size 173KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

  • Author / Uploaded
  • Erika
Citation preview

ÁRBOLES ENHEBRADOS. • • • • •

INTRODUCCIÓN. DEFINICIÓN. EJEMPLOS. IMPLEMENTACIONES. CONCLUSIONES. CONCLUSIONES.

INTRODUCCIÓN • En este tema se tratara de mostrar una mejor implementación de árboles aprovechando ese espacio para mantener un encadenamiento adicional que permita a algunas operaciones propias de los árboles. Moverse con mayor facilidad y tratar de usar menos memoria.

ÁRBOLES ENHEBRADOS (Por la derecha)

• HEBRA: Apuntador a su sucesor (en orden ), en lugar de NULL. A A

B A

C A

INTRODUCCIÓN • En las exposiciones pasadas pudimos observar los códigos de diferentes tipos de árboles, en los cuales a la hora de realizar los recorridos se pierde tiempo y memoria al indicar en el recorrido que un subárbol se encuentra vacío.

DEFINICIÓN: • Se define como el árbol binario que esta tanto a la derecha como a la izquierda. • En otras palabras quiere decir que tienen apuntadores llamados hebras que apuntan a sus sucesores y antecesores respectivamente.

IMPLEMENTACIÓN • Todas las hojas y nodos sin subárbol derecho tienen un apuntador hacia su sucesor en el árbol en su recorrido en orden. • Para distinguir si el apuntador va a un hijo o a un sucesor en orden, se requiere un campo adicional en cada nodo, que indique este hecho.

1

EJEMPLOS :

Implementación de lo anterior.

A A

B D

C F

E

D

E G

struct nodetype { int info; info; struct nodetype *lefth; lefth; struct nodetype *right; right; int rthread; /* campo extra */ rthread;

C

B

H

I

I

H

G

F J

K

L

} Árboles binarios enhebrados por la derecha.

• Rutina para implantar el recorrido en orden de un árbol binario enhebrado por la derecha. intrav3(tree intrav3(tree)) NODEPTR tree; tree; { NODEPTR p, q; p = tree; tree; do{

p = q ->right; right; while( while( q ->rthread && p != NULL) { printf (“%d\ (“%d\n”, pp->info); q = p; p = pp->right; right; } } }while( while( q != NULL); }

typedef struct nodetype *NODEPTR;

q = NULL; While (p != NULL) { q = p; p = pp->left; left; } if (q != NULL) { printf (“%d\ (“%d\n”, q ->info);

Implementación para la creación de un árbol : NODEPTR crea_arbol (x) { int x; NODEPTR p; p = GetNode (); p->info = x; p->left = NULL; p->rigth = NULL; p->rthread = TRUE; return p; }

2

• Setleft (p , x) NODEPTR p; int x; { if (p == NULL) error (“inserción no efectuada”); else if(p ->left != NULL) error (“inserción no válida”); else { q = getnode(); getnode(); q->info = x; p->left = q; q->left = NULL; q->right = p; q->tthread = TRUE; } }

• setright(p, setright(p, x) NODEPTR p; { int x; NODEPTR q, r; if(p == NULL) printf(“inserción printf(“inserción no efectuada”); else if(!p if(!p-->rthread) rthread) printf(“iserción printf(“iserción inválida”); else{ else{ q = GetNode(); GetNode(); q->info = x; r = pp->right; right; p->right = q; p->rightread = FALSE; q->left = NULL; q->right = r; q->rthread = read = TRUE; } }

CONCLUSIONES • Los árboles enhebrados se utilizan para el mejor aprovechamiento de la memoria. • Sus ventajas principales son: • No se requiere el uso de pilas para el recorrido de dichos árboles. • El recorrido en orden puede hacerse de manera iterativa. Por lo tanto no se necesita el uso de la recursividad para realizar los recorridos.

3