ARBOLES_2011_2

38
1 1. Definición. 2. Conceptos Generales. 3. Arboles Binarios. 3.1 Definición. 3.2 Implementación. 3.3 Recorrido. 3.4 Árboles Binarios de Búsqueda (ABB). o Inserción de un nodo. o Búsqueda de un nodo. o Eliminación de un nodo. 3.5 Árboles de Expresión. o Construcción. o Evaluación. 4. Ejemplos ARBOLES

description

computacion 3

Transcript of ARBOLES_2011_2

Page 1: ARBOLES_2011_2

1

1. Definición.2. Conceptos Generales.3. Arboles Binarios.

3.1 Definición.3.2 Implementación.3.3 Recorrido.3.4 Árboles Binarios de Búsqueda (ABB).

o Inserción de un nodo.o Búsqueda de un nodo.o Eliminación de un nodo.

3.5 Árboles de Expresión.o Construcción.o Evaluación.

4. Ejemplos

ARBOLES

Page 2: ARBOLES_2011_2

2

Arbol: Estructura que organiza sus elementos, denominados nodos, en forma jerárquica

1.- Definición

Page 3: ARBOLES_2011_2

3

1.- Definición

Page 4: ARBOLES_2011_2

4

1.- Definición

Page 5: ARBOLES_2011_2

5

( ( A + B ) / ( C – D) ) * ( E - F )

1.- Definición

Page 6: ARBOLES_2011_2

6

Rama es cualquier camino que se establece entre la raíz y un nodo terminal.

Un ÁRBOL es una colección de elementos llamados nodos, uno de los cuales se distingue del resto como RAIZ.

Cualquier nodo, a excepción de la raíz, está conectado, por arriba, a un único nodo. Se dice entonces que B es Padre de E y E es Hijo de B.

Si un nodo tiene algún hijo es un nodo Interno, sino es una Hoja o Nodo Terminal

Nodos Hermanos son nodos hijos de un mismo padre.

2.- Conceptos Generales

Page 7: ARBOLES_2011_2

7

Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'H' tiene altura 1, la 'G' cero, etc.

Grado de un nodo: numero de hijos que salen del nodo. Los nodos con grado cero “0” son nodos terminales

Grado del árbol: el número de hijos que tiene el elemento con más hijos dentro del árbol o sea el máximo grado de todos los nodos del árbol

Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, 'B' tiene nivel 1, 'G' tiene nivel 2, y 'K', nivel 3.

2.- Conceptos Generales

Page 8: ARBOLES_2011_2

8

1. Definición.2. Conceptos Generales.3. Arboles Binarios.

3.1 Definición.3.2 Implementación.3.3 Recorrido.3.4 Árboles Binarios de Búsqueda (ABB).

o Inserción de un nodo.o Búsqueda de un nodo.o Eliminación de un nodo.

3.5 Árboles de Expresión.o Construcción.o Evaluación.

4. Ejemplos

ARBOLES

Page 9: ARBOLES_2011_2

9

Definición: un árbol binario es un conjunto finito de nodos que puede estar vacío o consistir en un nodo raíz y dos árboles binarios disjuntos, llamados subárbol izquierdo y subárbol derecho.

3.1.- Definición

Page 10: ARBOLES_2011_2

struct datos{ char nombre[20];

int cedula, edad;};typedef int DATOstruct NODO{ DATO Info; NODO * Izq, *Der; };

struct datos{ char nombre[20];

int cedula, edad;};typedef datos DATOstruct NODO{ DATO Info; NODO * Izq, *Der;

};

10

IMPLEMENTACION DE ARBOLES

typedef NODO* ptNODO;

ptNODO RAIZ;

3.2.- Implementación

INFO

IzqDer

edadcedulanombre

Page 11: ARBOLES_2011_2

11

3.2.- Implementación

Page 12: ARBOLES_2011_2

s/a izquierdo

s/a derecho

12

(2) s/a izquierdo - Raiz - s/a derecho

(1) Raiz - s/a izquierdo - s/a derecho

(3) s/a izquierdo - s/a derecho - Raiz

(4) Raiz - s/a derecho - s/a izquierdo

(5) s/a derecho - Raiz - s/a izquierdo

(6) s/a derecho - s/a izquierdo - Raiz

3.3.- Recorrido

(2) s/a izquierdo - Raiz - s/a derecho

(1) Raiz - s/a izquierdo - s/a derecho

(3) s/a izquierdo - s/a derecho - Raiz

