Árbol BB - WordPress.com

Anuncio
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
Descargar