Sei sulla pagina 1di 7

Bor

ra
Captulo 5

rboles

Pg. 76

5.1.

rboles

Introduccin

Bor
ra

En ciencias de la computacion, un rbol es una estructura de datos


ampliamente utilizada que imita la forma de un rbol (un conjunto de
nodos conectados). En este captulo se estudia los rboles su definicin,
aplicaciones, propiedades y finalmente su implementacin.

5.2.

rboles

Un rbol se define como una coleccin de nodos organizados en forma


recursiva. Cuando hay cero nodos se dice que el rbol esta vaco, en caso
contrario el rbol consiste en un nodo denominado raz, el cual tiene cero
ms referencias a otros rboles, conocidos como subrboles los cuales
son distintos (disjuntos). Las races de los subrboles se denominan hijos
de la raz, y en consecuencia la raz se denomina padre de las races de
sus subrboles. No hay ciclos.
El nodo tpico de un rbol difiere de los nodos que se ha visto hasta
ahora para listas, aunque slo en el nmero de nodos. Ejemplo de nodo
para crear rboles de orden tres:
Programa 5.1: Nodo de un rbol de orden 3

1
2
3
4
5
6

struct Nodo {
int Clave ;
Nodo * rama1 ;
Nodo * rama2 ;
nodo * rama3 ;
}

O generalizando ms:

Programa 5.2: Nodo de un rbol de orden 5

1
2
3
4
5

# define ORDEN 5
struct Nodo {
int Clave ;
Nodo * rama [ ORDEN ]; // Arreglo de punteros a Nodo
}

Oliver A. Vilca H.

5.3.

Pg. 77

rboles binarios

Bor
ra

Es una estructura de datos basada en nodos que poseen dos enlaces


que pueden ser nulos o referencias a otros nodos. En un rbol binario cada
nodo es apuntado por otro nodo denominado nodo padre, excepto por el
nodo raz, el cual no tiene un nodo que lo apunte. Cada nodo tiene exactamente dos enlaces de ello su nombre binario, se denominan: Izquierda
y Derecha los cuales apuntan a nodos denominados hijo izquierdo e hijo
derecho respectivamente. Aunque un nodo apunte a otro nodo indirectamente esta apuntando a un rbol binario. Por lo tanto se puede definir
un rbol binario como un enlace a nulo (cuando hay cero nodos y el rbol
esta vaco) o enlace a un nodo (conocido como nodo raz) con sus enlaces
izquierdo y derecho apuntado a dos subrboles (que son disjuntos) y que
vienen a ser rboles binarios en si. De este modo un rbol se define como
una coleccin de nodos organizados en forma recursiva.
Un rbol binario tiene una clave y un valor, con una restriccin de
orden para soportar bsquedas eficientes.

Los nodos en s que conforman un rbol binario se denominan nodos internos, y todas las referencias que son null se denominan nodos
externos. Algunos de los usos comunes de los rboles binarios son los rboles binarios de bsqueda, los montculos binarios y la Codificacin de
Huffman.
Programa 5.3: Nodo de un rbol binario en C++

1
2
3
4
5

struct Nodo {
int Clave ;
Nodo * I z q u i e r d a;
Nodo * Derecha ;
};

Es importante siempre conservar el puntero al nodo raz ya que es el


nodo a partir del cual se accede el rbol, y si se pierde este puntero, se
pierde el acceso a todo el rbol.

5.4.

Arbol Binario de Bsqueda

Un rbol binario de bsqueda (ABB), (en ingls Binary Search Tree


o Sorted Binary Tree) es un tipo particular de rbol binario donde cada

Pg. 78

rboles

Bor
ra

nodo tiene una clave de comparacin, en el cual la clave de un nodo es


mayor que todas las claves de los nodos del subrbol izquierdo y menor
que todas las claves de los nodos del subrbol derecho. Tambin se puede
definir un ABB considerando las siguientes propiedades:

Los valores de los nodos del subarbol izquierdo de un nodo N son


menores que el valor de nodo N .

Los valores de los nodos del subarbol derecho de un nodo N son


mayores al valor de nodo N .
El subrbol izquierdo y derecho son rboles binarios.
No hay nodos duplicados.

El inters de los rboles binarios de bsqueda (ABB) radica en que


su recorrido en inorden proporciona los elementos ordenados de forma
ascendente y en que la bsqueda de algn elemento es eficiente.
La clase rbol binario de bsqueda (ABB) con su construcctor:
Programa 5.4: Clase rbol ABB en C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

struct Nodo {
char Clave ;
Nodo * I z q u i e r d a;
Nodo * Derecha ;
};

class ABB {
Nodo * Raiz ; // R e f e r e n c i a a la raiz del ABB
public :
ABB (); // C o n s t r u c t o r
void Insertar ( int );
// Aqui otras f u n c i o n e s miembro .
};

