Sunteți pe pagina 1din 3

ÁRBOLES ENHEBRADOS.

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

INTRODUCCIÓN DEFINICIÓN:
• En este tema se tratara de mostrar una
• Se define como el árbol binario que
mejor implementación de árboles
esta tanto a la derecha como a la
aprovechando ese espacio para
izquierda.
mantener un encadenamiento adicional
que permita a algunas operaciones • En otras palabras quiere decir que
propias de los árboles. Moverse con tienen apuntadores llamados hebras
mayor facilidad y tratar de usar menos que apuntan a sus sucesores y
memoria. antecesores respectivamente.

ÁRBOLES ENHEBRADOS IMPLEMENTACIÓN


(Por la derecha)
• Todas las hojas y nodos sin subárbol
derecho tienen un apuntador hacia su
• HEBRA: Apuntador a su sucesor (en orden ), en
lugar de NULL. sucesor en el árbol en su recorrido en
A
A
orden.
• Para distinguir si el apuntador va a un
B
A
hijo o a un sucesor en orden, se
C
A requiere un campo adicional en cada
nodo, que indique este hecho.

1
EJEMPLOS :
A Implementación de lo anterior.
A
B

B C struct nodetype {
D
C int info;
info;
E F
D
E F G H struct nodetype *lefth;
lefth;
G H I
I J K L
struct nodetype *right;
right;
int rthread;
rthread; /* campo extra */
}

Árboles binarios enhebrados por la derecha. typedef struct nodetype *NODEPTR;

• Rutina para implantar el recorrido en orden de q = NULL;


un árbol binario enhebrado por la derecha. While (p != NULL)
{
intrav3(tree
intrav3(tree))
q = p;
NODEPTR tree; tree;
{ p = p-
p->left;
left;
NODEPTR p, q; }
p = tree;
tree; if (q != NULL)
do{ {
printf (“%d\
(“%d\n”, q ->info);

p = q ->right;
right; Implementación para la creación de un árbol :
while(
while( q ->rthread && p != NULL)
NODEPTR crea_arbol (x)
{ {
printf (“%d\
(“%d\n”, p-
p->info); int x;
NODEPTR p;
q = p; p = GetNode ();
p = p-
p->right;
right; p->info = x;
} p->left = NULL;
p->rigth = NULL;
} p->rthread = TRUE;
}while(
while( q != NULL); return p;
} }

2
• setright(p,
setright(p, x)
• Setleft (p , x) NODEPTR p;
NODEPTR p; {
int x; int x;
{ NODEPTR q, r;
if (p == NULL) if(p == NULL)
error (“inserción no efectuada”); printf(“inserción
printf(“inserción no efectuada”);
else else if(!p
if(!p-->rthread)
rthread)
if(p ->left != NULL) printf(“iserción
printf(“iserción inválida”);
error (“inserción no válida”); else{
else{
else q = GetNode();
GetNode();
{ q->info = x;
q = getnode();
getnode(); r = p-
p->right;
right;
q->info = x; p->right = q;
p->left = q; p->rightread = FALSE;
q->left = NULL; q->left = NULL;
q->right = p; q->right = r;
q->tthread = TRUE; 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.

S-ar putea să vă placă și