Академический Документы
Профессиональный Документы
Культура Документы
UNIDAD VI
____________________________________________________________________________________________________
UNIDAD VI
RBOLES BINARIOS
6.1. REPRESENTACIN DE RBOLES BINARIOS
6.1.1. TERMINOLOGA DE RBOLES BINARIOS
Las estructuras dinmicas lineales de datos( listas enlazadas, pilas, colas) tienen grandes ventajas
de flexibilidad sobre las representaciones contiguas, pero tienen un problema son listas secuenciales, es
decir, que por la forma en la que estn dispuestas es necesario moverse un elemento a la vez debido a que
cada elemento tiene un siguiente elemento, esta linealidad es tpica de cadenas, de elementos que pertenecen
a una sola dimensin: campos en un registro, entradas en una pila, entradas en una cola y nodos en una lista
enlazada simple. En esta parte se mostraran las estructuras de datos no lineales conocidos como rboles,
adicionalmente podremos decir que no es el nico tipo de estructura no lineal pues a parte de los rboles
existen los grafos la cual tiene aplicaciones muy diversas en las ciencias.
6.1.2. IMPLEMENTACION DE UN ARBOL BINARIO
Un rbol binario es un conjunto finito de elementos que est vaco, o est dividido en tres
subconjuntos desarticulados. El primer subconjunto contiene un solo elemento llamado raz del rbol. Los
otros dos son en s mismos, rboles binarios, llamados subrboles izquierdo y derecho del rbol original.
Un subrbol izquierdo o derecho puede estar vaco. Cada elemento de un subrbol se llama nodo del rbol.
En la siguiente figura se muestra un rbol binario. Este rbol consiste en nueve nodos y tiene A
como raz. Su subrbol izquierdo tiene a B como raz y su subrbol derecho a C.
A
La siguiente figura muestra estructuras de rboles que no son binarios. De tal modo que, si A es la
raz de un rbol binario y B es la raz de su subrbol derecho o izquierdo entonces A se llama el padre de
B, y B el hijo izquierdo o derecho de A. Un nodo que no tiene hijos se llama hoja. El nivel de un nodo
en un rbol binario se define como sigue. La raz del rbol tiene nivel 0 (cero) y el nivel de cualquier otro
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
80
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
nodo del rbol es uno ms que el nivel de su padre. Un rbol binario de completo de profundidad D es el
rbol estrictamente binario cuyas hojas estn en el nivel D. En la siguiente figura se muestra un rbol de
profundidad 3.
A
81
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
(true) s nd es hijo izquierdo o derecho, respectivamente, de algn otro nodo del rbol, y falso (false) en
caso contrario.
q = father(p);
if(q == null)
return(false);
if(left (q) == p)
return(true);
return(false);
82
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
Para visitar un rbol binario lleno de orden, se ejecutan las siguientes tres operaciones:
1. Recorrer el subrbol izquierdo en orden.
2. Visitar la raz.
3. Recorrer el subrbol derecho en orden.
Para recorrer un rbol binario lleno en postorden, se ejecutan las siguientes tres
operaciones:
1. Recorrer el subrbol izquierdo en postorden.
2. Recorrer el subrbol derecho en postorden.
3. Visitar la raz.
D
E
Preorden: ABDGCEHIF
En orden: DGBAHEICF
Postorden: GDBHIEFCA
E
E
E
E
E
E
E
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
83
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
E
E
Preorden: ABCEIFJDHLA
En orden: EICFJBGDKHLA
Postorden: IEJFCGKLHDBA
REPRESENTACINES DE RBOLES BINARIOS.
Al igual que en el caso de los nodos de una lista, los nodos de un rbol pueden implantarse como un
arreglo de elementos o como asignacin de una variable dinmica. Cada nodo contiene los campos info, left,
y father. Los campos left, right y father apuntan a los nodos hijo derecho, hijo izquierdo y padre
respectivamente.
#define NUMNODES 500
struct nodetype
{
int info;
int left;
int right;
int father;
};
struct nodetype node [numnodes];
84
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
contenidos de un rbol binario en preorden, orden y postorden. El parmetro de cada rutina es un apuntador
al nodo raz de un rbol binario.
pretav(tree)
NODEPTR tree;
{
if (tree != NULL)
{
printf (%d, tree-info);
pretav (tree- left);
pretav (tree - right);
} /* fin del if */
} /* fin del pretav */
intrav (tree)
NODEPTR tree;
{
if (tree != NULL)
{
intrav (tree - left);
printf (%d, tree - info);
intrav (tree - right);
} /* fin del if */
} /* fin del intrav */
posttrav (tree)
NODEPTR tree;
{
if (tree != NULL)
{
posttrav (tree - left);
posttrav (tree - right);
printf (%d, tree - info);
} /* fin del if */
} /* fin del posttrav */
85
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
de los cuales pudiera ser NULL). El nodo raz es el primer nodo de un rbol. Cada enlace en el nodo raz se
refiere aun hijo. El hijo izquierdo s el primer nodo en el subrbol izquierdo y el hijo derecho es el primer
nodo en el subrbol izquierdo. Los hijos de un nodo se conocen como descendientes. Un nodo sin hijos se
conoce como un nodo de hoja. Los cientficos de la computacin normalmente dibujan los rboles partiendo
del nodo raz hacia abajo en forma exactamente opuesta a los rboles en la naturaleza.
Crearemos un rbol binario especial conocido como un rbol de bsqueda binario (que no tiene
valores duplicados de nodos) tienen la caracterstica que los valores en cualquier subrbol izquierdo son
menores que el valor en sus nodos padre, y los valores en cualquier subrbol derecho son mayores que el
valor en sus nodos padre. En la figura se ilustra un rbol de bsqueda binario con 12 valores. Note que la
forma del rbol de bsqueda binario que corresponde a un conjunto de datos puede variar, dependiendo del
4
orden en el cual los valores estn insertos dentro del rbol.
7
2
5
1
1
7
7
4
3
6
9
9
3
El programa de la siguiente figura, crea un rbol de bsqueda binario y lo recorre de tres formas, en
7 preorden y postorden. El 1programa
orden,
e inserta 6cada uno de ellos en el
3 genera 10 nmeros aleatorios
4
7
8
1
4
rbol, a excepcin de los valores duplicados, que son descartados.
Las funciones utilizadas, para crear un rbol de bsqueda binario y recorrer el rbol, son
recursivas. La funcin insertNode recibe como argumentos la direccin del rbol y un entero para
almacenarse en el rbol. En un rbol de bsqueda binario un nodo puede ser nicamente inserto como nodo
de hoja, Los pasos para insertar un nodo en un rbol de bsqueda binario, son como sigue:
1. Si treePtr es NULL, crea un nuevo nodo. Llame malloc, asigna la memoria asignada a treePtr,
asigna a (treePrt)->data el entero a almacenarse, asigna (*treePtr)->leftPtr y (*treePtr)->rightPtr el
valor NULL y devuelve o regresa el control al llamador (ya sea a main o a una llamada anterior a
inserNode).
2. Si el valor de treePtr no es NULL, y el valor a insertarse es menor que (treePtr)->data, se llama
a la funcin insertNode con la direccin(*treePtr)->leftPtr. De no ser as, se llama a la funcin
insertNode con la direccin de (*treePtr)->righptr. Se continan los pasos recursivos hasta que se
encuentre un apuntador NULL, entonces se ejecutara el paso 1) para insertar el nuevo nodo.
Las funciones inOrder, preOrder y postOrder cada una de ellas recibe una rbol (es decir, el
apuntador al nodo raz del rbol) y recorren el rbol.
Los pasos para recorrido un recorrido inOrder son:
1. Recorrer el subrbol izquierdo inOrder.
2. Recorrer el valor en el nodo.
3. Recorrer el subrbol derecho inOrder.
El valor en un nodo no es procesado en tanto no sean procesados los valores de su subrbol
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
86
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
4
2
1
3
1
7
3
3
4
8
87
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
/* ESTRUCTURA AUTOREFERENCIADA */
struct treeNode
{
struct treeNode *leftPtr;
int data;
struct treeNode *rightPtr;
};
/* DEFINICION DE TIPOS */
typedef struct treeNode TREENODE;
typedef TREENODE *TREENODEPTR;
/* ENCABEZADO DE LAS FUNCIONES */
void insertNode(TREENODEPTR *, int);
void inOrder (TREENODEPTR);
void preOrder (TREENODEPTR);
void postOrder (TREENODEPTR);
/* FUNCIONES PRINCIPALES */
main()
{
int i, item;
TREENODEPTR rootPtr =NULL;
/* DECLARACION DE DATOS */
srand(time(NULL));
/* intentar a insertar 10 valores aleatorios entre 0 y 14 en el arbol*/
printf("Los numeros iniciales en el arbol son: \n");
for(i=1;i<=10;i++)
{
item = rand() % 15;
printf("%3d", item);
insertNode(&rootPtr, item);
}
printf("\n\n El preorden tranversal es : \n");
preOrder(rootPtr);
printf("\n\n El inorden tranversal es : \n");
inOrder (rootPtr);
printf("\n\n El postorden tranversal es : \n");
preOrder (rootPtr);
return 0;
}
/* Insertar nodo */
void insertNode(TREENODEPTR *treePtr, int value)
{
if (*treePtr == NULL)
{
*treePtr = (TREENODEPTR) malloc(sizeof(TREENODEPTR));
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
88
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
if (*treePtr != NULL)
{
(*treePtr)->data = value;
(*treePtr)->leftPtr = NULL;
(*treePtr)->rightPtr = NULL;
}
else
printf("%d no inserto. Memoria insuficiente. \n\n, info");
}
else
if(value < (*treePtr)->data)
insertNode (&((*treePtr) -> leftPtr), value);
else
if (value > (*treePtr)->data)
insertNode (&((*treePtr)->rightPtr), value);
else
printf("duplicado");
}
/* Retirar un nodo*/
void inOrder (TREENODEPTR treePtr)
{
if(treePtr != NULL)
{
inOrder(treePtr->leftPtr);
printf("%3d", treePtr->data);
inOrder (treePtr->rightPtr);
}
}
void preOrder(TREENODEPTR treePtr)
{
if(treePtr != NULL)
{
printf("%3d", treePtr->data);
preOrder(treePtr->leftPtr);
preOrder (treePtr->rightPtr);
}
}
void postOrder(TREENODEPTR treePtr)
{
if(treePtr != NULL)
{
postOrder(treePtr->leftPtr);
postOrder (treePtr->rightPtr);
printf("%3d", treePtr->data);
}
}
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
89
RBOLES
UNIDAD VI
____________________________________________________________________________________________________
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO
90