ABB :: ABB ()
{
Raiz = NULL ;
}

5.4.1.

Bsqueda

Esta operacin retorna una referencia al nodo en donde se encuentra


el elemento buscado, X, o null si dicho elemento no se encuentra en el
rbol. La estructura del rbol facilita la bsqueda:

Oliver A. Vilca H.

Pg. 79

Si el rbol esta vaco, entonces el elemento no est y se retorna null.

Bor
ra

Si el rbol no esta vaco y el elemento almacenado en la raiz es X,


se encontr el elemento y se retorna una referencia a dicho nodo.

Si X es menor que el elemento almacenado en la raiz se sigue buscando recursivamente en el subrbol izquierdo, y si X es mayor que
el elemento almacenado en la raz se sigue buscando recursivamente
en el subrbol derecho.

Traduciendo el procedimiento de bsqueda en cdigo tenemos:


Programa 5.5: Bsqueda en un rbol ABB

1
2
3
4
5
6
7
8
9
10
11

Nodo * A r b o l B i n a r i o:: P r i m e r a B u s q u e d a R e c u r s i v a( int x , Nodo * nodo )


{
if ( nodo == NULL )
// Si el rbol esta vaco , retornar NULL
return NULL ;
if ( x == nodo - > Clave ) // Si x es igual al valor de nodo
return nodo ;
if ( x < nodo - > Clave ) // Si x es menor al valor del nodo
return B u s q u e d a R e c u r s i v a( x , nodo - > I z q u i e r d a);
else if ( x > nodo - > Dato ) // Si x es mayor al valor del nodo
return B u s q u e d a R e c u r s i v a( x , nodo - > Derecha );
}

Optimizando se tiene lo siguiente:

Programa 5.6: Bsqueda en un rbol ABB

1
2
3
4
5
6
7
8
9

Nodo * ABB :: B u s q u e d a R e c u r s i v a( int x , Nodo * nodo )


{
if ( nodo == NULL || x == nodo - > Clave )
return nodo ;
if ( x < nodo - > Clave )
return B u s q u e d a R e c u r s i v a( x , nodo - > I z q u i e r d a );
else
return B u s q u e d a R e c u r s i v a( x , nodo - > Derecha );
}

5.4.2.

Insercin

Para insertar un elemento X en un ABB, se realiza una bsqueda


infructuosa de este elemento en el rbol, y en el lugar en donde debiera
haberse encontrado se inserta.

Pg. 80

rboles
Programa 5.7: Insercin en un rbol ABB - C++

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

void ABB :: Insertar ( int x )


{
Nodo * n = Raiz ;
if ( n == NULL )
{ Raiz = C r e a r N o d o( x ); return ; }

Bor
ra

while ( true )
{
if ( x < n - > Clave ){
if (n - > I z q u i e r d a == NULL ){
n - > I z q u i e r d a = C r e a r N o d o( x );
return ;
}
n = n - > I z q u i e r d a;
}
else {
if (n - > Derecha == NULL ){
n - > Derecha = C r e a r N o d o( x );
return ;
}
n = n - > Derecha ;
}
}

Nodo * ABB :: C r e a r N o d o( int x )


{
Nodo * n ;
n = new Nodo ;
n - > Clave = x ;
n - > I z q u i e r d a = NULL ;
n - > Derecha = NULL ;
return n ;
}

5.4.3.

Borrado

5.4.4.

Recorridos en un ABB

5.5.

5.5.0.1.

Propiedades
Propiedad 1

Si se define n = nmero de nodos internos, e = nmero de nodos


externos, entonces se tiene que:
e=n+1

(5.1)

Oliver A. Vilca H.
5.5.0.2.

Pg. 81

Propiedad 2

Bor
ra

Sea n = nmero de nodos internos. Se define:


In = suma del largo de los caminos desde la raz a cada nodo interno
(largo de caminos internos).

En = suma del largo de los caminos desde la raz a cada nodo


externo (largo de caminos externos)

Se tiene que:

En = In + 2n

5.5.0.3.

(5.2)

Propiedad 3

El nmero de rboles binarios distintos que se pueden construir con n


nodos internos esta dado por los nmeros de Catalan.
n
0
1
2
3
4

bn
1
1
2
5
?

Cuadro 5.1: Arboles binarios que se pueden construir con n nodos internos.

Cuntos rboles binarios distintos se pueden construir con n nodos


internos?


b0 = 1 P
n
bn+1 = k=0 bk .bnk

(5.3)

b4 = b0 b3 + b1 b2 + b2 b1 + b3 b0 = 5 + 2 + 2 + 5 = 14

b20 = 6 564 120 420


La ecuacin del nmero de rboles binarios que se pueden construir
en funcin de n nodos internos es:
 
1
(2n)!
2n
bn =
=
,n 0
(5.4)
n+1 n
(n + 1)!n!

Potrebbero piacerti anche