(4) Raiz - s/a derecho - s/a izquierdo

(5) s/a derecho - Raiz - s/a izquierdo

(6) s/a derecho - s/a izquierdo - Raiz

Page 13: ARBOLES_2011_2

13

(2) subárbol izquierdo - Raiz - subárbol derecho

(1) Raiz - subárbol izquierdo - subárbol derecho

(3) subárbol izquierdo - subárbol derecho - Raiz

PRE - ORDEN

IN - ORDEN

POST - ORDEN

3.3.- Recorrido

Page 14: ARBOLES_2011_2

14

5

25

20 32

IN - ORDEN

I D

R

1 17 6 12 15 16 20 25 325

5

25

20 32

3.3.- Recorrido

17

1 6

16

151

17

6

16

15

1212

Page 15: ARBOLES_2011_2

15

5

25

20 32

12

17

1 6

16

151

17

6

12

16

15

5

25

20 32

PRE - ORDEN

I D

R

5 12 17 1 6 16 15 25 20 32

3.3.- Recorrido

Page 16: ARBOLES_2011_2

16

5

25

20 32

12

17

1 6

16

151

17

6

12

16

15

5

25

20 32

POST - ORDEN

I D

R

1 6 17 15 16 12 20 32 25 5

3.3.- Recorrido

Page 17: ARBOLES_2011_2

17

17

12 25

5

1 6 15

16 20 32

POST

IN

PRE

1 17 6 12 15 16 20 25 325

5 12 17 1 6 16 15 25 20 32

1 6 17 15 16 12 20 32 25 5

IN

I D

N

PRE

I D

N

POST

I D

N

3.3.- Recorrido

Page 18: ARBOLES_2011_2

18

4 11 80 49 51 58 39 86 9073

80 4 11 90 58 49 51 39 73 86IN

PRE

IN

I D

N

PRE

I D

N

80

4,11 49,51,58,73,39,86,904

11NULL

90

NULL49,51,58,73,39,8658

49,51 73,39,8649

51NULL

39

8673

80 4 11 90 58 49 51 39 73 86

4 11 80 49 51 58 39 86 9073

Dados dos recorridos, dibujar el árbol correspondiente

3.3.- Recorrido

Page 19: ARBOLES_2011_2

19

void RecIn(ptNODO RAIZ){ if(RAIZ!=NULL)

{ RecIn(RAIZ->Izq);cout<<RAIZ->Info;RecIn(RAIZ->Der);

}}

Recorrido INORDEN.-

Recorrido PREORDEN.-

Recorrido POSTORDEN.-

void RecPre(ptNODO RAIZ){ if(RAIZ!=NULL)

{ cout<<RAIZ->Info;RecPre(RAIZ->Izq);RecPre(RAIZ->Der);

}}

void RecPost(ptNODO RAIZ){ if(RAIZ!=NULL)

{ RecPost(RAIZ->Izq);RecPost(RAIZ->Der);cout<<" "<<RAIZ->Info;

}}

3.3.- Recorrido

Page 20: ARBOLES_2011_2

20

RecIn(d6)cout<<d3->InfoRecIn(d7)

RecIn(d4)cout<<d2->InfoRecIn(d5)

void RecIn(ptNODO RAIZ){ if(RAIZ!=NULL)

{ RecIn (RAIZ->Izq);cout<<RAIZ->Info;RecIn (RAIZ->Der);

}}

RecIn(d1)

RecIn(Null)cout<<d8->InfoRecIn(Null)

RecIn(Null)cout<<d9->InfoRecIn(Null)

RecIn(Null)cout<<d10->InfoRecIn(Null)

RecIn(Null)cout<<d6->InfoRecIn(Null)

RecIn(Null)cout<<d7->InfoRecIn(Null)

RecIn(d2)cout<<d1->InfoRecIn(d3)

RecIn(d8)cout<<d4->InfoRecIn(d9)

RecIn(d10)cout<<d5->InfoRecIn(Null)

1 5 6 12 15 16 20 25 3217

Page 21: ARBOLES_2011_2

21

void CARGA(ptNODO &A){ char resp; ptNODO AI, AD; A=new(NODO);

cout<<"Info: ";cin>>A->Info;

cout<<"Tiene "<<A->Info <<" Nodo IZQUIERDO S/N ? "; cin>>resp; if(resp=='S' || resp=='s') { AI=new(NODO); A->Izq=AI; CARGA(A->Izq); } else A->Izq=NULL; cout<<"Tiene "<<A->Info <<" Nodo DERECHO S/N ? "; cin>>resp; if(resp=='S' || resp=='s') { AD=new(NODO); A->Der=AD; CARGA(A->Der); } else A->Der=NULL;}

