arboles binarios

36
ARBOLES BINARIOS Ing. Juan A. Cañedo Trasviña

Upload: diego-alva-villavicencio

Post on 29-Jun-2015

579 views

Category:

Documents


4 download

TRANSCRIPT

ARBOLES BINARIOS

Ing. Juan A. Cañedo Trasviña

Árbol binario.

Un árbol binario es un árbol en el que cada nodo no

puede tener más de dos hijos o descendientes.

Es un conjunto de nodos que es, o bien el conjunto

vació, o un conjunto que consta de un nodo raíz

enlazado a dos árboles binarios disjuntos

denominados subárbol izquierdo y subárbol

derecho. Cada uno de estos subárboles es, a su vez,

un árbol binario.

A

C

A

B C

E

B

D D F

A

B C

Ing. Juan A. Cañedo Trasviña

Representación de un árbol binario en

la memoria.

Cada noto tiene la siguiente forma:

Raíz

R

A

B C

D

E

izq info der

Ing. Juan A. Cañedo Trasviña

Clase nodo de un A.B.

class nodo{

nodo izq;

nodo der;

int dato;

public nodo(int x)

{

dato=x;

izq=der=null;

}

} Ing. Juan A. Cañedo Trasviña

Algoritmo para crear un A.B.

Procedimiento crearbol(q:nodo)

