You are on page 1of 27

4.2. 1 4.2 rboles 4.2.

1 Concepto

Listas lineales En las listas lineales, cada elemento tiene dos nodos como vecinos: un antecesor y un sucesor. Por ejemplo:

Elementos de un arreglo unidimensional. Campos en un registro. Datos en un stack.

Listas no lineales En las estructuras no lineales, cada elemento puede tener varios siguientes elementos, lo que introduce el concepto de estructuras con ramificaciones. Un rbol es una lista no lineal que impone una estructura jerrquica sobre una coleccin de objetos. Ejemplos conocidos son los organigramas y los rboles genealgicos. Los rboles son usados tambin para ayudar a analizar circuitos elctricos y para representar la estructura de frmulas matemticas. Tambin surgen naturalmente en muchas reas diferentes de la ciencia de la computacin. Por ejemplo, se usan para organizar la informacin en sistemas de bases de datos y para representar la estructura sintctica de programas fuentes en compiladores. Definicin Un rbol es un conjunto finito de uno o ms nodos (ver figura 4.2.1), tal que: 1) Hay un nodo especial llamado raz. 2) Los nodos restantes son particionados en k 0 conjuntos disjuntos T1, T2, ..., Tk, donde cada uno de estos conjuntos es un rbol. T1, T2, ..., Tk son llamados los subrboles de la raz.

4.2. 2

Figura 4.2.1 Definicin de rbol Un rbol es una coleccin de elementos llamados nodos, uno de los de los cuales se distingue como raz a travs de una relacin (parentesco) que determina una estructura jerrquica sobre los nodos. Un nodo, igual que un elemento de una lista, puede ser del tipo que se desee. Ejemplos La figura 4.2.2 muestra un rbol en que los nodos b y c son hijos de a y c es padre de los nodos e y f.

Figura 4.2.2 Ejemplo de rbol con raz A

4.2. 3 La figura 4.2.3 presenta otro ejemplo de rbol, con 4 niveles.

NIVEL 1

Figura 4.2.3 Ejemplo de rbol con 4 niveles

Utilidad de los rboles i) Estructurar datos que se prestan al concepto de jerarqua. Por ejemplo, ver figura 4.2.4, donde da lo mismo el orden.

Tierra frica del Norte Amrica del Sur Asia Central Europa Oceana

Argentina Salta

Uruguay

Mendoza

Figura 4.2.4 Ejemplo de jerarqua donde no importa el orden

4.2. 4 Existen casos donde el orden es relevante. Ver figura 4.2.5. Libro

Captulo 1

Captulo 2

Captulo 3

Seccin 1 Seccin 1.1

Seccin 2

Seccin 1.2

Figura 4.2.5 Ejemplo de jerarqua donde s importa el orden

ii) Estructuras recursivas Tambin se da el caso en que importa el orden. Ver ejemplo en figura 4.2.6. +

a+b/c+d/e
/

Figura 4.2.6 Ejemplo de estructura recursiva donde importa el orden

4.2. 5 El siguiente ejemplo muestra una estructura recursiva donde no importa el orden. Ver figura 4.2.2. var x: record y: integer; z: record a: char; b: integer; c: real; end; t: boolean end;

x y a z b c t

Figura 4.2.7 Ejemplo de estructura recursiva donde no importa el orden

Algunas definiciones: Grado de un nodo (degree): Cantidad de subrboles del nodo. Hoja (leaf) o nodo terminal: Nodos con grado igual a cero (nodo sin subrboles). Hermanos (sibling): Nodos con un mismo padre. Camino (path): Secuencia de uno o ms arcos que conectan dos nodos. Longitud de un camino: Es el nmero de arcos que componen el camino. Nivel de un nodo (level): Es definido asignando la raz al nivel 1. Si un nodo se encuentra en el nivel L, entonces sus hijos se encuentran en el nivel L+1.

4.2. 6