Page 22: ARBOLES_2011_2

22

1. Definición.2. Conceptos Generales.3. Arboles Binarios.

3.1 Definición.3.2 Implementación.3.3 Recorrido.3.4 Árboles Binarios de Búsqueda (ABB - BST).

o Inserción de un nodo.o Búsqueda de un nodo.o Eliminación de un nodo.

3.5 Árboles de Expresión.o Construcción.o Evaluación.

4. Ejemplos

ARBOLES

Page 23: ARBOLES_2011_2

23http://www.comscore.com/esl/Press_Events/Press_Releases/2010/1/Global_Search_Market_Grows_46_Percent_in_2009

Page 24: ARBOLES_2011_2

24

Un Arbol Binario de Búsqueda (ABB) es aquel que, para cualquier nodo del arbol (N) se cumple que, todos los nodos del sub-árbol izquierdo son menores que N->Info, mientras que los nodos del sub-árbol derecho son mayores que N->Info

3.4.- Arboles Binarios de Búsqueda

Page 25: ARBOLES_2011_2

25

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);

else if(ELEM<RAIZ->Info) return INSERTAR(RAIZ-

>Izq,ELEM);else return 1;

}

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);

else if(ELEM<RAIZ->Info) return INSERTAR(RAIZ-

>Izq,ELEM);else return 1;

}

Raiz

Info

Izq

Der

d1

Izq

De

r

Info

typedef int DATOstruct NODO{ DATO Info; NODO * Izq, *Der;};typedef NODO* ptNODO;ptNODO RAIZ;

Info

Izq

Der

d1

NU

LL

NU

LL

17

3.4.- Arboles Binarios de Búsqueda• Inserción un Nodo 17

Page 26: ARBOLES_2011_2

26

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);else if(ELEM<RAIZ->Info)

return INSERTAR(RAIZ->Izq,ELEM);else return 1;

}

Raiz

17

d1

d2

NU

LL

NU

LL

typedef int DATOstruct NODO{ DATO Info; NODO * Izq, *Der;};typedef NODO* ptNODO;ptNODO RAIZ;

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);else if(ELEM<RAIZ->Info)

return INSERTAR(RAIZ->Izq,ELEM);else return 1;

}

3.4.- Arboles Binarios de Búsqueda• Inserción un Nodo 14

Page 27: ARBOLES_2011_2

27

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);else if(ELEM<RAIZ->Info)

return INSERTAR(RAIZ->Izq,ELEM);else return 1;

}

typedef int DATOstruct NODO{ DATO Info; NODO * Izq, *Der;};typedef NODO* ptNODO;ptNODO RAIZ;

int INSERTAR(ptNODO &RAIZ,DATO ELEM){ if(RAIZ==NULL)

{ RAIZ=new(NODO);if(RAIZ!=NULL){ RAIZ->Info=ELEM;

RAIZ->Izq=NULL;RAIZ->Der=NULL;return 0;

}else return 1;

}else if(ELEM>RAIZ->Info)

return INSERTAR(RAIZ->Der,ELEM);else if(ELEM<RAIZ->Info)

return INSERTAR(RAIZ->Izq,ELEM);else return 1;

}

Raiz

17

d1

d2

NU

LL

NU

LL

Info

d2

Izq

Der

17

d1

d2

NU

LL

14

d2

NU

LL

NU

LL

3.4.- Arboles Binarios de Búsqueda• Inserción un Nodo 14

Page 28: ARBOLES_2011_2

28

ptNODO BUSCAR(ptNODO RAIZ, DATO ELEM){ if(RAIZ!=NULL)

{ if(RAIZ->Info==ELEM) return RAIZ;else if(ELEM<RAIZ->Info) return BUSCAR(RAIZ->Izq,ELEM);else return BUSCAR(RAIZ->Der,ELEM);

}else return NULL;

}

3.4.- Arboles Binarios de Búsqueda• Búsqueda de un Nodo

20

BUSCAR(d1,20)return

BUSCAR(d3,20)

BUSCAR(d3,20)return

BUSCAR(d6,20)

BUSCAR(d6,20)

return d6d6d6

Page 29: ARBOLES_2011_2

