Arboles Binarios - Diapositivas (Ia).Pptx

35
ARBOLES BINARIOS INTELIGENCIA ARTIFICIAL A B C D E F G

Transcript of Arboles Binarios - Diapositivas (Ia).Pptx

Page 1: Arboles Binarios - Diapositivas (Ia).Pptx

ARBOLES BINARIOSINTELIGENCIA ARTIFICIAL

A

B C

D E F G

Page 2: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 3: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 4: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 5: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 6: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 7: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 8: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 9: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 10: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 11: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 12: Arboles Binarios - Diapositivas (Ia).Pptx

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.

– ….

Page 13: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 14: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 15: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 16: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 17: Arboles Binarios - Diapositivas (Ia).Pptx

Estructura de un Árbol binario

A

B C

D NULL NULL E NULL NULL F NULL NULL G NULL

NULL H NULL

Page 18: Arboles Binarios - Diapositivas (Ia).Pptx

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];

Page 19: Arboles Binarios - Diapositivas (Ia).Pptx

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;}

Page 20: Arboles Binarios - Diapositivas (Ia).Pptx

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); }

Page 21: Arboles Binarios - Diapositivas (Ia).Pptx

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);}

Page 22: Arboles Binarios - Diapositivas (Ia).Pptx

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)

Page 23: Arboles Binarios - Diapositivas (Ia).Pptx

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)

Page 24: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 25: Arboles Binarios - Diapositivas (Ia).Pptx

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);

}

}

Page 26: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 27: Arboles Binarios - Diapositivas (Ia).Pptx

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

}

}

Page 28: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 29: Arboles Binarios - Diapositivas (Ia).Pptx

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);

}

}

Page 30: Arboles Binarios - Diapositivas (Ia).Pptx

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

Page 31: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 32: Arboles Binarios - Diapositivas (Ia).Pptx

RECORRIDOS

• EJEMPLO DE RECORRIDOS

A

B C

D E F G

IH

Niveles

ABCDEFGHI

Inorden:

D H E AFICG

Postorden:

DHEBIFGCA

Preorden:

ABDEHCFIG

Page 33: Arboles Binarios - Diapositivas (Ia).Pptx

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.

Page 34: Arboles Binarios - Diapositivas (Ia).Pptx

METODOS PARA ALMACENAR ARBOLES BINARIOS

Page 35: Arboles Binarios - Diapositivas (Ia).Pptx

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.