arboles binarios - diapositivas (ia).pptx
Post on 30-Jul-2015
254 Views
Preview:
TRANSCRIPT
ARBOLES BINARIOSINTELIGENCIA ARTIFICIAL
A
B C
D E F G
ARBOL BINARIO
• Un árbol binario es un árbol con raíz en el que
cada nodo tiene como máximo dos hijos.
• Estructura de datos en la cual cada nodo siempre
tiene un hijo izquierdo (subárbol izquierdo) y un hijo
derecho (subárbol derecho).
• No pueden tener más de dos hijos (de ahí el nombre
"binario").
A
B C
D E F
• Si algún hijo tiene como referencia a null, es decir que no almacena
ningún dato, entonces este es llamado un nodo externo.
• En el caso contrario el hijo es llamado un nodo interno.
Conceptos Básicos
• Nodos
Conj. finito de elementos.
• Ramas
Conj. finito de líneas dirigidas, que
conectan nodos
• Grado del Nodo
Nro. De ramas descendentes con un
nodo.
• Raíz
Primer nodo de un árbol no vacío
• Camino
Secuencia de nodos en los que
c/nodo es adyacente al siguiente:
- Solo existe 1 camino entre la raíz y
un nodo cualquier.
- La distancia de un nodo a la raíz
determina la rapidez de búsqueda.
A
B C
D E F G
Raíz A
Nodos A,B,C, …
Ramas (A,B),(B,D)
Grado de A G(A)=2
G(E)=0
G(C)=2
Conceptos Básicos
• Padre: Tiene nodos sucesores
• Hijos: Nodos sucesores
• Descendientes: Hijos de los hijos.
• Ascendientes: Los padres y abuelos de un
nodo hijo.
• Hermanos: 2 ó mas nodos del mismo padre.
• Hojas: nodo sin hijos
• Nivel de un nodo: Distancia a la raíz.
• Altura o profundidad de un árbol: Nivel
de la hoja del camino mas largo desde la raíz
mas uno. – La altura de un árbol vacío es 0.
• Subárbol: Cualquier estructura conectada
por debajo del raíz.
Cada nodo de un árbol es la raíz de un subárbol
que se define por el nodo y todos los
descendientes del nodo.
A
B C
D E F G
Padres A, B, C
Hijos De A (B y C)
Descendientes de B D y E
Ascendientes de E B y A
Hermano {B,C}, {F, G}
Hojas D, E, F, G
Altura del árbol 3
Altura del Subárbol de B es 2
Nivel 0
Nivel 1
Nivel 2
TIPO DE ARBOLES BINARIOS
• Árbol lleno es un árbol en el que
todos sus subárboles tienen n hijos
(siendo n el grado del árbol) y todas
sus hojas tienen la misma profundidad.
• Árbol completo es un árbol cuyos
nodos corresponden a los nodos
numerados (la numeración se realiza
desde la raíz 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 3
4 5 6 7
1
2 3
4 5
PROPIEDADES I
El máximo número de nodos en un nivel i de un árbol binario es
N(i) = 2i - 1 , i ≥ 1
Demostración
Base inducción
nivel 1 (raíz): N(1) = 21 - 1 = 20 = 1 (se cumple)
Paso inductivo
Se desea probar N(i-1) ⇒ N(i), es decir, a partir de la suposición
“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
El máximo número de nodos en un árbol binario de altura k esN(k) = 2k - 1, k ≥ 1
Demostración
nivel 1: 2(1) - 1 = 1 nodonivel 2: 2(2) - 1 = 3 nodosnivel 3: 2(3) - 1 = 5 nodos. . . nivel k: 2k - 1 nodos
Altura k = 2(1) - 1 + 2(2) - 1 + ... + 2(k) - 1 =
(S.P.G. ( r = 2, a1 = 20, n = k))
= 1 (2k - 1) / 2 - 1 = 2k – 1
EQUILIBRIO DE ARBOL BINARIO
• La distancia de un nodo al nodo raíz determina la
eficiencia con la que puede ser localizado.
• Por ejemplo, dado cualquier nodo de un árbol, a sus hijos
se puede acceder siguiendo sólo un camino de bifurcación
o de ramas, el que conduce al nodo deseado. De modo
similar, los nodos a nivel 2 un árbol sólo pueden ser
accedidos siguiendo sólo dos ramas del árbol.
EQUILIBRIO DE ARBOL BINARIO
FACTOR DE EQUILIBRIO
El factor de equilibrio de un árbol binario es la diferencia en altura
entre los subárboles derecho e izquierdo.
Si la altura del subárbol izquierdo es hI, y la altura del subárbol
derecho es hD, entonces el factor de equilibrio del árbol B se
determina por la siguiente fórmula.
B= hD –hI
EQUILIBRIO DE ARBOL BINARIO
• ARBOL PERFECTAMENTE EQUILIBRADO
si su equilibrio o balance es cero, y sus
subárboles son también perfectamente
equilibrados. Dado que esta definición ocurre
raramente se aplica una definición alternativa. fe=0
ARBOL EQUILIBRADO
Un árbol binario está equilibrado si la altura de
sus subárboles difiere en no más de uno (su
factor de equilibrio es -1, 01, +1) y sus
subárboles son también equilibrados.
–1<fe<1 Ej: fe=3–2=1
1
2 3
4 5 6 7
1
2 3
4 5
0
0 0
-1
1 0
Árbol perfectamente equilibrado
Árbol equilibrado
Fe(3)=hI- hD =3-3=0
Fe(3)=hI- hD =3-2=1
TDA ÁRBOL BINARIO: Especificación
• Tipo de dato
• Nodos del árbol
• Operaciones
– Altura: de un árbol
– Borrar: Elimina del árbol a un nodo dado
– Búsqueda: Buscar un elemento en un Árbol de Búsqueda
– Construir: crea un árbol con un elemento raíz y dos ramas.
– Copiar: crear una copia del árbol
– Crear Arbol: Inicia un árbol vacío
– Derecho: da la rama derecha de un árbol dado.
– Elementos: determina el número de elementos del árbol
TDA ÁRBOL BINARIO: Especificación
• Operaciones
– EsVacio: comprueba si el árbol tiene nodos
– Iguales: determinar si dos árboles son idénticos
– 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.
– Recorrer: el árbol de acuerdo algunos de los criterios
– Profundidad: determina la profundidad de un árbol dado
– Raiz:devuelve el nodo raíz.
– ….
TDA ÁRBOL BINARIO: Especificación
Crear árbol Inicia el árbol como vacío
Crea un árbol con un elemento raíz y dos ramas, izquierda y derecha que son, a su vez,
árboles
Comprueba si el árbol no tiene nodos
Construir
Es vacío
TDA ÁRBOL BINARIO: Especificación
Raíz Devuelve el nodo raíz
Obtiene la rama subárbol izquierdo de un árbol dado
Obtiene la rama subárbol Derecho de un árbol dado
Izquierdo
Derecho
TDA ÁRBOL BINARIO: Especificación
Borrar Elimina del árbol el nodo con un elemento determinado
Determina si un elemento se encuentra en el árbolPertenec
e
Estructura de un Árbol binario
• La estructura de un árbol binario se construye
con nodos.
• Cada nodo debe contener el campo dato (datos
a almacenar) y dos campos de tipo puntero, uno
al subárbol izquierdo y otro al subárbol derecho,
que se conocen como puntero izquierdo y
puntero derecho respectivamente,
• Un valor NULL indica un árbol o un subárbol
vacío.
Estructura de un Árbol binario
A
B C
D NULL NULL E NULL NULL F NULL NULL G NULL
NULL H NULL
ESTRUCTURA DE UN ARBOL
typedef struct nodo { int clave; <tipoDato> struct nodo *izdo, *dcho; <punteros a nodo>}Nodo;
typedef struct tArbol{ int clave; tArbol hIzquierdo, hDerecho;} tArbol;tArbol árbol[NUMERO_DE_NODOS];
int árbol[NUMERO_DE_NODOS];
Arbol Binario Busqueda
int buscar(tArbol *a, int elem) { if (a == NULL) return 0; else if (a->clave < elem) return buscar(a->hDerecho, elem); else if (a->clave > elem) return buscar(a->hIzquierdo, elem); else
return 1;}
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 según se visitan los nodos
• Se distinguen dos categorías básicas de recorrido:
Recorridos en profundidad• Recorrido en preorden• Recorrido en postorden• Recorrido en inorden
Recorridos en amplitud (o por niveles)
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (I)
Si representamos por I: ir hacia la izquierda, R: visitar o escribir el
item, D: ir hacia la derecha, existen 6 posibles formas de recorrido
en profundidad: RID, IRD, IDR, RDI, DRI y DIR. Si sólo queremos
hacer los recorridos de izquierda a derecha quedan 3 formas de
recorrido:
1. RID o preorden (orden previo)
2. IRD o inorden (orden simétrico)
3. IDR o postorden (orden posterior)
(El recorrido en postorden es el inverso especular del recorrido preorden, es
decir, se recorre el árbol en preorden, visitando primero el subárbol derecho antes que el
izquierdo, y se considera la lista resultante como el inverso de la solución)
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (II)
RECORRIDO EN PREORDEN
En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por
pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se
trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra
forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz,
nodo izquierda, nodo derecha.
En el árbol de la figura el recorrido en
preorden sería:
2, 7, 2, 6, 5, 11, 5, 9 y 4.
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (III)
RECORRIDO EN PREORDEN
void preorden(tArbol *a)
{
if (a != NULL) {
tratar(a); //Realiza una operación en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (III)
RECORRIDO EN POSTORDEN
En este caso se trata primero el subárbol izquierdo, después el derecho y por último
el nodo actual. Otra forma para entender el recorrido con este metodo seria seguir el
orden: nodo izquierda, nodo derecha, nodo raiz.
En el árbol de la figura el recorrido
en postorden sería:
2, 5, 11, 6, 7, 4, 9, 5 y 2.
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 operación en nodo
}
}
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (V)
RECORRIDO EN INORDEN
En este caso se trata primero el subárbol izquierdo, después el nodo actual y por
último el subárbol derecho. En un ABB este recorrido daría los valores de clave
ordenados de menor a mayor. Otra forma para entender el recorrido con este metodo
seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha.
En el árbol de la figura el recorrido
en inorden sería:
2, 7, 5, 6, 11, 2, 5, 4, 9.
RECORRIDOS
• RECORRIDOS EN PROFUNDIDAD (VI)
RECORRIDO EN INORDEN
void inorden(tArbol *a)
{
if (a != NULL) {
inorden(a->hIzquierdo);
tratar(a); //Realiza una operación en nodo
inorden(a->hDerecho);
}
}
RECORRIDOS
• RECORRIDO EN AMPLITUD (O POR NIVELES)Consiste en visitar los nodos desde la raíz 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 comenzaría tratando el nivel 1, que sólo contiene el nodo raíz, seguidamente el nivel 2, el 3 y así sucesivamente.
En el árbol de la figura el recorrido en amplitud sería: 2, 7, 5, 2, 6, 9, 5, 11 y 4
RECORRIDOS
• RECORRIDO EN AMPLITUD (O POR NIVELES)
• Al contrario que en los métodos de recorrido en profundidad,
el recorrido por niveles no es de naturaleza recursiva. Por
ello, se debe utilizar una cola para recordar los subárboles
izquierdos y derecho de cada nodo.
• El esquema algoritmo para implementar un recorrido por
niveles es exactamente el mismo que el utilizado en la
versión iterativa del recorrido en preorden pero cambiando la
estructura de datos que almacena los nodos por una cola.
RECORRIDOS
• EJEMPLO DE RECORRIDOS
A
B C
D E F G
IH
Niveles
ABCDEFGHI
Inorden:
D H E AFICG
Postorden:
DHEBIFGCA
Preorden:
ABDEHCFIG
METODOS PARA ALMACENAR ARBOLES BINARIOS
• Los árboles binarios pueden ser construidos a partir de lenguajes de
programación de varias formas.
• En un lenguaje con registros y referencias, los árboles binarios son
construidos típicamente 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.
• En ocasiones, también contiene un puntero a un único nodo. Si un nodo
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.
METODOS PARA ALMACENAR ARBOLES BINARIOS
METODOS PARA ALMACENAR ARBOLES BINARIOS
• Los árboles binarios también pueden ser almacenados como una
estructura de datos implícita en vectores, y si el árbol es un árbol binario
completo, este método no desaprovecha el espacio en memoria.
• Tomaremos como notación 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 raíz tenga
índice cero).
• Este método tiene como ventajas el tener almacenados los datos de
forma más compacta y por tener una forma más rápida y eficiente de
localizar los datos en particular durante un preoden transversal.
• Sin embargo, desperdicia mucho espacio en memoria.
top related