UNIDAD 6: Contenedores No Lineales Arboles Apuntes de apoyo para clases teóricas. Para una conceptualización completa de los temas, los alumnos deberán asistir a las clases teóricas y completar con lectura del material bibliográfico propuesto. Tiempo de exposición: 2 hs 05/06/2014 1 Bibliografía 1) Apuntes de la cátedra – Dr. Tomas N. Hibbard. 2) Videos de la cátedra – Dr. Tomas N. Hibbard – (SRO: SI) 3) El arte de programar ordenadores. Clasificación y Búsquedas. Volúmen III – D. E. Knuth – Ed. Reverté – Reimpresión Año 2002 – (SRO: NO). El tema figura como: Árboles equilibrados (pag. 462). 4) Matemática Discreta y Combinatoria. Ralph P. Grimaldi - Addison – Wesley –3ra. Edición – Año 1998 - (SRO: SI) 5) Matemáticas Discretas - Richard Johnsonbaugh - Prentice Hall – 4ta. Edición – Año 1997 - (SRO: NO) 6) Elementos de Matemática Discreta - C. L. Liu - Mc Graw Hill – 2dta. Edición – Año 1995 - (SRO: NO) 05/06/2014 2 Bibliografía … 7) Link de animaciones: http://www.cosc.canterbury.ac.nz/mukundan/dsal/appldsal.html R. Mukundan - Associate Professor Department of Computer Science and Software Engineering, College of Engineering, University of Canterbury, New Zealand. qmatica.com http://www.qmatica.com/DataStructures/Trees/AVL/AVLTree.html (En option deshabilitar AVL Balanced, para poder trabajar con ABB) 05/06/2014 3 Campo de Aplicación Evaluadores de expresiones aritméticas (Ciencias de la computación) Representaciones de jerarquía entre sus elementos: Organigramas Árboles genealógicos Tabla de contenidos Árboles de decisión con dos opciones, también pueden ser de 3 opciones. Juegos de algún campeonato Representación de expresiones que contienen operandos y operadores binarios. Etc. 05/06/2014 4 Arbol General: Definición I Sea G = (N, A, P), donde N, es un conjunto de nodos A, es un conjunto de aristas P, es una función de las aristas, tal que cada P(a) = {p, q} El grafo G es un árbol, si G es conexo y NO contiene ciclos. Ej.: Ya vimos el árbol cubridor, también podemos representar jerarquías, etc. a) u b) v Libro Libro C1 S1.1 S1.2 w x y z 05/06/2014 C1 C3 C2 C2 C3 S3.1 S3.2 S3.2.1 S3.2.2 S3.3 S1.1 S1.2 S3.1 S3.2.1 S3.2 S3.3 S3.2.2 5 Arbol General: Definición II Un ARBOL es un conjunto finito de uno o más nodos, tales que: • Existe un nodo especial llamado raíz del árbol (V1) • Los nodos restantes (v2,v3,..,vn) se dividen en m>=0 conjuntos disjuntos denominados T1, T2,....Tm , cada uno de los cuales es a su vez, un árbol. Estos se llaman subárboles de la raíz. •Un árbol con 0 nodos es el árbol vacío 6 05/06/2014 Arboles Binarios (AB) :Definición Los árboles binarios son los tipos particulares más importantes de árboles con raíz • Cada nodo tiene cero, uno o dos hijos. • Cada nodo de un árbol binario tiene a lo sumo dos hijos. • Cada hijo se designa como hijo izquierdo o hijo derecho. x A I y z Hijo izquierdo D Hijo derecho u 05/06/2014 Nodo raíz v 7 Arboles Binarios (AB) … Relaciones de parentesco y conceptos asociados con la teoría de árboles. Raíz: Nodo “x” x A I y u Subárbol izquierdo de A: I Subárbol derecho de A: D z v D Nodo “x” es padre de los nodos “y” y “z” Nodos “y” y “z”, son hijos del nodo “x” Nodo “x” es ancestro de los nodos “y” y “z” Nodos “y” y “z”, son descendientes del nodo “x” Nodos hojas o terminales: Son aquellos que no tienen hijos o descendientes. Por ejemplo, los nodos “u”, “v” y “z”. El grado de cada nodo puede ser 1, 2 o 3. 05/06/2014 8 Arboles Binarios (AB): Nivel - Altura Nivel a = Altura = Nivel + 1 0 1 2 3 1 15 A I 10 7 2 30 12 3 21 4 11 25 Nivel de un vértice o nodo, es la longitud de camino simple a la raíz. La profundidad o altura de un árbol A, es el número máximo de nivel que aparece en dicho árbol más 1. 05/06/2014 Al nivel 1 pertenecen los nodos con valores 10 y 30, se dice que pertenecen a la misma generación. Altura de A es 4. Nos dá una idea de la cantidad de búsquedas que se deben realizar para encontrar o no un elemento dado. Altura de I, es igual a 3. Altura de (12, (11, Ø, Ø), Ø), es igual a 2. 9 Arboles Binarios (AB): Operaciones básicas Recorridos de un árbol: A Preorden 15 Inorden 10 Posorden Búsqueda de un elemento. Inserción de un elemento. 7 30 12 11 21 25 Eliminación de un elemento. 10 Arboles Binarios (AB): Recorridos Dado un Arbol Binario de raiz A: a) preorden: 1° procesar la raíz A 2° recorrer el subárbol izquierdo de A en preorden 3° recorrer el subárbol derecho de A en preorden A Animación: qmatica.com (AVL no balanceado) preorden(A) = 15,10,7,12,11,30,21,25 05/06/2014 15 10 7 30 12 11 21 25 11 Arboles Binarios (AB): Recorridos Dado un Arbol Binario de raiz A: b) inorden: 1° recorrer el subárbol izquierdo de A en inorden 2° procesar la raíz A 3° recorrer el subárbol derecho de A en inorden A Animación: qmatica.com (AVL no balanceado) 15 10 30 inorden(A) = 7,10,11,12,15,21,25,30 7 05/06/2014 12 11 21 25 12 Arboles Binarios (AB): Recorridos Dado un Arbol Binario de raiz A: c) posorden: 1° recorrer el subárbol izquierdo de A en posorden 2° recorrer el subárbol derecho de A en posorden 3° procesar la raíz A A Animación: qmatica.com (AVL no balanceado) 15 10 7 30 12 21 posorden(A) = 7,11,12,10,25,21,30,15 05/06/2014 11 25 13 Arboles Binarios de Búsqueda (ABB): Vamos a ver la primera estructura para facilitar la búsqueda y la inserción. Definiremos el conjunto de árboles binarios de búsqueda, abreviado ABB, con tres funciones, “valor”, “izq” y “der”, que entenderemos respectivamente como: 1. valor: valor almacenado en la raíz. 2. izq: subárbol izquierdo. 3. der: subárbol derecho. x A izq valor(A) = x der Hay un objeto en los ABB que no tiene estas funciones definidas, es el árbol nulo (Ø). A=Ø 05/06/2014 14 Árboles Binarios de Búsqueda (ABB): Definición: Sea “T” un tipo de datos. 1. Ø es un ABB. 2. Si I y D son ABB y t ∈ T entonces A = (t, I, D) es un ABB con valor(A) = t izq(A) = I der(A) = D 1) A=Ø 2) A t valor(A) = t izq(A) = I I 05/06/2014 D der(A) = D 15 Árboles Binarios de Búsqueda (ABB) … Ejemplos: 1) A = (5, Ø, Ø) I 2) A Ø valor(A) = 5 izq(A) = Ø der(A) = Ø 9 valor(A) = 2 izq(A) = Ø der(A) = (9, Ø, Ø) 5 Ø D A = (2, Ø, (9, Ø, Ø)) A Ø D I 2 Ø 3) A = (1, (4, Ø, Ø), (9, Ø, Ø)) I A Ø 05/06/2014 valor(A) = 1 izq(A) = (4, Ø, Ø) der(A) = (9, Ø, Ø) 1 4 D Ø 9 Ø Ø Ø 16 Árboles Binarios de Búsqueda (ABB) … El conjunto de valores de un ABB son todos los valores de los subárboles de A. Recursivamente: Ø no tiene ningún valor t es un valor de A si t = valor(A) o t es un valor de izq(A) o t es un valor de der(A) A = (1, (4, Ø, (6, Ø, Ø)), (9, Ø, Ø)) Ej.: I A 9 6 Ø Ø 05/06/2014 Ø D valor(A) = 1 izq(A) = (4, Ø, (6, Ø, Ø)) der(A) = (9, Ø, Ø) 1 4 Los valores de A son: 1, 4, 6 y 9 Ø Ø 17 Árbol Binario de Búsqueda ordenado Sea ≤ una relación transitiva y reflexiva sobre T. El AB A es ordenado respecto de ≤ si es Ø o si izq(A) y der(A) son ordenados respecto de ≤: todos los valores de izq(A) ≤ valor(A) ≤ todos los valores de der(A) A = (15, (10, (7, Ø, Ø), (12, (11, Ø, Ø), Ø) ), (30, (21, Ø, (25, Ø, Ø) ), Ø ) ) Ej.: 15 A I I = izq(A) 10 7 30 12 D = der(A) i. todos los valores izq(A) ≤ 15 ≤ todos los valores de der(A) ii. todos los valores izq(I) ≤ 10 ≤ todos los valores de der(I) 21 VEMOS QUE ESTE TIPO DE ARBOLES, PERMITE ALMACENAR INFORMACIÓN ORDENADA. 11 05/06/2014 25 18 Búsqueda en un ABB ordenado Sea T los números naturales. Podemos representar un conjunto de números naturales mediante un ABB ordenado sobre T, y en su orden natural, y efectuar x ∈ C mediante buscar(A). 15 A buscar(x, A) = Si (A = Ø) “NO” 10 30 Sino Si (x = valor (A)) “SI” Sino 7 12 21 Si (x < valor(A)) buscar(x, izq(A)) Sino buscar(x, der(A)) 11 Ej. a) 05/06/2014 25 buscar(2, (15, (10, (7, Ø, Ø), (12, (11, Ø, Ø), Ø) ), (30, (21, Ø, (25, Ø, Ø) ), Ø)) )= (animación en qmatica (AVL no balanceado)) = buscar(2, (10, (7, Ø , Ø ), (12, 11, Ø )) = buscar(2, (7, Ø , Ø)) = buscar(2, Ø)) 19 = NO Búsqueda en un ABB ordenado … buscar(x, A) = Si (A = Ø) “NO” Sino Si (x = valor (A)) “SI” Sino Si (x < valor(A)) buscar(x, izq(A)) Sino buscar(x, der(A)) A 15 10 7 12 11 Ej. b) 05/06/2014 30 21 25 buscar(21, (15, (10, (7, Ø, Ø), (12, (11, Ø, Ø), Ø) ), (30, (21, Ø, (25, Ø, Ø) ) , Ø))) = (Animación en qmatica y los alumnos en el pizarrón prueban) = buscar(21, (30, (21, Ø, (25, Ø, Ø) ) , Ø ) ) = buscar(21, (21, Ø, (25, Ø, Ø) )) = SI 20 Costo de búsqueda en un ABB en el peor caso A A A Árbol binario degenerado con “n” nodos a=n Árbol binario completo: Cada vértice interno (verdes) tiene exactamente dos hijos y los nodos terminales (negros) ningún hijo. Árbol binario completo con “n” nodos (bien equilibrado) a = log2 (n + 1) La esperanza (el caso promedio) para la búsqueda en un ABB construido al azar es, proporcional al logaritmo en base 2 del número de nodos. a = k (log2 (n)), k: constante menor que 2. (1,386) a = 1,386 (log2 (n) 05/06/2014 21 Gráfica comparativa de los costos de búsqueda en el peor caso a Árbol binario degenerado: a = n Árbol binario construido al azar: a = 1.386 lg(n) Árbol binario bien equilibrado: a = lg(n + 1) n 05/06/2014 22 Inserción en un ABB ordenado El objetivo es construir un ABB ordenado y que sirva para la búsqueda. El algoritmo que se presenta a continuación, se inicia con un ABB vacío, y construye un ABB ordenado cuando los objetos vienen en forma aleatoria. insertar(x, A) = Si (A = Ø) (x, Ø, Ø) Sino Si (x = valor (A)) A Sino Si (x < valor(A)) A(izq insertar(x, izq(A))) Sino A(der insertar(x, der(A))) El subárbol izquierdo, se reemplaza por lo que resulta de insertar por izquierda de A. Ej.: supongamos A = Ø y, se desea insertar la sucesión de nros. aleatorios: 82, 35, 24, 88, 5, 58, 57, ... 82: insertar(82, A = Ø) = (82, Ø, Ø) 05/06/2014 Después de insertar A 82 23 Inserción en un ABB ordenado … insertar(x, A) = Si (A = Ø) (x, Ø, Ø) Sino Si (x = valor (A)) A Sino Si (x < valor(A)) A(izq insertar(x, izq(A))) Sino A(der insertar(x, der(A))) 35: insertar(35, (82, Ø, Ø)) = A(izq insertar(35, izq(A))) A 82 izq(A) I Ø = A(izq insertar(35, Ø)) = A(izq (35, Ø , Ø)) Ø D Después de insertar Ø 35 der(A) Ø 05/06/2014 82 A = (82, (35, Ø , Ø) , Ø) Ø 24 Inserción en un ABB ordenado … insertar(x, A) = Si (A = Ø) (x, Ø, Ø) Sino Si (x = valor (A)) A Sino Si (x < valor(A)) A(izq insertar(x, izq(A))) Sino A(der insertar(x, der(A))) 24: insertar(24, (82, (35, Ø , Ø) , Ø)) = A(izq insertar(24, (35, Ø , Ø)))) = A(izq insertar(24, Ø)) A = A(izq (24, Ø , Ø)) 82 A 82 = (82, (35, (24, Ø , Ø) , Ø) , Ø) Ø 35 35 Después de insertar Ø 05/06/2014 Ø 24 25 Inserción en un ABB ordenado … insertar(x, A) = Si (A = Ø) (x, Ø, Ø) Sino Si (x = valor (A)) A Sino Si (x < valor(A)) A(izq insertar(x, izq(A))) Sino A(der insertar(x, der(A))) 88: insertar(88, (82, (35, (24, Ø , Ø) , Ø) , Ø)) = A(der insertar(88, Ø)) A 82 = A(der (88, Ø , Ø)) = (82, (35, (24, Ø , Ø) , Ø) , (88, Ø , Ø)) A 82 35 24 05/06/2014 Después de insertar 35 24 88 26 Inserción en un ABB ordenado … insertar(x, A) = Si (A = Ø) (x, Ø, Ø) Sino Si (x = valor (A)) A Sino Si (x < valor(A)) A(izq insertar(x, izq(A))) Sino A(der insertar(x, der(A))) 5: insertar(5, (82, (35, (24, Ø , Ø) , Ø) ,(88, Ø ,Ø)) Los alumnos en el pizarrón A 82 35 88 24 05/06/2014 27 Eliminación en un ABB ordenado: Ver en : http://es.wikipedia.org/wiki/%C3%81rbol_binario_de_b%C3%BAsqueda#Borrado Animación: www.qmatica.com AVL no balanceado Caso: 1: Borrar un nodo sin hijos o nodo hoja: Simplemente se borra y se establece a nulo el puntero de su padre. Ej: borrar 74 05/06/2014 28 Eliminación en un ABB ordenado: Ver en : http://es.wikipedia.org/wiki/%C3%81rbol_binario_de_b%C3%BAsqueda#Borrado Animación: www.qmatica.com AVL no balanceado Caso: 2: Borrar un nodo con un subárbol hijo (izq o der): Se borra el nodo y se asigna su subárbol hijo como subárbol de su padre. Ej: borrar 70 05/06/2014 29 Eliminación en un ABB ordenado: Ver en : http://es.wikipedia.org/wiki/%C3%81rbol_binario_de_b%C3%BAsqueda#Borrado Animación: www.qmatica.com AVL no balanceado Caso: 3: Borrar un nodo con dos subárboles hijos: Reemplazar el valor del nodo por el de su predecesor o por el de su sucesor en inorden y posteriormente borrar este nodo. Su predecesor en inorden será el nodo más a la derecha de su subárbol izquierdo (mayor nodo del subarbol izquierdo), y su sucesor el nodo más a la izquierda de su subárbol derecho (menor nodo del subarbol derecho). Ej: eliminar 59 (se reemplaza por 22 o por 70) 05/06/2014 30 Arboles: Hasta aquí vimos: Generales (A) Binarios (AB) De búsqueda ordenados (ABB) Arboles Recorridos Preorden Inorden Posorden Operaciones básicas: Búsqueda – Complejidad Inserción Eliminación 05/06/2014 UNIDAD 6: Contenedores No Lineales Arboles (Nivel de implementación) Apuntes de apoyo para clases teóricas. Para una conceptualización completa de los temas, los alumnos deberán asistir a las clases teóricas y completar con lectura del material bibliográfico propuesto. Tiempo de exposición: 2 hs 05/06/2014 32 Arboles Binarios (AB): Implementación (I) Con tipos recursivos (Haskell) a.Con asignación estática de memoria (Cursores) AB (II) Enlazada b.Con asignación dinámica de memoria (Punteros) (III) Secuencial: único array El principal requerimiento para cualquier representación de un árbol es: - tener acceso directo a la raíz y - dado cualquier nodo del árbol, que se tenga acceso directo a sus hijos. 05/06/2014 33 Arboles binarios (AB): (I) Implementación con tipos recursivos 05/06/2014 34 Arboles binarios (AB): (I) Implementación con tipos recursivos Un tipo Arbol sobre elementos del tipo a puede ser construído de dos formas: (1) Aplicando un constructor de dato (al que llamaremos Nodo) a tres parámetros: - el primero de tipo a (valor de la raíz) - el segundo de tipo Arbol sobre a (que será el subárbol I) - el tercero de tipo Arbol sobre a (que será el subárbol D) (2) Usando un constuctor de dato (al que llamaremos Vacio) para indicar árbol vacío. Código Haskell: data Arbol a = Nodo a (Arbol a) (Arbol a) | Vacio deriving Show 05/06/2014 35 Arboles binarios (AB): (I) Implementación con tipos recursivos Ejemplo I: Con la definición del tipo Arbol, determinamos una constante arbolChar cuyos nodos contendrán caracteres data Arbol a = Nodo a (Arbol a) (Arbol a) | Vacio deriving Show arbolChar :: Arbol Char arbolChar = Nodo ‘A’ (Nodo ‘B’ (Nodo ‘D’ Vacio Vacio) Vacio) (Nodo ‘C’ (Nodo ‘G’ Vacio Vacio) (Nodo ‘H’ Vacio Vacio)) 05/06/2014 36 Arboles binarios (AB): (I) Implementación con tipos recursivos Ejemplo II: Con la definición del tipo Arbol, determinamos una constante arbolInt cuyos nodos contendrán números enteros data Arbol a = Nodo a (Arbol a) (Arbol a) | Vacio deriving Show arbolInt :: Arbol Int arbolInt = Nodo 10 (Nodo 6 Vacio (Nodo 8 Vacio Vacio)) (Nodo 15 Vacio Vacio) (Programa Haskell: ABBConstante.hs) 05/06/2014 37 Arboles binarios (AB): Recorridos (I) Implementación con tipos recursivos preorden :: Arbol a -> [a] preorden Vacio = [] preorden (Nodo raiz izq der) = [raiz] ++ preorden izq ++ preorden der Programa Haskell: ABBconstante.hs preorden(arbolInt) = [10,6,8,15] 05/06/2014 38 Arboles binarios (AB): Recorridos (I) Implementación con tipos recursivos inorden :: Arbol a -> [a] inorden Vacio = [] inorden (Nodo raiz izq der) = inorden izq ++[raiz] ++ inorden der Programa Haskell: ABBConstante.hs inorden(arbolInt) = [6,8,10,15] 05/06/2014 39 Arboles binarios (AB): Recorridos (I) Implementación con tipos recursivos posorden :: Arbol a -> [a] posorden Vacio = [] posorden (Nodo raiz izq der) = posorden izq ++ posorden der ++ [raiz] Programa Haskell: ABBconstante.hs posorden(arbolInt) = [8,6,15,10] 05/06/2014 40 ABB: Algoritmo de Inserción (I) Implementación con tipos recursivos data Arbol a = Nodo a (Arbol a) (Arbol a) | Vacio deriving Show insertArbol :: Ord a => a -> Arbol a -> Arbol a insertArbol elemento Vacio = Nodo elemento Vacio Vacio insertArbol elemento (Nodo raiz izq der) | elemento < raiz = Nodo raiz (insertArbol elemento izq) der | elemento > raiz = Nodo raiz izq (insertArbol elemento der) | elemento == raiz = Nodo raiz izq der 05/06/2014 41 ABB: Algoritmo de construcción de un árbol BB a partir de una lista Ej: Programa Haskell: ABB.hs Entrada: Lista de elementos: [15,8,6,10] Salida: arbolInt : Nodo 10 (Nodo 6 Vacio (Nodo 8 Vacio Vacio)) (Nodo 15 Vacio Vacio) deListaaArbol :: Ord a => [a] -> Arbol a deListaaArbol = foldr insertArbol Vacio 4° en evaluar ( 3° en evaluar ( 2° en evaluar ( 1° en evaluar ) ) ) insertArbol 15 ( insertArbol 8 ( insertArbol 6 (insertArbol 10 Vacio))) 05/06/2014 42 ABB: algoritmo para buscar un elemento (I) Implementación con tipos recursivos buscar :: Ord a => a -> Arbol a -> Bool buscar x Vacio = False buscar x (Nodo raiz izq der) = if x == raiz then True else if x < raiz then buscar x izq else buscar x der Programa Haskell: ABB.hs >buscar 5 arbolInt (pertenece 5 arbolInt) False >buscar 8 arbolInt True 05/06/2014 43 Arboles binarios (AB): (II) Implementación con listas enlazadas con asignación estática de memoria (cursores) 05/06/2014 44 AB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) El árbol binario usa: - tres arrays paralelos, VALOR, IZQ y DER. Si un nodo N del árbol se encuentra en la posición K, entonces: - VALOR(K): contiene el dato del nodo N. - IZQ(K): contiene la localización del hijo izquierdo del nodo N. - DER(K): contiene la localización del hijo derecho del nodo N. - IZQ(0): contiene la localización de la raíz del árbol. Si el árbol está vacío, entonces IZQ(0) = 0 Si el árbol NO está vacío, entonces IZQ(0) 0 DER(0) contiene la localización del primer nodo vacío, y es el inicio de una lista enlazada de nodos disponibles sobre el Array DER 05/06/2014 45 AB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) Ejemplo: RAIZ Diagrama esquemático: A B C D 0 VALOR G 1 2 3 A D B G C H 0 5 0 IZQ 1 3 0 2 DER 4 9 0 0 05/06/2014 4 6 5 0 6 7 7 H 8 8 10 9 11 10 12 11 0 12 0 46 AB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) Estructura de datos en Pascal: Const M = 100 {cantidad total de memoria reservada} Type Tipo_elemento = Char; AB = Record Valor: Array [0..M] of tipo_elemento; Izq : Array [0..M] of Integer; Der: Array [0..M] of Integer; end; Var A: AB; Carpeta Arboles en Pascal: Programa Pascal: Arbolarr.pas Unit Pascal: ABBarray.pas AB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) Operaciones: Recorrido Preorden Procedure Preorden(A: AB, Raíz:Integer); Begin if Raiz <> 0 then Begin Write(A.Valor[Raíz], ’ ‘); Preorden(A, A.IZQ[Raíz]); Preorden(A, A.DER[Raiz]); end; End; Los recorridos Inorden y Posorden se dejan como ejercicio. Prueba del algoritmo en el Pizarrón. 0 VALOR 1 2 3 A D B G C H 0 5 0 IZQ 1 3 0 2 DER 4 9 0 0 4 6 5 0 6 7 7 8 8 10 9 11 10 12 11 0 12 0 ABB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) Operaciones: Búsqueda de un elemento: Function Buscar(t:Tipo_Elemento; A: AB; Raíz:Integer): Boolean; Begin if Raiz = 0 then Buscar:= False else if A.Valor[Raíz] = t then Buscar:=True else if A.Valor[Raíz] > t then Buscar:=Buscar(t, A, A.Izq[Raíz] ) else Buscar:=Buscar(t, A, A.Der[Raíz]); end; Prueba del algoritmo en el Pizarrón. 0 VALOR 1 2 3 A D B G C H 0 5 0 IZQ 1 3 0 2 DER 4 9 0 0 4 6 5 0 6 7 7 8 8 10 9 11 10 12 11 0 12 0 ABB: (II.a) Implementación Enlazada con Asignación Estática de Memoria (Cursores) Operaciones: Inserción de un elemento Procedure Insertar(t:tipo_elemento; VAR A:AB; Var Raiz:Integer;Var Nuevo:Integer); Var Prox_Nuevo:Integer; Begin If Raiz = 0 then begin {insertar el nuevo nodo} Nuevo := A.DER[0]; Prox_Nuevo := A.DER[Nuevo]; A.VALOR[Nuevo] := t; A.IZQ[Nuevo] := 0; A.DER[Nuevo] := 0; A.DER[0] := Prox_Nuevo; If A.IZQ[0] = 0 then A.IZQ[0] := Nuevo; end else If (t < A.VALOR[Raiz]) then insertar(t,A,A.IZQ[Raiz], A.IZQ[Raiz]); else if (t > A.VALOR[Raiz]) then insertar(t, A, A.DER[Raiz], A.DER[Raiz]); end; Arboles binarios (AB): (II) Implementación con listas enlazadas con asignación dinámica de memoria (punteros) 05/06/2014 51 ABB: (II.b) Implementación Enlazada con Asignación Dinámica de Memoria (Punteros) Ejemplo: A:RAIZ Diagrama esquemático: A B D C G H Estructura de datos en Pascal: Type Tipo_Elemento= char; {o el tipo que corresponda} AB = ^Nodo; Nodo = Record Valor : Tipo_Elemento; Izq: AB; Der: AB; End; Var A:AB; 05/06/2014 Carpeta Arboles en Pascal: Programa Pascal: ArbolBB.pas Unit Pascal: ABBpunte.pas 52 ABB: (II.b) Implementación Enlazada con Asignación Dinámica de Memoria (Punteros) Operaciones: Recorrido Preorden Procedure Preorden(A: AB); begin if A <> nil then begin Writel(A^.Valor); Preorden(A^.Izq); Preorden(A^.Der); end ; end; Prueba del algoritmo en el Pizarrón. Los recorridos Inorden y Posorden se dejan como ejercicio. ABB: (II.b) Implementación Enlazada con Asignación Dinámica de Memoria (Punteros) Operaciones: Búsqueda de un elemento en un ABB ordenado Function Buscar(t:Tipo_Elemento; A: AB): Boolean; Begin if A = Nil then Buscar:= False else if A^.Valor = t then Buscar:=True else if A^.Valor > t then Buscar:=Buscar(t, A^.Izq) else Buscar:= Buscar(t, A^.Der); end; Prueba del algoritmo en el Pizarrón. ABB: (II.b) Implementación Enlazada con Asignación Dinámica de Memoria (Punteros) Operaciones: Inserción de un elemento en un ABB ordenado Procedure Insertar(t:Tipo_Elemento; VAR A: AB); Var Nuevo:AB; Begin If A = Nil then begin {insertar el nuevo nodo} New(Nuevo); Nuevo^.Valor:= t; Nuevo^.IZQ := Nil; Nuevo^.DER:=Nil; A:= Nuevo; end else If (t < A^.VALOR) then Insertar(t, A^.IZQ) else if (t > A^.VALOR) then insertar(t, A^.DER); end; Prueba del algoritmo en el Pizarrón. Implementación Enlazada con Asignación Dinámica de Memoria (Punteros) Eliminación en un ABB ordenado: Procedure eliminar(A:AB; t: Tipo_Elemento); Var aux: AB; Begin if (A <> Nil) then begin if A^.Valor < t then eliminar(A^.Der, t) else if A^.Valor > t then eliminar (A^.Izq, t) else if A^.Valor = t)then begin aux := A; if A^.Izq = nil then A := A^.Der else if A^.Der = Nil then A := A^.Izq else reemplazar(A^.Izq, aux); dispose(aux); End; End; End; Procedure reemplazar(A: AB, aux: AB); Begin if A^.Der = Nil then begin aux^.Valor := A^.Valor; aux := A; A := A^.Izq End else reemplazar(A^.Der, aux) End; Arboles binarios (AB): (III) Implementación secuencial con un array 05/06/2014 57 ABB: (III) Implementación Secuencial (Array) Utiliza únicamente un array al que llamaremos ARBOL, de la siguiente manera: ARBOL a) La raíz del árbol se guarda en ARBOL[1]. 1 A b) Si un nodo N está en ARBOL[K], entonces: 2 B • Su hijo izquierdo está en ARBOL[2*K] 3 C • Su hijo derecho está en ARBOL[2*K + 1] 4 D 5 Nulo 6 G 7 H 8 Nulo 9 Nulo 10 Nulo 11 Nulo 12 Nulo 13 Nulo 14 Nulo c) Se usa 0 o un valor nulo para indicar subárbol vacío. Ejemplo: ABB: (III) Implementación Secuencial (Array) Definición de la Estructura de Datos y operaciones: Const = 100; {cantidad de memoria reservada para el arbol} Type Tipo_Elemento= char; {o el tipo que corresponda} AB = Array[1..M] of Tipo_Elemento; Var Arbol: AB; Operaciones: 1) 2) 3) 4) 5) Recorrido Preorden Recorrido Inorden Recorrido Posorden Buscar (t, Arbol) Insertar(t, Arbol) Se dejan como ejercicio Resumiendo, la implementación de Arboles binarios (I) Con tipos recursivos (Haskell) a.Con asignación estática de memoria (Cursores) AB (II) Enlazada b.Con asignación dinámica de memoria (Punteros) (III) Secuencial (1 array) 05/06/2014 60 Arboles: (próximas clases) A 2-3 Otros tipos de árboles AVL etc búsqueda Operaciones Inserción 05/06/2014 61