29

Esta operación es una extensión de la operación de búsqueda aunque es mas complicada debido a que se debe mantener la estructura de árbol binario después de eliminar el nodo.

Esto quiere decir que en el árbol resultante, para cualquier nodo (N), se debe cumplir que los nodos de su lado izquierdo deben ser menores y los del lado derecho deben ser mayores, que el info del nodo N.

4

25

32

17

14

1 6 15

2016

Borrar 16

PADRE

HIJO

15

Borrar 1PADRE

3.4.- Arboles Binarios de Búsqueda• Eliminacion de un Nodo

Los pasos a seguir son:

1. Buscar la posición (dirección) del nodo a eliminar.

2. Si el nodo tiene menos de dos hijos:

Reasignar el puntero del nodo padre, al descendiente del nodo o a NULL si el nodo no tiene hijos

3. Si el nodo tiene dos hijos.

Reemplazar el contenido del nodo a eliminar (N), con el mayor de los menores o con el menor de los mayores.

Page 30: ARBOLES_2011_2

30

Los pasos a seguir son:

1. Buscar la posición (dirección) del nodo a eliminar.

2. Si el nodo tiene menos de dos hijos:

Reasignar el puntero del nodo padre, al descendiente del nodo o a NULL si el nodo no tiene hijos

3. Si el nodo tiene dos hijos.

Reemplazar el contenido del nodo a eliminar (N), con el mayor de los menores o con el menor de los mayores.

6

90

34

18

20

25 100

28

Borrar 34

70

Menor de los mayores = 7070

Mayor de los menores = 2828

3.4.- Arboles Binarios de Búsqueda• Eliminacion de un Nodo

Page 31: ARBOLES_2011_2

31

N Elim(R,X) R X RInfo0 Elim(d1,6) d1 6 341 Elim(d2,6) d2 6 182 Elim(d4,6) d4 6 63 Q=R

R=NULLdelete(Q)

3.4.- Arboles Binarios de Búsqueda• Eliminacion de un Nodo

R

void ELIM(ptNODO &R, DATO X){ ptNODO Q; if(R==NULL)

cout<<"NO EXISTE VALOR"; else if(X<R->Info)

ELIM(R->Izq,X); else if(X>R->Info)

ELIM(R->Der,X); else { Q=R; if(Q->Der==NULL)

R=Q->Izq; else if(Q->Izq==NULL)

R=Q->Der; else REEMP(Q->Izq,Q); delete(Q);

}}void REEMP(ptNODO &P, ptNODO &Q){ if(P->Der!=NULL)

REEMP(P->Der,Q); else { Q->Info=P->Info; Q=P; P=P->Izq;

}}

Q

R

R

Page 32: ARBOLES_2011_2

32

Q

N Elim(R,X) R X RInfo0 Elim(d1,90) d1 90 341 Elim(d3,90) d3 90 902 Q=R

R=Q->Derdelete(Q)

3.4.- Arboles Binarios de Búsqueda• Eliminacion de un Nodo

R

void ELIM(ptNODO &R, DATO X){ ptNODO Q; if(R==NULL)

cout<<"NO EXISTE VALOR"; else if(X<R->Info)

ELIM(R->Izq,X); else if(X>R->Info)

ELIM(R->Der,X); else { Q=R; if(Q->Der==NULL)

R=Q->Izq; else if(Q->Izq==NULL)

R=Q->Der; else REEMP(Q->Izq,Q); delete(Q);

}}void REEMP(ptNODO &P, ptNODO &Q){ if(P->Der!=NULL)

REEMP(P->Der,Q); else { Q->Info=P->Info; Q=P; P=P->Izq;

}}

R

Page 33: ARBOLES_2011_2

33

Q

R

void ELIM(ptNODO &R, DATO X){ ptNODO Q; if(R==NULL)

cout<<"NO EXISTE VALOR"; else if(X<R->Info)

ELIM(R->Izq,X); else if(X>R->Info)

ELIM(R->Der,X); else { Q=R; if(Q->Der==NULL)

R=Q->Izq; else if(Q->Izq==NULL)

R=Q->Der; else REEMP(Q->Izq,Q); delete(Q);

}}void REEMP(ptNODO &P, ptNODO &Q){ if(P->Der!=NULL)

REEMP(P->Der,Q); else { Q->Info=P->Info; Q=P; P=P->Izq;

}}

3.4.- Arboles Binarios de Búsqueda• Eliminacion de un Nodo