Altura o Profundidad de un rbol (height o depth): Es el mximo nivel de cualquier nodo en el rbol. La altura de un nodo en un rbol es la longitud del camino ms largo desde el nodo a una hoja +1. La altura de un rbol es la altura de la raz. La profundidad de un nodo es la longitud del nico camino desde la raz a ese nodo. Bosque: Conjunto de rboles (puede ser vaco). rbol: Raz + bosque.

Ejemplos: i) La figura 4.2.8 presenta un ejemplo en que:


Raz: A. Hojas: B, E, J, K, G, H, I. Nodos internos: A, C, F, D. NIVEL A B C D 1 2

E J

F K

3 4

Figura 4.2.8 Ejemplo de rbol con 4 niveles

ii) La figura 4.2.9 presenta otro ejemplo en que:


Raz del rbol: A Subrboles de A: Subrboles con raz en B, C, D.

4.2. 7

B es la raz de un rbol con un subrbol que tiene la raz E. El rbol E no tiene subrboles. El rbol con raz C tiene dos subrboles, con races F y G. A

Figura 4.2.9 Ejemplo de rbol

iii) En el rbol que se muestra en la figura 4.2.10, se aprecia que el nodo 8 est a la derecha del nodo 2, y a la izquierda de los nodos 9, 6, 10, 4 y 7, y no est ni a la derecha ni a la izquierda de sus ancestros 1, 3 y 5.

Figura 4.2.10 Ejemplo de rbol

4.2. 8 Recorrido de rboles Recorrer un rbol es examinar una sola vez cada uno de sus nodos. Tipos de recorridos ms importantes:

Preorden. Inorden. Postorden.

1) Si un rbol T es vaco, entonces la lista vaca es la lista en preorden, inorden y postorden de T. 2) Si T consiste de un solo nodo, entonces ese nodo corresponde por si mismo a la lista en preorden, inorden y postorden de T. 3) En otro caso, sea T un rbol con raz n y sub-rboles T1, T2 ,....Tk, tal como el de la figura 4.2.11.

Figura 4.2.11 rbol

i) El listado en preorden de los nodos de T es la raz n de T seguida por los nodos T1, en preorden, luego los de T2 en preorden, etc., hasta los de Tk en preorden.

4.2. 9 ii) El listado en inorden de los nodos de T son los nodos de T1 en inorden, seguida por el nodo n, seguido por los nodos de T2, ..., Tk ; cada uno en inorden.

iii) El listado en postorden de los nodos de T son los nodos de T1 en postorden, luego los de T2 en postorden, y as sucesivamente, hasta los de Tk , y luego el nodo n.

Ejemplos de recorridos i) Para el rbol de la figura 4.2.12, los recorridos seran: A B C D

E J

F K

Figura 4.2.12 Ejemplo de rbol Preorden: A B C E F J K G H D I (El ndice de un libro se encuentra en preorden). Postorden: B E J K F G H C I D A Inorden: B A E C J F K G H I D

4.2. 10 ii) Para el rbol de la figura 4.2.13, los recorridos seran:

Figura 4.2.13 Ejemplo de rbol Preorden 1, 2, 3, 5, 8, 9, 6, 10, 4, 7 Postorden 2, 8, 9, 5, 10, 6, 3, 7, 4, 1 Inorden 2, 1, 8, 5, 9, 3, 10, 6, 7, 4

A menudo, es til asociar un rtulo (label) o valor con cada nodo de un rbol. Este rtulo no es el nombre del nodo si no que corresponder a un valor que es almacenado en el nodo. En algunas aplicaciones se puede cambiar el rtulo de un nodo, mientras su nombre permanece igual. Por ejemplo, ver figura 4.2.14, donde el rbol representa la expresin: (a + b) * (a + c) * + ab + ac : prefijo (preorden) ab + ac + * : postfijo (postorden) a + b * a + c : infijo (inorden)

4.2. 11 Se observa que el listado en preorden de los rtulos del rbol entrega la forma en prefijo de la expresin. As mismo, un listado en postorden de los rtulos nos da la representacin postfijo de la expresin, y en inorden se obtiene la expresin en su representacin infijo.

Figura 4.2.14 Rtulos para cada nodo de un rbol

