Professional Documents
Culture Documents
1 Concepto
Listas lineales En las listas lineales, cada elemento tiene dos nodos como vecinos: un antecesor y un sucesor. Por ejemplo:
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.
NIVEL 1
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
4.2. 4 Existen casos donde el orden es relevante. Ver figura 4.2.5. Libro
Captulo 1
Captulo 2
Captulo 3
Seccin 2
Seccin 1.2
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
/
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
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.
E J
F K
3 4
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
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.
4.2. 8 Recorrido de rboles Recorrer un rbol es examinar una sola vez cada uno de sus nodos. Tipos de recorridos ms importantes:
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.
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.
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
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.
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.
* +
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
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.
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.
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
4.2. 15
A B
NIVEL A B 1 2
4.2. 16
NIVEL A 1
B D H I E F
C G
2 3 4
25 12
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:
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.
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
2 4 5 6
3 7
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
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
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:
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
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. };
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); } }