Вы находитесь на странице: 1из 11

RBOLES

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

OPERACIONES CON RBOLES BINARIOS


Existen varias operaciones simples que pueden aplicarse a rboles binarios. Si p es un apuntador a
un nodo nd de un rbol binario, la funcin info(p) da como resultado los contenidos de nd. Las funciones
left(p), right(p), father(p), da como resultado el apuntador nulo s nd no tiene hijo izquierdo, hijo derecho
padre o hermano. Como consecuencia las funciones isleft(p) e isright(p) dan como resultado verdadero
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO

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);

APLICACIONES DE RBOLES BINARIOS


Un rbol binario es una estructura de datos tiles cuando en cada punto de un proceso hay que
tomar una decisin de doble opcin. Como en la aplicacin para encontrar duplicados:
/* Leer el primer nmero e insertarlo en un rbol binario de un solo nodo */
scanf (%d, &number);
tree = maketree (number);
while (hay nmero rezagados en la entrada)
{
scanf (%d, number);
p = q;
while (number != info(p) && q != NULL)
{
p = q;
if (number < info(p))
q = left(p);
else
q = right(p);
} /* Fin del while */
if (number == info(p))
printf (%d %s \n, number, es un duplicado);
/* Insertar number a la derecha o izquierda de p */
else if (number < info(p))
setleft(p, number);
else
setright(p, number);
} /* Fin del while */
Otra operacin comn es recorrer un rbol binario; esto e pasar a travs del rbol, enumerando
cada uno de sus nodos una vez. En cualquier caso se habla de visitar cada nodo al enumerar este. El orden
en que se visitan los nodos es de una manera clara, del primero al ltimo.
Para recorrer un rbol binario lleno de preorden, se ejecutan las siguientes tres operaciones:
1. Visitar la raz.
2. Recorrer el subrbol izquierdo en preorden.
3. Recorrer el subrbol derecho en preorden.
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO

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];

ELECCIN DE UNA REPRESENTACIN DE RBOLES BINARIOS.


La representacin ligada requiere de campos left, right y father (aunque ya se ha visto que uno o
dos de ellos pueden eliminase en situaciones especficas), pero permite un uso mucho ms flexible del
conjunto de nodos. En la representacin ligada, un nodo particular puede colocarse en cualquier
localizacin y en cualquier rbol, mientras que en la representacin secuencial un nodo se puede usar slo si
se necesita en una localizacin en un rbol especfico. Adems en la representacin con nodos dinmica, el
nmero total de rboles y nodos est limitado exclusivamente por la cantidad de memoria disponible. As la
representacin ligada es preferible en la situacin dinmica general de muchos rboles en forma
impredecible.
RECORRIDOS DE RBOLES BINARIOS EN C.
Es posible implantar el recorrido de rboles binarios en C por medio de rutinas recursivas que
reflejan las definiciones del recorrido. Las tres rutinas en C: pretav, intrav y posttrav, imprimen los
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO

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 */

6.2. OPERACIONES SOBRE UN ARBOL BINARIO


6.2.1. CONSTRUYE UN ARBOL
6.2.2. RECORRIDO DE ARBOL BINARIO
6.2.2.1 PREORDEN
6.2.2.2 EN ORDEN
6.2.2.3 POSTORDEN
6.2.3. BSQUEDA DE UN NODO
6.2.4. INSERCIN DE UN NODO
6.2.5. ELIMINACIN DE UN NODO
Las listas enlazadas, las pilas y las colas son estructuras lineales de datos. Un rbol es una
estructura lineal y de dos dimensiones de datos, con propiedades especiales, Los nodos de los rboles
contienen dos o ms enlaces, rboles cuyos nodos todos ellos contienen dos enlaces (ninguno, uno, o ambos
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO

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
____________________________________________________________________________________________________

izquierdo. El recorrido inOrder del rbol es:


6 13 17 27 33 42 48
Ntese que el recorrido inOrder de un rbol de bsqueda binario imprime los valores de nodo en
valor ascendente. El proceso de crear un rbol de bsqueda binario, de hecho ordene los datos y por lo tanto
este proceso se llama la clasificacin de rbol binario.
2
7

4
2

1
3

1
7

3
3

4
8

El rbol de bsqueda binario facilita la eliminacin de duplicacin. Conforme se crea el rbol


cualquier intento para insertar un valor duplicado ser detectado porque en cada una de las comparaciones
un duplicado seguir las mismas decisiones ir a la izquierda o ir a la derecha que utilizo el valor
original. Entonces, el duplicado eventualmente ser comparado con un nodo que contenga el mismo valor.
Llegado a este punto el valor duplicado pudiera simplemente s desertado.
Tambin es rpido buscar en un rbol binario un valor que coincida con un valor clave. Si el valor
es denso, entonces cada nivel contendr aproximadamente dos veces tantos elementos como el nivel anterior.
Por lo tanto un rbol de bsqueda binario con n elementos tendra un mximo de log2n (logaritmo de base 2
de n niveles) y, por lo tanto, tendran que efectuarse un mximo log2n de comparaciones, ya sea para
encontrar una coincidencia, o para determinar que no existe ninguna. Esto significa, por ejemplo, que al
buscar en un rbol de bsqueda binario de 1000 elementos(densamente empacados), no es necesario llevar a
cabo mas de 10 comparaciones porque 2n >1000. Al buscar en un rbol de bsqueda binario 1000000
(densamente empacados), no es necesario llevar a cabo mas de 20 comparaciones, porque 2 a la 20
>1000000.
En los ejercicios se presentan algoritmos para otras operaciones de rboles de bsqueda binarios,
como s borrar un elemento de un rbol binario, imprimir un rbol binario en un formato de rbol de dos
dimensiones, ejecutar un recorrido en orden de niveles de un rbol binario, imprimir un rbol binario en un
formato de rbol de dos dimensiones, y ejecutar un recorrido en orden de niveles de un rbol binario. El
recorrido de orden de niveles de un rbol binario pasa por los nodos de un rbol, se pasa por los nodos de
izquierda a derecha. Otros ejercicios de rboles binarios incluyen permitir que un rbol de bsqueda binario
contenga valores duplicados, insertar valores de cadenas de un rbol binario, y determinar cuantos niveles
incluidos en u rbol binario.
/* PROGRAMA de ARBOL */
/* DECLARACION DE LAS LIBRERIAS */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
____________________________________________________________________________________________________
ESTRUCTURA DE DATOS
ING. OSORNIO

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

Вам также может понравиться