Representacin de expresiones mediante rboles Dada la expresin (1/n) * (n + 1) 3 * n, esta se puede representar mediante el rbol de la figura 4.2.15.

* +

Figura 4.2.15 Expresin representada a travs de un rbol

4.2. 12 Donde el recorrido en postorden es: 1 n / n 1 + * 3 n * (representacin posfijo).

Recorrido por niveles Consiste en visitar los nodos, en orden creciente de nivel, considerando cada nivel, de izquierda a derecha. Ejemplo: La figura 4.2.16 muestra un rbol cuyo recorrido: Por nivel: 1 2 6 3 4 7 8 9 5

Postorden: 3 5 4 2 7 8 9 6 1

5 Figura 4.2.16 Ejemplo de rbol

4.2. 13 4.2.2 Objeto rbol

Las operaciones o mtodos importantes asociados con rboles son los siguientes: 1) PADRE(n, T) : retorna el padre del nodo n en el rbol T. Si n es la raz, se retorna (nodo vaco). 2) HIJO_MAS_A_LA_IZQ(n, T): Retorna el hijo ms a la izquierda del nodo n en el rbol T. Retorna si n es una hoja. 3) HERMANO_DERECHO (n,T): retorna el hermano de la derecha del nodo n en el rbol T, definido como el nodo m con el mismo padre p que n y tal que m est inmediatamente a la derecha de n en el orden de los hijos de p. Si no existe retorna 4) ROTULO (n,T): retorna el rtulo del nodo n en el rbol T. 5) CREAi( v, T1, T2,..., Ti): es una de una familia infinita de funciones, una para cada i = 0,1,2...CREA i genera un nuevo nodo r con rtulo v y cuyos hijos son las i races de los rboles T1, T2,...,Ti en orden desde la izquierda. Se retorna el rbol con raz r. Si i = 0, entonces r es una hoja y la raz a la vez. Ver figura 4.2.17.

Figura 4.2.17 Creacin de un rbol

4.2. 14 6) RAIZ (T): retorna el nodo raz del rbol T, si T es el rbol nulo. 7) ANULA (T): convierte T en el rbol vaco. 8) RECORRER (T): recorre el rbol T. El recorrido puede ser en preorden, inorden o postorden. Un procedimiento recursivo en seudocdigo que imprime la lista de rtulos de los nodos de un rbol en preorden es el siguiente.

PREORDEN(T) { print(ROTULO( n, T )) ; c HIJO_MAS_A_LA_IZQ( n, T ) ; while ( c != ) { PREORDEN(c) ; c HERMANO_DERECHO(c, T) ; } }

4.3 rboles Binarios 4.3.1 Concepto

Un rbol binario es, o bien un rbol vaco, o un rbol en que cada nodo tiene a lo ms dos hijos, los cuales, si existen son llamados hijos izquierdo y derecho respectivamente (figura 4.3.1). raz Subrbol izquierdo a1 a2 Subrbol derecho

Figura 4.3.1 rbol Binario

4.2. 15

Notar que en rboles se puede tener: A

B y en rboles binarios existen:

A B

los que corresponden a rboles binarios diferentes. Ejemplos:

NIVEL A B 1 2

4.2. 16

NIVEL A 1

B D H I E F

C G

2 3 4

Elementos de un rbol 20 10 5 Se tiene que:

25 12

La raz es 20 y los subrboles asociados son: 10 5 12 25 hoja

4.2. 17

Los elementos 5, 12 y 25 son hojas. Los nodos interiores son 20 y 10. El padre de 5 es 10. El padre de 25 es 20. Los hijos de 10 son 5 y 12. Los elementos 5 y 12 son hermanos.

Conceptos:

Camino. Longitud. Rama. (camino raz hoja) Peso.

Ejemplos Para el rbol a b


La longitud del caminoe<a,b,e> f 2. es d No existe camino entre d y c. g h El nico camino que lleva de c a h es: <c,f,h>. El camino <a,c,f,g> es una rama.

