Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tema 6. Árboles
1. Definición y operaciones
2. Implementación de árboles binarios
3. Recorrido de árboles binarios
4. Implementación de árboles AVL
5. Árboles n-arios: La estructura TRIE
6. Referencias
1. Definición y operaciones
Sub árbol
izquierdo
\ 3 \ 8 \
\ 4 \ hojas
1. Definición y operaciones
Estructura de dato
typedef struct arbol{
int info; //datos
struct arbol *p; //apuntador al padre
struct arbol *izq; //apuntador al hijo izq.
struct arbol *der; //apuntador al hijo der.
}tipoArbol;
Los árboles
binarios no
necesariamente
deben tener sus dos
hijos
1. Definición y operaciones
Árbol estrictamente
binario
Nivel 0
Profundidad=3
Nivel 1
Nivel de F=2
Altura de A=4
Nivel 2 Grado de C=2
Nivel 3
Insertar elementos
Eliminar elementos
Buscar elementos
Recorrer el árbol
Modificar elementos
Mínimo
Máximo
Predecedor
Sucesor
Guardar datos al archivo
Leer datos del archivo
2. Implementación de árboles binarios
x
Sea x un nodo en un árbol de búsqueda
binaria. Si y es un nodo del sub-árbol
izquierdo de x, entonces la clave de y clave
de x. Si z es un nodo del sub-árbol derecho yx
de x, entonces la clave de x clave de z.
xz
•Por ejemplo, dos árboles de búsqueda binaria son:
2
3
5
7
3 7
5 8
2 4 8
•La propiedad del árbol de búsqueda nos permite imprimir o recorrer sus nodos en el orden
de sus claves haciendo uso de un simple algoritmo recursivo.
2. Implementación de árboles binarios
void insertar(tipoArbolPtr *ra, int dato){ if(dato == ant->info)
tipoArbolPtr nuevo, ant, act; printf(“dato ya existe");
else {
nuevo=crearNodo(dato); if(dato<ant->info)
if(!nuevo) ant->izq=nuevo;
printf(“No hay memoria”); else
else { ant->der=nuevo;
if(*ra==NULL) nuevo->p=ant;
*ra=nuevo; }
else { }
ant=*ra; }
act = *ra; }
while (act != NULL && dato!=ant->info){
ant = act;
if ( dato < ant->info)
act = act->izq;
else
act= act->der;
}
Eliminación en un árbol de búsqueda binaria
Casos:
1. Que el elemento sea un nodo hoja.
2. Que el elemento sea un nodo sin hijo izquierdo o
derecho. En este caso, su único sub-árbol sube para
toma el lugar del nodo.
3. Que el elemento posea dos sub-árboles.
La eliminación puede ser por sucesor o predecesor.
Si es por sucesor, el sucesor no posee hijo izquierdo,
luego éste puede ser movido desde su posición a la
del elemento a eliminar, pero el nodo que se liberará
la memoria será el sucesor.
Eliminación en un árbol de búsqueda binaria: CASO
1 Nodo hoja.
15 15
5 16 5 16
3 3
12 20 12 20
z
10 13 18 23 10 18 23
6 6
7 7
Eliminación en un árbol de búsqueda binaria: CASO 2.
Nodo con un solo hijo
15 z 15
20
5 16 5
3 3
12 20 12 18 23
10 13 18 23 10 13
6 6
7 7
Eliminación en un árbol de búsqueda binaria: CASO 3.
Nodo con sus dos hijos (por sucesor)
15 15
z
z
5 16 5 16
3 3
12 20 12 20
10 13 18 23 10 13 18 23
6 6
7 7
15
15
z
5 16
6 16
3
6 12 20 3
12 20
10 13 18 23
10 13 18 23
7
7
Eliminar un elemento en un árbol de búsqueda binaria
Algoritmo:
Verificar que el árbol no esté vacío
Introducir el elemento a eliminar
Buscar el elemento
Si se encontró, imprimir el árbol actual indicando el elemento a
eliminar.
llamar a la función eliminar, pasándole como parámetros el
apuntador de la raíz del árbol por referencia y el apuntador del
elemento encontrado
La función eliminar debe considerar los tres casos de eliminación
Al eliminarlo, liberar la memoria del elemento y mostrar el árbol
sin el elemento.
3. Recorrido de árboles binarios
En orden
En preorden
En postorden
Ejemplo del recorrido en orden del árbol
En orden (recursivo)
Recorrer el árbol izquierdo en
orden 5
Visitar la raíz 3 7
Recorrer el árbol derecho en 2 8
4
orden
void enorden(tipoArbolPtr raiz){
if(raiz!=NULL){
enorden(raiz->izq);
printf("%3d",raiz->num); 234578
enorden(raiz->der);
}
}
Ejemplo del recorrido en preorden del árbol
En preorden
Visitar la raíz
Recorrer el árbol izquierdo en preorden
Recorrer el árbol derecho en preorden
5
3 7
2 4 8 532478
Ejemplo del recorrido en postorden del árbol
En postorden
Recorrer el árbol izquierdo en postorden
Recorrer el árbol derecho en postorden
Visitar la raíz
5
3 7
2 4 8 243875
Modificar algún elemento
Prototipo de función
void modificar(*raiz,dato);
Algoritmo:
1. Buscar el elemento
2. Si se encontró el elemento
Pedir que campo modificar
3. Sino
Informar que no se encontró el elemento
4. Fin
4. Árboles balanceados
Es un árbol binario de búsqueda que tiene como
objetivo realizar reacomodos o balanceos después de
inserciones o eliminaciones de elementos.
AVL
B
2-3
4. Árboles balanceados AVL
Estos árboles fueron nombrados por sus desarrolladores
Adelson-Velskii y Landis
Agrega la propiedad de altura para balancear el árbol en caso
necesario.
typedef struct arbolAvl{
int info;
int fe; //factor de equilibrio
struct arbolAvl *izq; //apuntador al hijo izq.
struct arbolAvl *der; //apuntador al hijo der.
}tipoArbolAvl;
Propiedad:
Que la altura de los subárboles de cada nodo difiere en
no más de 1. Esto es, la altura B=hd-hi: -1<=B<=1
Para mantenerlo balanceado es necesario saber la
altura o la diferencia en alturas de todos los
subárboles.
Se necesita un campo “FE”(Factor de Equilibrio) en
cada nodo, como un contador de la diferencia entre
las alturas de sus subárboles.
Principal característica: excelente tiempo de ejecución
para las operaciones de (búsqueda, altas y bajas)
Ejemplo, árbol balanceado AVL
Inserción en AVL
La inserción se hace siguiendo el camino de búsqueda
Puede aumentar la altura de una rama, por lo cual cambiará el factor de
equilibrio de dicho nodo.
Implica que se retornará por el camino de búsqueda para actualizar el
FE de cada nodo
Se puede llegar a desbalancear por tanto rebalancear.
10 10
0 -1
4 17 4 17
0 2 0
1
6 15 20
6 15 20 -1 0 0
0 0 0 5 Árbol A + Nodo 5
Árbol A
Reestructuración AVL
Hay 4 casos posibles a tener en cuenta, según donde se hizo la Inserción.
10
1. Inserción en el 2. Inserción en el 10
10 10
3. Inserción en el 4. Inserción en el
Subárbol DER De la Subárbol DER De la
Rama IZQ de 10 Rama IZQ de 10
n1->izq=n2–>der 60
n1
n2–>der=n1 -1
n->der=n2–>izq n2 40
0
n2–>izq=n
n=n2 La solución consiste
en subir el 40, pender
ID: izquierda–derecha el 30 a su izquierda y
n1->der=n2–>izq el 60 a su derecha.
n2–>izq=n1 n2 n1
n->izq=n2–>der
n2–>der=n 40
n=n2
30 60
n
Ejemplos de rotaciones simples de nodos
n->izq=n1–>der
Rotación simple a
n1->der=n
la Izquierda (II)
n=n1
Ra iz Raiz Ra iz
n n n1 n
5 -3 3
n1 -2 n1 -2
5
3 10
3 -1 10
-1
1 5
1 4
1 4
2
2 4 10
2
a) b) c)
Ejemplos de rotaciones simples de nodos
n->der=n1–>izq Raiz
n1->izq=n n1 n
n=n1 10
5 12
3 9 15
b)
Ejemplos de rotaciones dobles de nodos
Rotación izquierda derecha(ID) n1->der=n2–>izq
n2–>izq=n1
n->izq=n2–>der
n2–>der=n
n=n2
Raiz
n2 n
n1 7
5 9
1 6 8 10
b)
Ejemplos de rotaciones dobles de nodos
Rotación derecha izquierda (DI) n1->izq=n2–>der
n2–>der=n1
n->der=n2–>izq
n2–>izq=n
n=n2
Raiz
n2 n
7 n1
5 10
3 6 8 12
b)
Ejemplo: Crear el arbol AVL a partir de la inserción de
las siguientes claves.
Ejemplo de
representación
de un árbol
TRIE, con las
siguientes
palabras:
cris, cruz, javi,
juan, rafa,
raquel
5. Árboles n-arios: La estructura TRIE
Nodo-vector [4]
5. Árboles n-arios: La estructura TRIE
Nodo-lista
5. Árboles n-arios: La estructura TRIE