N ELIM(R,X) P Q R X RInfo0 ELIM(d1,34) d1 d1 34 341 REEMP(d2,d1) d2 d12 REEMP(d5,d1) d5 d13 REEMP(d8,d1) d8 d1

Q Info = P InfoQ = PP = P Izqdelete(Q)

P

P

PQ

Page 34: ARBOLES_2011_2

34

1. Definición.2. Conceptos Generales.3. Arboles Binarios.

3.1 Definición.3.2 Implementación.3.3 Recorrido.3.4 Árboles Binarios de Búsqueda (ABB).

o Inserción de un nodo.o Búsqueda de un nodo.o Eliminación de un nodo.

3.5 Árboles de Expresión.o Construcción.o Evaluación.

4. Ejemplos

ARBOLES

Page 35: ARBOLES_2011_2

35

+

Los árboles binarios se utilizan para representar/evaluar expresiones. Las expresiones contienen básicamente operadores y operandos, se puede representar por un árbol binario donde la raíz contiene el operador y los subárboles izquierdo/derecho contienen los operandos. Cada operando puede ser una variable (A…Z) o una subexpresión representada por un subárbol.

OPERANDO

OPERADOR

OPERANDOA*((B+C)/D) E - F*

A (B+C)/D/

B+C D

E F

B C

+

-

3.4.- Arboles de Expresión• Construcción

A * ( ( B + C ) / D ) + ( E – F )

Page 36: ARBOLES_2011_2

36

La evaluación de una expresión usando árboles binarios tiene tres pasos:

1. Transformar la expresión de In_Fija a Post_Fija.

2. Construir a partir de la expresión en Post_Fija el Arbol de Expresión.

3. Evaluar la expresión utilizando el árbol construido.

Construcción del árbol a partir de la expresión Post_Fija

A B + C D - *

D1 D2 D3

El algoritmo sigue los siguientes pasos:

1. Se lee la expresión postfija de izquierda a derecha, carácter por carácter.

2. Si carácter leído es operando (A..Z), se crea el nodo y se guarda su dirección en una pila.

3. Si carácter es operador, se crea el nodo para el operador, y se conectan los punteros izq/der con las direcciones extraídas de la pila.

4. Se mete en la pila la dirección del nodo que contiene el operando.

5. Se repite desde el paso 2 hasta leer toda la expresion..

D4 D5 D6 D7

PILA

3.4.- Arboles de Expresión• Construcción

Page 37: ARBOLES_2011_2

37

ptNODO1 CrearNodo(ptNODO1 Izq, ptNODO1 Der, DATO1 Elem){ ptNODO1 Aux;

Aux=new(NODO);Aux->Info=Elem; Aux->Izq=Izq; Aux->Der=Der;return Aux;

}ptNODO1 CrearArbol(ptNODO3 Exp){ ptNODO1 A1=NULL,A2=NULL,A3=NULL;

ptNODO2 PILA;while(Exp!=NULL){ if(isalpha(Exp->Info))

{ A3=CrearNodo(NULL,NULL,Exp->Info);PUSH(PILA,A3); }

else{ POP(PILA,A2);

POP(PILA,A1);A3=CrearNodo(A1,A2,Exp->Info);PUSH(PILA,A3); }

Exp=Exp->Sig;}POP(PILA,A3);return A3;

}

3.4.- Arboles de Expresión• Construcción

Page 38: ARBOLES_2011_2

38

float EVAL(ptNODO1 R){ float op1, op2, val;

DATO1 car;while(R!=NULL){ if(isalpha(R->Info))

{ cout<<R->Info<<" = ";cin>>val;return val;

}else{ op1=EVAL(R->Izq);

op2=EVAL(R->Der);switch(R->Info){ case '+':

return op1+op2;case '-':

return op1-op2;case '*':

return op1*op2;case '/':

return op1/op2;case '^':

return pow(op1,op2);}

}}

}

3.4.- Arboles de Expresión• Evaluacion

EVAL(d1)op1=Eval(d2)op2=Eval(d3)return (A+B)*(E-F)

EVAL(d2)op1=Eval(d4)op2=Eval(d5)return (A+B)

EVAL(d4)cin>>Areturn val

EVAL(d5)cin>>Breturn val

EVAL(d3)op1=Eval(d6)op2=Eval(d7)return (E-F)

EVAL(d6)cin>>Ereturn val

EVAL(d7)cin>>Freturn val