Para el rbol: e1 e2 e4 e6 e5 e7 e3 nivel 1 nivel 2 nivel 3 nivel 4

4.2. 18

Se tiene que:

La altura es 4. El peso es 7. (El peso de un rbol es la cantidad de nodos que tiene) e1 es ancestro de todos los elementos del rbol. e7 es descendiente de e2. El ancestro comn ms prximo de e4 y e7 es e2. El ancestro comn ms prximo de e6 y e3 es e1.

Propiedades de los rboles binarios El nmero mximo de nodos en el nivel i de un rbol binario es: 2i-1 , i 1 El nmero mximo de nodos en un rbol binario de profundidad k es: 2k 1 , k 1 Relacin entre la cantidad de nodos terminales y la cantidad de nodos de grado 2, para cualquier rbol binario no vaco: n : n0 : n1 : n2 : n total de nodos en el rbol. n total de nodos terminales. n total de nodos de grado 1. n total de nodos de grado 2. n0 = n2 + 1

Full Binary Tree Un full binary tree de profundidad k, es un rbol binario de profundidad k y que tiene 2k 1 nodos.

4.2. 19

Ejemplo (figura 4.3.2) 1

2 4 5 6

3 7

Figura 4.3.2 Ejemplo de full binary tree

Complete Binary Tree Un rbol binario con n nodos y profundidad k es complete s y slo s sus nodos corresponden a los nodos numerados desde 1 a n en el full binary tree de profundidad k. Es un rbol binario con hojas a lo ms en dos niveles adyacentes L 1 y L, en el cual, las hojas del nivel L se encuentran en las posiciones de ms a la izquierda. La altura de un complete binary tree con n nodos es: | log2 (n + 1)| Ejemplos NIVEL 1 2 3 4 No completo d b e f i h a c d i rbol completo b e f a c g

4.2. 20

NIVEL 1 1

2 4 5 6

3 7

2 3 NIVEL

2 4 8 rbol full 10 15 25 5 30 2 12 7 14 17 9 10 5 11 6 12

3 7

2 3 4

20 9 4 3 28

(tambin es casi lleno)

rbol binario completo:

4.2. 21

10 15 25 5 30 2 12 14 20 9 25 15

10 20

rboles isomorfo: a b d e c a g b f h

rboles semejante: (no isomorfo, mismos elementos) a b d e c c d e b a

Recorrido de rboles binarios Recorrer un rbol, es examinar una sola vez, cada uno de sus nodos. Existen tres tipos de actividades en el recorrido de un rbol binario:

4.2. 22 i) Visitar la raz.

ii) Recorrer el subrbol izquierdo. iii) Recorrer el subrbol derecho. El tipo de recorrido difiere de acuerdo al orden en que se afectan estas actividades. Preorden: 1. Visitar la raz. 2. Recorrer el subrbol izquierdo, en preorden. 3. Recorrer el subrbol derecho, en preorden. Inorden: 1. Recorrer el subrbol izquierdo en inorden. 2. Visitar la raz. 3. Recorrer el subrbol derecho en inorden.

Posorden: 1. Recorrer el subrbol izquierdo en posorden. 2. Recorrer el subrbol derecho en posorden. 3. Visitar la raz. Ejemplo Expresin aritmtica: (((A + B) * C / D) + E F) / G Representacin de la expresin mediante un rbol binario. Ver figura 4.3.3. /

* + / E

4.2. 23

Preorden: / + * + A B / C D E F G (forma prefijo). Inorden: A + B * C / D + E F / G (forma infijo). Posorden: A B + C D / * E F + G / (forma posfijo). En la representacin infijo, se puede perder el orden de precedencia sealado en la expresin aritmtica original, en caso de haber utilizado parntesis para anular la jerarqua de evaluacin de los distintos operadores. Como en la notacin posfijo, se mantiene el orden de precedencia, el recorrido posorden es conveniente, para una correcta evaluacin de la expresin aritmtica. Ejemplo: M

E B A D L N

P V

4.2. 24

Prefijo: MEBADLPNVTZ Infijo: ABDELMNPTVZ Posfijo: ADBLENTZVPM

