Fundamentos de Arboles
Fundamentos de Arboles
Fundamentos de Arboles
• Introducción
• Árbol genérico
– Definición y representación
• Árboles binarios
– Definición, implementación, aplicaciones y recorridos
• Árboles binarios de Búsqueda
– Definición y principales operaciones (insertar,
eliminar, buscar)
Introducción
B C D
E F G H I
Nomenclatura básica
typedef struct {
• Dos formas de implementar:
TipoDato dato;
struct NodoArbol *hijo1; – Tener un apuntador a cada uno
struct NodoArbol *hijo2; de los hijos. Problema cuando
:
struct NodoArbol *hijoN; NO sabemos el número de hijos.
} NodoArbol; – Mantener los hijos de un nodo en
una lista ligada. No hay ninguna
typedef struct { restricción sobre número de hijos.
TipoDato dato;
struct NodoArbol *hijo; • Así, un nodo del árbol consiste en
struct NodoArbol *hermano; un dato, un apuntador al primer
} NodoArbol;
hijo y un apuntador a la lista de
hermanos.
Árboles binarios
• Un árbol binario es un
árbol donde cada nodo Raíz
(a) (b)
¿Son completos?
¿Son llenos?
Implementación con arreglos
Posición 0 1 2 3 4 5 6 7 8 9 10 11
Padre -- 0 0 1 1 2 2 3 3 4 4 5
Hijo Izquierdo 1 3 5 7 9 11 -- -- -- -- -- --
Hijo Derecho 2 4 6 8 10 -- -- -- -- -- -- --
Hermano Izq -- -- 1 -- 3 -- 5 -- 7 -- 9 --
Hermano Der -- 2 -- 4 -- 6 -- 8 -- 10 -- --
Implementación con apuntadores
D S
L Y
A
Implementación
• Preorder:
– Visitar nodo void inorder(NodoArbol *nodo) {
if (nodo != NULL) {
– Visitar árbol izquierdo inorder(nodo->izq);
– Visitar árbol derecho visitar(nodo);
inorder(nodo->der);
• Inorder: }
}
– Visitar árbol izquierdo
– Visitar nodo
void postorder(NodoArbol *nodo)
– Visitar árbol derecho {
if (nodo != NULL) {
• Postorder: postorder(nodo->izq);
postorder(nodo->der);
– Visitar árbol izquierdo visitar(nodo);
– Visitar árbol derecho }
}
– Visitar nodo
Ejemplo de recorridos
B C
D E F G
Preorden: A, B, D, E, C, F, G
Inorden: D, B, E, A, F, C, G
Postorden: D, E, B, F, G, C, A
Árbol binario de búsqueda
• Es un árbol:
– Una colección de nodos que puede ser vacía, o que en su defecto consiste de
un nodo raíz R y un número finito de estructuras tipo árbol T1,…,Tk, llamados
subárboles, los cuales son disjuntos y sus respectivos nodos raíz están
conectados a R.
• Es binario:
– Cada nodo puede tener como máximo dos hijos, en otras palabras, cada nodo
sólo puede tener dos subárboles.
• Es de búsqueda porque:
– Los nodos están ordenados de manera conveniente para la búsqueda.
– Todos los elementos almacenados en el subárbol izquierdo de un nodo con valor
K, tienen valores < K.
– Todos los elementos almacenados en el sub-árbol derecho de un nodo con valor
K, tienen valores >= K.
Ejemplos
2 8 2 8 1 8
1 4 1 4 7
3 3 7 6
4
Operación INSERTAR
return nodo;
3 5
}
Ejercicio
6
boolean buscar(NodoArbol *nodo, int elem) {
if (nodo == NULL)
2 8
return FALSE;
else if (nodo->dato < elem)
return buscar(nodo->izq, elem);
1 4 else if (nodo->dato > elem)
return buscar(nodo->der, elem);
else return TRUE;
3 }
Buscando 4: VERDADERO
Buscando 7: FALSO
Operación ELIMINAR (1)
6 6
2 8 2 8
1 4 1 4
3 3
ELIMINAR (Caso complejo)
Eliminar nodo con dos hijos
Eliminar 2
6 6
2 8 3 8
1 4 1 4
copiar
valor
3 5 3 5
eliminar
1
2 8 3 8
1 4 1 4
3 5 3 5
2 Eliminar 3.
Eliminación de
3.5 3.5
un nodo con
un hijo.
Ejercicio
• Dibujar el árbol
resultante después de
aplicar las siguientes
eliminaciones de 20,
27, 14 y 22 al
siguiente árbol.
Implementación ELIMINAR