escribe(‘Dame el dato=')

leer(q(dato))

mensaje(‘Tiene rama izquierda')

leer(op)

Si op = 'S' Entonces

p=crear nodo()

q(izq) = p

crearbol(p)

En caso contrario

q(izq) = null

mensaje(‘ Tiene rama derecha')

leer(op)

Si op = 'S' Entonces

p=crear nodo()

q(der) =p

crearbol(p)

En caso contrario

q(der) = null

Ing. Juan A. Cañedo Trasviña

Operaciones basicas sobre un árbol

binario Recorrer árbol ya sea en:

Preorden

Inorden

Postorden

Insertar un nodo

Eliminar un nodo

Buscar nodo con cierta información

Contar nodos

Contar hojas.

Nivel del árbol binario.

Obtener el peso del árbol.

Ing. Juan A. Cañedo Trasviña

Recorridos de un árbol de Búsqueda

Binaria (ABB)

Recorrido en preorden (prefijo)

Visita la raíz.

Recorre el subárbol izquierdo.

Recorre el subárbol derecho.

A

B C

D E F

H I G

RID

Preorden = A B D G C E H I F

Ing. Juan A. Cañedo Trasviña

Recorridos de un árbol binario.

Se denomina recorrido al proceso que permite

acceder o visitar cada nodo que componen al

árbol binario una sola vez. Las tres formas

diferentes y todas ellas de naturaleza recursiva,

los cuales son:

Preorden.

Inorden.

Postorden.

Ing. Juan A. Cañedo Trasviña

Recorrido en Preorden.

Examinar la raíz (escribe el dato del nodo).

Recorrer el subárbol izquierdo.

Recorrer el subárbol derecho.

A

B C

D E F

H I G

Preorden: ABDGCEHIF

Ing. Juan A. Cañedo Trasviña

Algoritmo del recorrido en preorden

public void Preorden(nodo p)

{

if (p != null)

{

Console.WriteLine(“Dato={0}”,p.dato);

Preorden(p.izq);

Preorden(p.der);

}

} Ing. Juan A. Cañedo Trasviña

Recorrido en Inorden (infijo)

Recorre el subárbol izquierdo.

Examinar la raíz (escribe el dato del nodo).

Recorre el subárbol derecho.

A

B C

D E F

H I G

Inorden: D G B A H E I C F

Ing. Juan A. Cañedo Trasviña

Algoritmo del recorrido en Inorden

public void Inorden(Nodo p)

{

if (p != null)

{

Inorden(p.izq);

Console.WriteLine(“Dato={0}”,p.dato);

Inorden(p.der);

}

} Ing. Juan A. Cañedo Trasviña

Recorridos en Postorden (postfijo)

Recorre el subárbol izquierdo.

Recorre el subárbol derecho.

Examinar la raíz (escribe el dato del nodo).

A

B C

D E F

H I G

Postorden : G D B H I E F C A

Ing. Juan A. Cañedo Trasviña

Algoritmo del recorrido en postorden

public void Postorden(Nodo p)

{

if (p != null)

{

Postorden(p.izq);

Postorden(p.der);

Console.WriteLine(“Dato={0}”,p.dato);

}

} Ing. Juan A. Cañedo Trasviña

Conversión de un árbol general en un

árbol binario

Deben enlazarse los hijos de cada nodo en

forma horizontal (los hermanos).

Deben enlazarse en forma vertical el nodo

padre con el hijo que se encuentra más a la

izquierda. Además, debe eliminarse el vínculo

de ese padre con el resto de sus hijos.

Después de haber realizado los pasos

anteriores, pasaremos a rota el diagrama

resultante 45 grados hacia la izquierda.

Obteniendo como resultado un arbol binario.

Ing. Juan A. Cañedo Trasviña

A

B C D

E F G H I J K

L M

Ejemplo de conversión de un árbol

general en un árbol binario

Ing. Juan A. Cañedo Trasviña

Resultado final un A.B.

A

B

C

D

E

F G

H

I

J

K

L

M

Ing. Juan A. Cañedo Trasviña

Arboles de expresión aritmética

Una aplicación muy importante de los arboles

es la de poder almacenar una expresión

aritmética en memoria.

Un árbol de expresión es un árbol binario con

las siguientes propiedades:

Cada hoja debe ser un operando.

Los nodos padres deben ser operadores.

Los subárboles son subexpresiones en los

que el nodo raíz es un operador.

Ing. Juan A. Cañedo Trasviña

Ejemplo

Dada la expresion

a*(b+c)+d

+

* d

a +

b c

Ing. Juan A. Cañedo Trasviña

Árboles Binarios de

Búsqueda (ABB) Ing. Juan A. Cañedo Trasviña

Árboles Binarios de Búsqueda

Un árbol es un ABB si éste es binario y sus nodos

son subárboles de búsqueda binarios y contienen

información ordenada tal que todos los elementos a

la izquierda de la raíz son menores a la raíz y todos

lo elementos a la derecha de la raíz son mayores a

la raíz.

Ing. Juan A. Cañedo Trasviña

Características de un ABB

Todos los nodos a la izquierda son menores al

padre.

Todos los nodos a la derecha son mayores al

padre.

Y cada nodo solo pueden tener 2 hijos a lo mucho.

50

95

90

110

120 88

85

100

105

102

68 34

40

45 26

42 8

Ing. Juan A. Cañedo Trasviña

Clase nodo de un ABB

Class Nodo{

nodo izq;

nodo der;

int dato;

}

Ing. Juan A. Cañedo Trasviña

Inserción en un ABB

La inserción es una operación que se puede

realizar eficientemente en un árbol binario de

búsqueda. La estructura crece conforme se

inserten elementos al árbol.

Los pasos que deben realizarse para insertar

un elemento a un ABB son los siguientes:

Debe compararse el valor o dato a insertar con la

raíz del árbol. Si es mayor, debe avanzarse

hacia el subárbol derecho. Si es menor, debe

avanzarse hacia el subárbol izquierdo.

Ing. Juan A. Cañedo Trasviña

Inserción en un ABB (cont.)

Repetir sucesivamente el paso 1 hasta que se

cumpla alguna de las siguientes condiciones

El subárbol derecho es igual a vació, o el

subárbol izquierdo es igual a vació; en cuyo

caso se procederá a insertar el elemento en el

lugar que le corresponde.

El valor o dato que quiere insertarse es igual a

la raíz del árbol; en cuyo caso no se realiza la

inserción.

Ing. Juan A. Cañedo Trasviña

Inserción en un ABB (cont.)

Algoritmo Si NODO ≠ Null{

Si (INFOR < NODO.INFO)

Regresar a INSERCION1 con NODO.IZQ e INFOR

sino

si ( INFOR > NODO.INFO)

Regresar a INSERCION1 con NODO.DER e INFOR

sino

Escribir “El nodo ya se encuentra en el árbol” } // } si

else

CREA (OTRO) {Crear un nuevo nodo}

Hacer OTRO.IZQ = null,

OTRO.DER = null,

OTRO.INFO = INFOR y NODO = OTRO

} Ing. Juan A. Cañedo Trasviña

Inserción en un ABB (cont.)

Supóngase que quieren insertarse las

siguientes los siguientes datos en un árbol

binario de búsqueda que se encuentra vació.

120 –87 – 43 – 65 – 140 – 99 – 130 – 22 – 56

Ing. Juan A. Cañedo Trasviña

Inserción en un ABB (cont.) Solución

120 –87 – 43 – 65 – 140 – 99 – 130 – 22 – 56

120

87 140

43 130

56

22 65

99

Ing. Juan A. Cañedo Trasviña

Eliminar un nodo

Para eliminar un nodo existen los siguientes

casos:

1. Si el elemento a borrar es Terminal (hoja),

2. Si el elemento a borrar tiene un solo hijo,

3. Si el elemento a borrar tiene los dos hijo,

Ing. Juan A. Cañedo Trasviña

Eliminar un nodo (cont.)

Caso 1

Si el elemento a borrar es terminal (hoja),

simplemente se elimina.

aux = aux.izq = null

Ejemplo eliminar nodo 7

8 1

9 7

6

8 1

9 7

6

8 1

9

6

Ing. Juan A. Cañedo Trasviña

Eliminar un nodo (cont.)

Caso 2

Si el elemento a borrar tiene un solo hijo,

entonces tiene que sustituirlo por el hijo que

esta a su derecha.

8 1

9

7

1 9

7

8 1

9

7

Ejemplo: eliminar nodo 8

Ing. Juan A. Cañedo Trasviña

Eliminar un nodo (cont.)

Caso 3

Si el elemento a borrar tiene los dos hijos,

entonces se tienen que sustituir por el nodo que

se encuentra más a la izquierda en el subárbol

derecho, o por el nodo que se encuentra más a

la derecha en el subárbol izquierdo.

Ejemplo: eliminar el 6

8 1

9 7

6

8 1

9 7

7

8 1

9

7

Ing. Juan A. Cañedo Trasviña

Buscar nodo con información

procedimiento busqueda(nodo p; entero llave)

si p != null entonces

si llave != p(dato) entonces

si llave < p(dato) entonces

p <- p(izq)

busqueda( p, llave)

en caso contrario

p <- p(der)

busqueda(p, llave)

en caso contrario

mensaje(’’nodo encontrado’’)

Contar nodos

//cuenta los nodos que hay en el árbol

public static int nodo (nodo raiz)

{

if (raiz == null)

return 0;

else

return (1+ Nodo( raiz.der) + Nodo( raiz.izq))

}

Sumar los nodos

//suma los nodos que hay en el árbol

public static int sumaNodo( nodo raiz)

{

if(raiz == null)

return 0;

else

return (sumaNodo (raiz.der) + sumaNodo

(raiz.izq) )

}

Ing. Juan A. Cañedo Trasviña

Contar hojas.

// Cuenta hojas de un árbol

public int contarHojas (Nodo raiz) {

if (raiz = = null) return 0;

If ((raiz.der == null) && (raiz.izq == null))

return 1;

else

return contarHojas (raiz.izq) + contarHojas (raiz.der)

}

Ing. Juan A. Cañedo Trasviña