Escolar Documentos
Profissional Documentos
Cultura Documentos
• Los árboles se usan para organizar información.
1
ARBOLES
• En el mundo de la informática, los árboles se utilizan en
distintos ámbitos :
• Búsqueda en un disco duro.
• Estructura de directorios y subdirectorios en forma
de árbol para organizar la información.
• Esquemas para el desarrollo de algoritmos, tales como la
programación dinámica, esquema divide y vencerás, etc.
2
ARBOLES – Definiciones
• En forma general, se puede definir a un árbol como una
colección de elementos, llamados nodos, uno de los cuales
se distingue como raíz, junto con una relación, padrehijo,
que coloca a todos los nodos en una estructura jerárquica.
• Un árbol es una estructura de datos no lineal y homogénea
en el que cada nodo puede tener varios nodos sucesores,
pero tan sólo puede tener un nodo antecesor.
3
ARBOLES – Definiciones
• Un árbol dirigido es una estructura jerárquica, organizada
y dinámica:
• Jerárquica porque los componentes están en niveles
distintos.
• Organizada porque importa la forma en que este
dispuesto el contenido.
• Dinámica porque su forma, tamaño y contenido
pueden variar durante la ejecución.
• Un árbol se define recursivamente diciendo que es :
• O vacío,
• O con un componente raíz, al que están unidos un
número finito de árboles disjuntos.
4
n
Para este árbol, n es la raíz y T1,...,Tk son subárboles de la raíz,
donde los nodos n1,..., nk son conocidos como hijos de n. Note
que estos nodos son las raíces de los subárboles Ti.
5
A
A
B C B
D E F D
G Ejemplo 2
H
Ejemplo 1
Ejemplo 3
6
Raíz A
B C D
E F G H I J
K L M
Ejemplo 4
7
ARBOLES Algunas definiciones
• Nodo Padre de un nodo es aquel que apunta al nodo.
• En un árbol cada nodo sólo puede tener un padre.
• En el ejemplo 1, A es el padre de B y C, y a su vez, B es
el padre de D.
• Nodo Hijo es cualquier nodo apuntado por el nodo padre.
• Un nodo puede tener varios hijos.
• En el ejemplo 1, B y C son los nodos hijos de A y todos
los nodos tienen uno o dos hijos.
• Nodo Raíz es el único nodo del árbol que no tiene padre.
• En la representación utilizada, el nodo raíz es el que se
encuentra en la parte superior del árbol.
8
ARBOLES Algunas definiciones
• Si existe un camino del nodo 1 a un nodo 2, entonces 2 es
descendiente de 1 y 1 es antecesor o ancestro de 2.
• La raíz es el único nodo sin antecesor.
• Los nodos que no tienen descendientes, se llaman hojas del
árbol o nodos terminales.
9
ARBOLES Algunas definiciones
• Hojas son todos los nodos que no tienen hijos.
• En la representación del ejemplo 1 son hojas los nodos
situados en la parte inferior: D, G, H y F.
• Nodos Interiores son los nodos que no son ni el nodo raíz, ni
nodos hoja.
• En el ejemplo 1, son nodos interiores B, C y E.
• Camino si n1, ..., nk es una secuencia de nodos en un árbol tal
que ni es padre de ni+1 para 1≤ i < k, entonces tal secuencia es
llamada camino desde el nodo n1 al nodo nk .
• En el ejemplo 1 ABD es un camino, al igual que EG y
CEH.
10
ARBOLES Algunas definiciones
• Se define el largo del camino como el número de enlaces que
hay desde el primer nodo hasta el último,
• el número de nodos menos uno.
• Rama es un camino desde el nodo raíz a una hoja.
• En el ejemplo 1, ACEG y AC F son ramas.
11
ARBOLES Algunas definiciones
• Altura de un árbol es el máximo número de enlaces de las
ramas del árbol.
• La altura del árbol del ejemplo 1 es 3, ya que esa es la
longitud de la rama ACEH, que junto a ACEG son
las más largas.
12
ARBOLES Algunas definiciones
• Grado de un árbol es el número máximo de hijos que tienen
los nodos del árbol.
• En el ejemplo 4 el árbol es de grado tres.
• Una lista no es más que un árbol de grado uno, tal y como
se puede ver en los ejemplos 2 y 3.
• Grado de un nodo : Es el número de subárboles (llamados
nodos hijos) de un nodo.
• El grado de las hojas es cero.
• Profundidad de un nodo : Es el largo del único camino desde
la raíz a ese nodo.
13
ARBOLES Algunas definiciones
• Nivel de un nodo, es el número de nodos del camino desde la
raíz hasta dicho nodo.
• Por convención al nodo raíz de árbol se le considera el
nivel cero del árbol.
• En el árbol del ejemplo 1, A tiene nivel 1; B y C tienen nivel
2; D, E y F tienen nivel 3 y G y H tienen nivel 4.
• Bosque colección de dos o más árboles :
C
B
E F
D
G H
14
ARBOLES Algunas definiciones
Árbol completo : si todo nodo no terminal tiene asociado
exactamente el grado del árbol.
10
15 20
25 12 14 9
2 14 17 4 37 34
15
ARBOLES Algunas definiciones
Árbol lleno : si es completo y todas sus hojas están en el
mismo nivel.
10
15 20
25 12 14 9
2 14 5 16 17 4 37 34
16
ARBOLES Algunas definiciones
Árbol casilleno: Es cuando un árbol esta lleno hasta el
penúltimo nivel y las hojas que están en el
último nivel se ubican lo más a la izquierda
posible.
10
15 20
25 12 14 9
2 14 5
17
ARBOLES Algunas definiciones
Árboles Isomorfos: Se dice que dos árboles son isomorfos si
poseen una estructura idéntica, pero no
necesariamente los mismos elementos.
15
1
25 12
5 34
2 14
9 23
18
ARBOLES Algunas definiciones
Árboles semejantes: Son aquellos árboles que poseen los
mismos elementos, pero no
necesariamente la misma estructura de
árboles. Los elementos no deben estar
necesariamente en el mismo orden.
15 14
25 12 25 2
2 14 12 15
19
Arboles Operaciones
• El conjunto de operaciones que se pueden realizar sobre un
árbol es parecido a las realizadas sobre otras estructuras de
datos, más otras propias de árboles:
• Buscar un elemento.
• Insertar un elemento.
• Borrar un elemento.
• Izquierda.
• Derecha.
• Comprobar si un árbol está vacío.
• Calcular el número de nodos.
• Comprobar si el nodo es hoja.
• Calcular la altura de un nodo.
• Calcular la altura de un árbol.
• Etc. 20
Arboles Representaciones
• Formas básicas de representar los árboles :
• Arreglos.
• La representación hijo más izquierdo y hermano derecho.
• La representación hijo izquierdo, hijo derecho.
• Listas generalizadas.
21
Arboles – Representaciones :
Hijo izquierdo, Hijo derecho
• Esta representación se basa en una estructura de nodos con dos
punteros :
• Uno destinado al hijo izquierdo y
• Otro al hijo derecho.
B C
D E F
izq info der
G A
H
B C
D E F
G H
23
ARBOLES
• Se definen en una gran variedad de tipos y categorías.
• De acuerdo al número de arcos que parten de cada nodo en un
árbol, este se puede clasificar en :
• Árboles Binarios,
• Árboles de Búsqueda Binarios,
• Árboles AVL
• Árboles23,
• Árboles234,
• Árboles RojoNegro,
• Árboles B, etc.
24
Arboles Binarios
B C
D E F
G
H
25
Arboles Binarios
Definición 1 :
Un Árbol binario es un árbol de grado 2.
Definición 2 :
Un Árbol binario es aquel que :
a) Es vacío, ó
b) Está formado por un nodo cuyos subárboles izquierdo y
derecho son a su vez árboles binarios.
26
Arboles Binarios Implementaciones
Implementación dinámica mediante punteros
• La representación de cada nodo en esta implementación será
una estructura de tres campos, los enlaces serán punteros a los
subárboles izquierdo y derecho de cada nodo.
• Estructura de datos en C para definir un árbol binario :
struct nodoAr {
tElemento info;
struct nodoAr * izq, *der;
} info
izq info der
typedef nodoAr tAB;
izq der
27
Arboles Binarios Implementaciones
• De este modo, un árbol se identifica con un puntero a su nodo
raíz, a través del cual se puede acceder a sus nodos.
B C
D E F
G H
28
Arboles Binarios Implementaciones
void CrearArbol (tAB **A)
{
*A = Null;
}
29
Arboles Binarios Implementaciones
boolean ArbolVacio (tAB *A)
{
return (A == Null);
}
30
Arboles Binarios Implementaciones
void SubArbolIzq (tAB *A; tAB **subizq)
{
*subizq = A>izq;
}
• Para acceder al subárbol izquierdo de un árbol, basta
con acceder al puntero al hijo izquierdo de su nodo
raíz.
31
Arboles Binarios Implementaciones
void SubArbolDer (tAB *A; tAB **subder)
{
*subder = A>der;
}
• Para acceder al subárbol derecho de un árbol, basta
con acceder al puntero al hijo derecho de su nodo
raíz.
32
Arboles Binarios Implementaciones
void DatoRaiz (tAB *A, tElemento *d)
{ // pasado como parámetro
d = A>info ;
}
• Para acceder al dato contenido en el nodo raíz de un
árbol, basta con acceder al campo info del
registro que lo representa.
tElemento DatoRaiz (TArbol *A)
{ // retornado como valor
return( A>info );
}
33
Recorridos en Arboles Binarios
• En el caso de los árboles binarios, el recorrido de sus nodos
se debe realizar en tres pasos:
• acceder a la información de un nodo dado,
• acceder a la información del subárbol izquierdo de dicho
nodo,
• acceder a la información del subárbol derecho de dicho
nodo.
• Obs.: estos tres pasos no indican una secuencia a seguir.
acceder será sinónimo de imprimir.
• Existen tres tipos básicos de recorridos: PreOrden, InOrden,
PostOrden.
34
Recorridos en Arboles Binarios
• Preorden: primero se accede a la información del nodo,
después al subárbol izquierdo y después al subárbol derecho.
A A B D C E G H F
B C
D E F
G
H
35
Arboles Binarios Implementación
void PreOrden (tAB *A)
{
if (A != NULL)
{ printf("%d ",A>info); // suponiendo que tElemento es int
PreOrden(A>izq); // recorrido por la izquierda
PreOrden(A>der); // recorrido por la derecha
}
}
36
Recorridos en Arboles Binarios
• Inorden: primero se accede a la información del subárbol
izquierdo, después se accede a la información del nodo y, por
último, se accede a la información del subárbol derecho.
A
D B A G E H C F
B C
D E F
G
H
37
Arboles Binarios Implementación
void InOrden (tAB *A)
{
if (A != NULL)
{ InOrden(A>izq); // recorrido por la izquierda
printf("%d ",A>info); // suponiendo que tElemento es int
InOrden(A>der); // recorrido por la derecha
}
}
38
Recorridos en Arboles Binarios
• Postorden: primero se accede a la información del subárbol
izquierdo, después a la del subárbol derecho y, por último, se
accede a la información del nodo.
B C
D E F
G
H D B G H E F C A
39
Arboles Binarios Implementación
void PostOrden (tAB *A)
{
if (A != NULL)
{ PostOrden(A>izq); // recorrido por la izquierda
PostOrden(A>der); // recorrido por la derecha
printf("%d ",A>info); // suponiendo que tElemento es int
}
}
40
Reconstrucción de Arboles
• Es posible reconstruir la estructura de un árbol dado su
recorrido inorden y postorden ó inorden y preorden.
• inorden es imprescindible.
41
Reconstrucción de Arboles
Ejemplo : dados los siguientes recorridos
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
reconstruir el árbol binario, que originó ambos recorridos.
42
Reconstrucción de Arboles
Solución :
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Paso 1:
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
43
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Paso 2:
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
50
44
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Pasos 3 y 4:
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
30 – 60 80 – 70 – 40 50
45
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Paso 5 :
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
30 – 60 80 – 70 – 40 50
80 – 70
46
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Pasos 6 y 7:
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
30 – 60 80 – 70 – 40 50
80 – 70
80
47
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10
Pasos 8 y 9:
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
30 – 60 – 20 – 80 – 70 – 40 90 – 50
30 – 60 80 – 70 – 40 50
60 80 – 70
80
48
Reconstrucción de Arboles
Finalmente :
10
20 90
30 40 50
60 70
80
49
Reconstrucción de Arboles
• Ejemplo :
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
50
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 1:
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
50 – 30 – 60 – 20 – 80 – 70 – 90 – 40
51
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 2:
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
50 – 30 – 60 – 20 – 80 – 70 – 90 – 40
50 – 30 – 60 80 – 70 – 90 – 40
52
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Pasos 3, 4 y 5:
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
50 – 30 – 60 – 20 – 80 – 70 – 90 – 40
50 – 30 – 60 80 – 70 – 90 – 40
50 60
53
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 6:
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
50 – 30 – 60 – 20 – 80 – 70 – 90– 40
50 – 30 – 60 80 – 90 – 70 – 40
50 60 80 – 70 – 90
54
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Pasos 7, 8 y 9 :
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
50 – 30 – 60 – 20 – 80 – 70 – 90– 40
50 – 30 – 60 80 – 70 – 40 – 90
50 60 80 – 70 – 90
80 90
55
Reconstrucción de Arboles
Finalmente :
10
20
30 40
50 60 70
80 90
56
Ejercicios
int ContarHojas (tAB *arb)
{ // Determina el número de hojas en un árbol binario.
if (arb == NULL)
return 0;
else
if( (arb >izq == NULL) && (arb >der == NULL) )
return 1;
else
return(ContarHojas(arb >izq) + ContarHojas(arb >der));
}
57
Ejercicios
int altura (tAB *arb)
{ // Calcula la altura de un árbol binario.
if arb == NULL
return 1;
else
return (1+ max(altura(arb > izq),altura(arb > der)));
}
58
Ejercicios
struct Nodo {
tElemento info;
struct Nodo *izq, *der;
}
struct Nodo *Copiar(struct Nodo *T)
// copia ArBin T, retornando dirección de copia
{ struct Nodo *Q =NULL;
if (T ! (NULL)
{ Q = (struct Nodo *) malloc (sizeof (struct Nodo));
Q > dato = T > dato;
Q > izq = Copiar (T > izq);
Q > der = Copiar (T > der);
}
return Q;
}
59
Ejercicios
int Igual (struct Nodo *S, struct Nodo *T)
// verifica que los árboles S y T sean iguales : true (1)
{
int ans = 0;
if ((S = NULL) && (T=NULL))
ans = 1;
if ((S!= NULL) && (T!=NULL))
{ if (S > dato == T > dato)
ans = Igual (S > izq, T > izq);
if (ans)
ans = Igual (S > der, T > der);
}
return ans;
}
60
Ejercicios Propuestos
• Escribir una función en C para calcular el peso de un árbol
binario. (El peso se define como el número de nodos).
• Escribir una función en C para determinar si un elemento
cualquiera pertenece a un árbol binario.
• Escribir una función en C para calcular el número de veces
que aparece un elemento en un árbol binario.
61
Aplicación
• Una de las aplicaciones de la correspondencia entre árboles
y árboles binarios es la representación de expresiones
aritméticas usando NOTACION POLACA.
• Usada en compiladores, ya que es más fácil traducir de
notación polaca a instrucciones de máquina.
62
Aplicación
• Para el siguiente árbol de expresión algebraica:
+
* E
/ D
A ** Inorden : A/B** C* D+E (infijo)
Preorden : +*/A**BCDE (prefijo)
B C Postorden : ABC**/ D*E+ (postfijo)
63
Ejercicios Propuestos
1. Dibujar el árbol binario que representa las siguientes expresiones:
a) a * (b + c / ((x 1) * (y + 4))) + x * x 24
b) a0 + x * (a1 + x * (a2 + x * a3))
1. Reconstruir un árbol binario a partir de los siguientes recorridos :
a) Preorden: 2, 5, 3, 9, 7, 1, 6, 4, 8.
Inorden: 9, 3, 7, 5, 1, 2, 6, 8, 4.
b) Inorden: 5, 6, 12, 10, 1, 9, 13, 4, 8, 2, 7, 3, 11.
Postorden: 6, 5, 10, 9, 1, 13, 12, 2, 8, 3, 11, 7, 4.
64
Ejercicios
Hacer una función en C que escriba todos los caminos que van desde la raíz
a cada una de las hojas, suponiendo que cada nodo contiene un carácter.
Por ejemplo, en el árbol :
deberían obtenerse
O I
las palabras:
L K T R S
MOLER, MOLA,
MOKA, MOTA, E A A A R O A T
MIRRA, MIRO,
MISA y MÍSTICO. O I
R A
O
65
Arboles de Búsqueda Binaria
15
9 27
3 21 30
18
24
66
ABB Definición
• No basta con almacenar la información en un árbol para
facilitar la búsqueda, se debe utilizar un tipo especial de
árbol: un árbol binario de búsqueda.
• Si además se quiere que la búsqueda sea lo más eficiente
posible se deben utilizar árboles de búsqueda binarios
equilibrados.
67
ABB Definición
Un árbol binario de búsqueda es una estructura de datos en el
que para todos sus nodos, el hijo izquierdo, si existe, contiene
un valor menor que el nodo padre y el hijo derecho, si existe,
contiene un valor mayor que el del nodo padre.
15
9 27
3 21 30
18
24
68
ABB – Búsqueda de un elemento
• Suponga que se busca un elemento x en el árbol.
• Lo primero que será comprobar si se encuentra en el nodo
raíz.
• Si no es así, si el elemento buscado es menor que el
contenido en el nodo raíz se deduce que, de estar en el árbol,
se encuentra en el subárbol izquierdo.
• Si el elemento buscado es mayor que el contenido en el nodo
raíz se deduce que, de estar en el árbol, se encuentra en el
subárbol derecho.
• Para continuar la búsqueda en el subárbol adecuado se aplica
recursivamente el mismo razonamiento.
69
ABB – Búsqueda de un elemento
• El esquema del algoritmo BuscarNodo será el siguiente :
1. Si el valor del nodo actual es igual al valor buscado
encontrado.
2. Si el valor buscado es menor que el del nodo actual
inspeccionar el subárbol izquierdo.
3. Si el valor buscado es mayor que el del nodo actual
inspeccionar el subárbol derecho.
4. Si el valor no está en el árbol no encontrado.
70
ABB – Búsqueda de un elemento Implementación :
tAB* BuscarNodo (tAB *A; tElemento x)
{ tAB p;
BOOLEAN enc;
p = A;
enc = false;
while ( ( ! enc) && ( p!= NULL ) )
{ enc = p > info == x;
if ! enc
if (x < p > info ) p = SubArbolIzq(p);
else p = SubArbolDer(p);
}
Si el resultado devuelto es NULL, significa
return p; que no se ha encontrado el elemento buscado
}
71
ABB Inserción
• La inserción de un elemento está basado en el algoritmo de
búsqueda.
• Se determina si el elemento está en el árbol,
• Si está, no se inserta.
• En caso contrario, se agrega como hoja.
72
ABB Inserción
• Ciclo : mientras no sea un árbol vacío o hasta que se
encuentre el elemento.
• Si el valor del nodo raíz es mayor que el elemento buscado,
continuar la búsqueda en el árbol izquierdo:
• Padre = nodo
• nodo = nodo > izq
• Si el valor del nodo raíz es menor que el elemento buscado,
continuar la búsqueda en el árbol derecho:
• Padre = nodo
• nodo = nodo > der
73
ABB – Ejercicios
Ejemplo: Dadas las siguientes secuencias, construir el ABB
correspondiente :
1. 10 – 5 – 7 – 14 – 12 – 18 – 15
2. Determinar recorrido InOrden – Postorden – PreOrden.
3. 15 – 18 – 4 – 5 – 10 – 12 – 7
4. Determinar recorrido en InOrden – Postorden – PreOrden.
74
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15
Arbol vacío Insertar 10 :
NULL 10
Insertar 5 : Insertar 7 :
10
10
5
5
75
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15
10 10 10
5 14 5 14 5 14
7 7 12 7 12 18
76
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15
Insertar 15 :
InOrden : 5 – 7 – 10 – 12 – 14 – 15 18
10
5 14
7 12 18
15
77
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7
Arbol vacío Insertar 15 :
NULL 15
Insertar 18 : Insertar 4 :
15
15
4 18
18
78
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7
15 15 15
4 18 4 18 4 18
5 5 5
10 10
12
79
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7
Insertar 7 :
15
InOrden : 4 – 5 – 7 – 10 – 12 – 15 – 18
4 18
10
7 12
80
ABB – Inserción Implementación
void InsertarNodo (tAB **A; tElemento x)
{ if (*A == NULL )
{ *A = (tAB *) malloc(sizeof(tAB));
(*A )>info = x;
(*A )>izq = NULL;
(*A )>der = NULL;
}
else
if( (*A) > info > x)
InsertarNodo(&(*A) > izq, x);
else
if( (*A) > info < x)
I InsertarNodo(&(*A) > der, x);
else
printf( “Dato repetido “); 81
}
ABB – Eliminar
1. Buscar el nodo que se desea borrar.
2. Si se encuentra el nodo hay que contemplar tres casos
posibles:
a) Si el nodo a borrar no tiene hijos se libera el espacio
que ocupa.
b) Si el nodo a borrar tiene un hijo este hijo ocupa la
posición ocupada por el nodo borrar.
c) Si el nodo a borrar tiene dos hijos
i. Se busca el máximo de la rama izquierda, o el
mínimo de la rama derecha.
ii. Se sustituye el nodo a borrar por el nodo
encontrado (máximo o mínimo).
iii. Se elimina el nodo copiado (máximo o mínimo).
82
ABB – Eliminar; caso a
Si el nodo a borrar no tiene hijos se libera el espacio que ocupa.
Árbol Inicial:
Árbol Final:
15 15
9 27 9 27
21 36 21 36
12 12
18 24 18
Suprimir 24
83
ABB Eliminar ; caso b
Si el nodo a borrar tiene un hijo este hijo ocupa la posición
ocupada por el nodo borrar.
Árbol Inicial: Árbol Final:
15
15
9 27
9 27
21 36
12 18
12 36
18
Suprimir 21
84
ABB – Eliminar; caso c
Si el nodo a borrar tiene dos hijos
i. Se busca el máximo de la rama izquierda o el mínimo de la
rama derecha.
ii. Se sustituye el nodo a borrar por el nodo encontrado.
Árbol Inicial: Árbol Final:
Suprimir 15 12
15
9 27
9 27
18 36
18 36
12
85
ABB – Ejercicios
Para el árbol inicial, eliminar las claves 24 – 21 – 15 – 27 – 12.
Arbol inicial : Suprimir 24 (caso a):
15 15
9 27 9 27
12 21 36 12 21 36
18 24 18
86
ABB – Ejercicios
Arbol inicial : Suprimir 21 (caso b):
15 15
9 27 9 27
12 21 36 12 18 36
18
87
ABB – Ejercicios Arbol inicial :
15
Suprimir 15 (caso c):
9 27
Dos soluciones posibles :
12 18 36
12
9 27
18
18 36
9 27
12 36
88
ABB – Ejercicios
Arbol inicial : Suprimir 27 (caso c):
12
12
9 18
9 27
36
18 36
89
ABB – Ejercicios
Arbol inicial : Suprimir 12 (caso c):
12 9
9 18 18
36
36
90