ARBOLES_2011_2
-
Upload
luis-daniel-rodriguez-vera -
Category
Documents
-
view
218 -
download
4
description
Transcript of 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
2
Arbol: Estructura que organiza sus elementos, denominados nodos, en forma jerárquica
1.- Definición
3
1.- Definición
4
1.- Definición
5
( ( A + B ) / ( C – D) ) * ( E - F )
1.- Definición
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
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
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
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
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
11
3.2.- Implementación
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
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
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
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
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
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
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
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
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
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;}
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
23http://www.comscore.com/esl/Press_Events/Press_Releases/2010/1/Global_Search_Market_Grows_46_Percent_in_2009
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
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
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
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
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
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.
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
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
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
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
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
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 )
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
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
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