Professional Documents
Culture Documents
C
E F
ARBOLES BINARIOS
INTELIGENCIA ARTIFICIAL
ARBOL BINARIO
Un rbol binario es un rbol con raz en el que cada nodo tiene como mximo dos hijos.
A B D E F C
Estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo (subrbol izquierdo) y un hijo derecho (subrbol derecho).
Si algn hijo tiene como referencia a null, es decir que no almacena ningn dato, entonces este es llamado un nodo externo.
Conceptos Bsicos
Nodos
A
B D C
nodo.
Raz Nodos
que
Ramas Grado de A
c/nodo es adyacente al siguiente: - Solo existe 1 camino entre la raz y un nodo cualquier. - La distancia de un nodo a la raz
Conceptos Bsicos
A B
Nivel 0
Nivel 1
C
E F G
Hermanos: 2 mas nodos del mismo padre. Hojas: nodo sin hijos Nivel de un nodo: Distancia a la raz. Altura o profundidad de un rbol: Nivel de la hoja del camino mas largo desde la raz mas uno. La altura de un rbol vaco es 0.
Nivel 2
Padres Hijos Descendientes de B Ascendientes de E Hermano Hojas Altura del rbol Altura del Subrbol
Cada nodo de un rbol es la raz de un subrbol que se define por el nodo y todos los descendientes del nodo.
1
rbol lleno es un rbol en el que todos sus subrboles tienen n hijos (siendo n el grado del rbol) y todas sus hojas tienen la misma profundidad.
2 4 5
rbol completo es un rbol cuyos nodos corresponden a los nodos numerados (la numeracin se realiza desde la raz hacia las hojas y, en cada nivel, de izquierda a derecha) de 1 a n en el rbol lleno del mismo grado. Todo rbol lleno es completo
1 2 4 5 6 3 7
PROPIEDADES I
El mximo nmero de nodos en un nivel i de un rbol binario es N(i) = 2i - 1 , i 1 Demostracin Base induccin nivel 1 (raz): N(1) = 21 - 1 = 20 = 1 (se cumple) Paso inductivo Se desea probar N(i-1) N(i), es decir, a partir de la suposicin temporal de que N es cierta para i-1 debemos probar que es cierta para i nivel i - 1: N(i-1) = 2( i - 1 ) - 1 = 2i - 2 (suponemos cierto) nivel i : N(i) = N(i-1) * 2 = 2 i - 2 * 2 = 2i - 2 + 1 = 2i - 1
PROPIEDADES II
= 1 (2k - 1) / 2 - 1 = 2k 1
1
2 4 0 0 6 3 0 7
equilibrados. Dado que esta definicin ocurre raramente se aplica una definicin alternativa. fe=0 ARBOL EQUILIBRADO
Fe(3)=hI- hD =3-3=0
2
1 4 5
-1
3 0
rbol equilibrado
Fe(3)=hI- hD =3-2=1
Tipo de dato
Operaciones Altura: de un rbol Borrar: Elimina del rbol a un nodo dado Bsqueda: Buscar un elemento en un rbol de Bsqueda Construir: crea un rbol con un elemento raz y dos ramas. Copiar: crear una copia del rbol
Operaciones EsVacio: comprueba si el rbol tiene nodos Iguales: determinar si dos rboles son idnticos Insertar: inserta un nodo dentro de un rbol Izquierdo: da la rama izquierda de un rbol dado. Pertenece: Determina si un elemento pertenece a un rbol.
Crear rbol
Construir
Crea un rbol con un elemento raz y dos ramas, izquierda y derecha que son, a su vez, rboles
Es vaco
Raz
Izquierdo
Derecho
Borrar
Pertenece
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
ESTRUCTURA DE UN ARBOL
typedef struct nodo { int clave; struct nodo *izdo, *dcho; }Nodo;
typedef struct tArbol { int clave; tArbol hIzquierdo, hDerecho; } tArbol; tArbol rbol[NUMERO_DE_NODOS];
int rbol[NUMERO_DE_NODOS];
else
Insercion
void insertar(tArbol **a, int elem) { if (*a == NULL) { *a = (tArbol *) malloc(sizeof(tArbol)); (*a)->clave = elem; (*a)->hIzquierdo = NULL; (*a)->hDerecho = NULL; } else if ((*a)->clave < elem) insertar(&(*a)->hDerecho, elem); else if ((*a)->clave > elem) insertar(&(*a)->hIzquierdo, elem);
Actualizar
void reemplazar(tArbol **a, tArbol **aux) { if ((*a)->hDerecho == NULL) { (*aux)->clave = (*a)->clave; *aux = *a; *a = (*a)->hIzquierdo; } else reemplazar(&(*a)->hDerecho, aux); }
RECORRIDOS
Recorrer un rbol es visitar cada nodo del rbol una
sola vez
Recorrido de un rbol es la lista de etiquetas del rbol ordenadas segn se visitan los nodos
Recorridos en profundidad
Recorrido en preorden Recorrido en postorden Recorrido en inorden
RECORRIDOS
RECORRIDOS
RECORRIDOS
{
if (a != NULL) { tratar(a); //Realiza una operacin en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho); } }
RECORRIDOS
RECORRIDOS
RECORRIDOS EN PROFUNDIDAD (IV) RECORRIDO EN POSTORDEN void postorden(tArbol *a) { if (a != NULL) { postorden(a->hIzquiedo); postorden(a->hDerecho); tratar(a); //Realiza una operacin en nodo } }
RECORRIDOS
RECORRIDOS
RECORRIDOS
Consiste en visitar los nodos desde la raz hacia las hojas, y de izquierda a derecha dentro de cada nivel
En este caso el recorrido se realiza en orden por los distintos niveles del rbol. As, se comenzara tratando el nivel 1, que slo contiene el nodo raz, seguidamente el nivel 2, el 3 y as sucesivamente. En el rbol de la figura el recorrido en amplitud sera: 2, 7, 5, 2, 6, 9, 5, 11 y 4
RECORRIDOS
El esquema algoritmo para implementar un recorrido por niveles es exactamente el mismo que el utilizado en la versin iterativa del recorrido en preorden pero cambiando la
RECORRIDOS
EJEMPLO DE RECORRIDOS
B F
Postorden:
DHEBIFGCA Preorden: ABDEHCFIG
En un lenguaje con registros y referencias, los rboles binarios son construidos tpicamente con una estructura de nodos y punteros en la
cual se almacenan datos, cada uno de estos nodos tiene una referencia
o puntero a un nodo izquierdo y a un nodo derecho denominados hijos.
tiene menos de dos hijos, algunos de los punteros de los hijos pueden
ser definidos como nulos para indicar que no dispone de dicho nodo.
Los rboles binarios tambin pueden ser almacenados como una estructura de datos implcita en vectores, y si el rbol es un rbol
Tomaremos como notacin la siguiente: si un nodo tiene un ndice i, sus hijos se encuentran en ndices 2i + 1 y 2i + 2, mientras que sus padres (si los tiene) se encuentra en el ndice (partiendo de que la raz tenga
ndice cero).
Este mtodo tiene como ventajas el tener almacenados los datos de forma ms compacta y por tener una forma ms rpida y eficiente de localizar los datos en particular durante un preoden transversal.