4.3.2 Objeto rbol Binario Como existe una definicin lgica restringida de los rboles binarios, es necesario plantear este objeto como un caso particular. Las operaciones o mtodos asociados son: 1) PADRE (n, A): retorna el padre del nodo n en el rbol A. si n es la raz. 2) ROTULO (n, A): retorna el rtulo del nodo n en el rbol A. 3) ANULA (A): Convierte A en el rbol vaco. 4) RAIZ (A): retorna el nodo raz del rbol A, o si es el rbol vaco. 5) VACO (A): retorna V si A es un rbol vaco y F si no. 6) HIJO_IZQ (n,A): retorna el hijo izquierdo del nodo n en el rbol A. 7) HIJO_DER (n, A): retorna el hijo derecho del nodo n en el rbol A. 8) AGREGA_IZQ (x, n): agrega nuevo hijo izquierdo de nodo n con rtulo x siempre y cuando n no tenga hijo izquierdo.

4.2. 25 9) AGREGA_DER (x, n): agrega nuevo hijo derecho de n con rtulo x siempre y cuando n no tenga hijo derecho. 10) ELIMINA_IZQ (n, A): elimina hijo izquierdo del nodo n en el rbol A, si existe. 11) ELIMINA_DER (n, A): elimina hijo derecho del nodo n en el rbol A, si existe. 12) RECORRE (A): recorre el rbol binario A. preorden o postorden. template <class KeyType> class ArbolBinario { //objetos: un conjunto finito de nodos, ninguno vaco o parte del nodo raz, //ArbolBinario izquierdo y ArbolBinario derecho. public: ArbolBinario(); //crea un rbol binario vaco. Boolean esVacio(); //Si el rbol binario est vaco, retorna TRUE(1); sino //retorna FALSE(0). El recorrido puede ser en inorden,

ArbolBinario(ArbolBinario ab1,Elemento <KeyType> item, ArbolBinario ab2); //crea un rbol binario, donde el subrbol izquierdo es ab1, el subrbol //derecho es ab2 y el nodo raz contiene item. ArbolBinario hijoIzq(); //Si IsEmpty(), retorna error; sino retorna el subrbol izquierdo de *this. Elemento <KeyType> Dato(); //Si IsEmpty(), retorna error, sino retorna el dato en el nodo raz de *this. ArbolBinario hijoDer(); //Si IsEmpty(), retorna error; sino retorna el subrbol derecho de *this. };

4.3.3 Representacin de rboles Binarios

Recorrido en inorden

4.2. 26 Usando recursin void Arbol::inorden() { inorden(raiz); } void Arbol::inorden(NodoArbol* CurrentNodo) //Arbol. { if (CurrentNode) { //no es vaco inorden (CurrentNodo hijoIzq); cout <<CurrentNodo dato; inorden (CurrentNodo hijoDer); } } Usando una pila void Arbol::NoRecInorden() //Recorrido inorden no recursivo, usando una pila { Stack<NodoArbol*> s; //declara e inicializa la pila. NodoArbol* CurrentNodo = raiz; while (1) { while (CurrentNodo) { //mueve hacia abajo los campos hijoIzq. s.Add (CurrentNodo); //agrega a la pila CurrentNodo = CurrentNodo hijoIzq; } if (! s.IsEmpty()) { //la pila no est vaca CurrentNodo = *s.Delete (CurrentNodo); //elimina de la pila cout <<CurrentNodo dato << endl; CurrentNodo = CurrentNodo hijoDer; } else break; } }

Recorrido por nivel void Arbol::OrdenNivel() //Recorre el rbol binario en orden de nivel {

4.2. 27 Cola <NodoArbol*> c; NodoArbol *CurrentNodo = raiz; while (CurrentNodo) { cout <<CurrentNodo dato << endl; if (CurrentNodo hijoIzq) c.Add (CurrentNodo hijoIzq); if (CurrentNodo hijoDer) c.Add (CurrentNodo hijoDer); CurrentNodo = *c.Delete (CurrentNodo); } }

You might also like