Vous êtes sur la page 1sur 38

ARBOLES

1. Definicin.
2. Conceptos Generales.
3. Arboles Binarios.
3.1 Definicin.
3.2 Implementacin.
3.3 Recorrido.
3.4 rboles Binarios de Bsqueda (ABB).
o Insercin de un nodo.
o Bsqueda de un nodo.
o Eliminacin de un nodo.
3.5 rboles de Expresin.
o Construccin.
o Evaluacin.
4. Ejemplos

1.- Definicin

Arbol: Estructura que organiza sus elementos,


denominados nodos, en forma jerrquica

1.- Definicin

1.- Definicin

1.- Definicin

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

2.- Conceptos Generales

Un RBOL es una coleccin de elementos


llamados nodos, uno de los cuales se
distingue del resto como RAIZ.
Cualquier nodo, a excepcin de la raz, 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 algn hijo es un nodo
Interno, sino es una Hoja o Nodo Terminal
Rama es cualquier camino que se establece
entre la raz y un nodo terminal.
Nodos Hermanos son nodos hijos de un
mismo padre.

2.- Conceptos Generales

Grado de un nodo: numero de hijos que


salen del nodo. Los nodos con grado cero 0
son nodos terminales
Grado del rbol: el nmero de hijos que
tiene el elemento con ms hijos dentro del
rbol o sea el mximo grado de todos los
nodos del rbol
Nivel: se define para cada elemento del rbol
como la distancia a la raz, medida en nodos.
El nivel de la raz 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.
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 raz de un rbol, tambin
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.
7

ARBOLES
1. Definicin.
2. Conceptos Generales.
3. Arboles Binarios.
3.1 Definicin.
3.2 Implementacin.
3.3 Recorrido.
3.4 rboles Binarios de Bsqueda (ABB).
o Insercin de un nodo.
o Bsqueda de un nodo.
o Eliminacin de un nodo.
3.5 rboles de Expresin.
o Construccin.
o Evaluacin.
4. Ejemplos

3.1.- Definicin
Definicin: un rbol binario es un conjunto finito de nodos que puede estar vaco
o consistir en un nodo raz y dos rboles binarios disjuntos, llamados subrbol
izquierdo y subrbol derecho.

3.2.- Implementacin
IMPLEMENTACION DE ARBOLES

struct datos
{
char nombre[20];
int cedula, edad;
};
typedef datos
int DATO
DATO
struct NODO
{
DATO Info;
NODO * Izq, *Der;
};
};

nombre
cedula
edad

INFO
Izq
Der

typedef NODO* ptNODO;


ptNODO RAIZ;

10

3.2.- Implementacin

11

3.3.- Recorrido

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


(2) s/a izquierdo - Raiz - 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

s/a
izquierdo

s/a
derecho
12

3.3.- Recorrido

(1) Raiz - subrbol izquierdo - subrbol derecho


PRE - ORDEN

(2) subrbol izquierdo - Raiz - subrbol derecho


IN - ORDEN

(3) subrbol izquierdo - subrbol derecho - Raiz


POST - ORDEN
13

3.3.- Recorrido
IN - ORDEN
R
I

12
17
1

25
16

20

32

15

1 17 6 12 15 16 5 20 25 32
14

3.3.- Recorrido
PRE - ORDEN
R
I

12
17
1

25
16

20

32

15

5 12 17 1

6 16 15 25 20 32
15

3.3.- Recorrido
POST - ORDEN
R
I

12
17
1

25
16

20

32

15

6 17 15 16 12 20 32 25 5
16

3.3.- Recorrido
N

IN

I
N

PRE

17

12

1
PRE
IN
POST

25
16

20

D
N

POST

32

15

5 12 17 1 6 16 15 25 20 32
1 17 6 12 15 16 5 20 25 32
1 6 17 15 16 12 20 32 25 5
17

3.3.- Recorrido
Dados dos recorridos, dibujar el rbol correspondiente

IN

80
4,114

90
49,51,58,73,39,86,90
11 49,51,58,73,39,86
58

NULL

49
49,51
NULL

PRE
IN

51

D
N

PRE

NULL

39
73,39,86
73

86

80 4 11 90 58 49 51 39 73 86
4 11 80 49 51 58 73 39 86 90
18

3.3.- Recorrido
Recorrido INORDEN.-

Recorrido PREORDEN.-

void RecIn(ptNODO RAIZ)


{
if(RAIZ!=NULL)
{
RecIn(RAIZ->Izq);
cout<<RAIZ->Info;
RecIn(RAIZ->Der);
}
}

void RecPre(ptNODO RAIZ)


{
if(RAIZ!=NULL)
{
cout<<RAIZ->Info;
RecPre(RAIZ->Izq);
RecPre(RAIZ->Der);
}
}

Recorrido POSTORDEN.void RecPost(ptNODO RAIZ)


{
if(RAIZ!=NULL)
{
RecPost(RAIZ->Izq);
RecPost(RAIZ->Der);
cout<<" "<<RAIZ->Info;
}
}

19

void RecIn(ptNODO RAIZ)


{
if(RAIZ!=NULL)
{
RecIn (RAIZ->Izq);
cout<<RAIZ->Info;
RecIn (RAIZ->Der);
}
}

RecIn(d1)

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

6 12 15 16 17 20 25 32

RecIn(d4)
RecIn(d6)
cout<<d3->Info
cout<<d2->Info
RecIn(d7)
RecIn(d5)

RecIn(d10)
RecIn(Null)
RecIn(d8)
cout<<d6->Info
cout<<d7->Info
cout<<d4->Info
cout<<d5->Info
RecIn(d9)
RecIn(Null)

RecIn(Null)
cout<<d10->Info
cout<<d8->Info
cout<<d9->Info
RecIn(Null)

20

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

21

ARBOLES
1. Definicin.
2. Conceptos Generales.
3. Arboles Binarios.
3.1 Definicin.
3.2 Implementacin.
3.3 Recorrido.
3.4 rboles Binarios de Bsqueda (ABB - BST).
o Insercin de un nodo.
o Bsqueda de un nodo.
o Eliminacin de un nodo.
3.5 rboles de Expresin.
o Construccin.
o Evaluacin.
4. Ejemplos

22

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

23

3.4.- Arboles Binarios de Bsqueda

Un Arbol Binario de Bsqueda (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

24

17

typedef int DATO


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

Raiz

NULL
Izq
Izq
NULL
Der
Der

d1

Info
17

3.4.- Arboles Binarios de Bsqueda


Insercin un Nodo
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;
}

25

3.4.- Arboles Binarios de Bsqueda


Insercin un Nodo

14

NULL
d2
NULL

17

int INSERTAR(ptNODO &RAIZ,DATO ELEM)


{ if(RAIZ==NULL)
{ RAIZ=new(NODO);
typedef int DATO
if(RAIZ!=NULL)
struct NODO
{ RAIZ->Info=ELEM;
{
DATO Info;
RAIZ->Izq=NULL;
NODO * Izq, *Der;
};
RAIZ->Der=NULL;
typedef NODO* ptNODO;
return 0;
ptNODO RAIZ;
}
else
return 1;
Raiz
}
else if(ELEM>RAIZ->Info)
d1
return INSERTAR(RAIZ->Der,ELEM);
else if(ELEM<RAIZ->Info)
return INSERTAR(RAIZ->Izq,ELEM);
else return 1;
}

26

3.4.- Arboles Binarios de Bsqueda


Insercin un Nodo

14

NULL
d2
NULL

NULL
Izq
NULL
Der

Info
14

17

int INSERTAR(ptNODO &RAIZ,DATO ELEM)


{ if(RAIZ==NULL)
{ RAIZ=new(NODO);
typedef int DATO
if(RAIZ!=NULL)
struct NODO
{ RAIZ->Info=ELEM;
{
DATO Info;
RAIZ->Izq=NULL;
NODO * Izq, *Der;
};
RAIZ->Der=NULL;
typedef NODO* ptNODO;
return 0;
ptNODO RAIZ;
}
else
return 1;
Raiz
}
else if(ELEM>RAIZ->Info)
d1
return INSERTAR(RAIZ->Der,ELEM);
else if(ELEM<RAIZ->Info)
return INSERTAR(RAIZ->Izq,ELEM);
else return 1;
d2
}

27

3.4.- Arboles Binarios de Bsqueda


Bsqueda de un Nodo

20

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

BUSCAR(d1,20)
return d6
BUSCAR(d3,20)

BUSCAR(d3,20)
return d6
BUSCAR(d6,20)

BUSCAR(d6,2
0)
return d6
28

3.4.- Arboles Binarios de Bsqueda


Eliminacion de un Nodo
Esta operacin es una extensin de la operacin de bsqueda aunque es mas
complicada debido a que se debe mantener la estructura de rbol binario despus 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,
el infoson:
del nodo N.
Los
pasosque
a seguir
1.

Buscar la posicin (direccin) 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.

Borrar 16
Borrar 1

17
14

PADRE

16
15

4
1

PADRE

25
20

32

15 HIJO
29

3.4.- Arboles Binarios de Bsqueda


Eliminacion de un Nodo

Los pasos a seguir son:


1.

Buscar la posicin (direccin) 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.

Borrar 34

70
34
28

Menor de los menores


Mayor
mayores = 70
28

90

18
25

6
20

70

100

28

30

3.4.- Arboles Binarios de Bsqueda


Eliminacion de un Nodo
void ELIM(ptNODO &R, DATO X)
{ ptNODO Q;
if(R==NULL)
cout<<"NO EXISTE VALOR";
else if(X<R->Info)
Q
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
R

N
0
1
2
3

Elim(R,X)
Elim(d1,6)
Elim(d2,6)
Elim(d4,6)
Q=R
R=NULL
delete(Q)

R
d1
d2
d4

X
6
6
6

RInfo
34
18
6

31

3.4.- Arboles Binarios de Bsqueda


Eliminacion de un Nodo
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
Q

N
0
1
2

Elim(R,X)
R X RInfo
Elim(d1,90) d1 90 34
Elim(d3,90) d3 90 90
Q=R
R=Q->Der
delete(Q)

32

3.4.- Arboles Binarios de Bsqueda


Eliminacion de un Nodo
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

P
P
P
Q

N
0
1
2
3

ELIM(R,X)
P Q R X RInfo
ELIM(d1,34)
d1 d1 34 34
REEMP(d2,d1) d2 d1
REEMP(d5,d1) d5 d1
REEMP(d8,d1) d8 d1
Q Info = P Info
Q=P
P = P Izq
delete(Q)

33

ARBOLES
1. Definicin.
2. Conceptos Generales.
3. Arboles Binarios.
3.1 Definicin.
3.2 Implementacin.
3.3 Recorrido.
3.4 rboles Binarios de Bsqueda (ABB).
o Insercin de un nodo.
o Bsqueda de un nodo.
o Eliminacin de un nodo.
3.5 rboles de Expresin.
o Construccin.
o Evaluacin.
4. Ejemplos

34

3.4.- Arboles de Expresin


Construccin
Los rboles binarios se utilizan para representar/evaluar expresiones. Las expresiones
contienen bsicamente operadores y operandos, se puede representar por un rbol binario
donde la raz contiene el operador y los subrboles izquierdo/derecho contienen los
operandos. Cada operando puede ser una variable (AZ) o una subexpresin representada
por un subrbol.

A*((B + C) / D) + (EF)
OPERADOR
+

*
OPERANDO
A*((B+C)/D)

OPERANDO
E-F

(B+C)/D
/
B+C
+
B

D
C
35

3.4.- Arboles de Expresin


Construccin
La evaluacin de una expresin usando rboles binarios tiene tres pasos:
1.

Transformar la expresin de In_Fija a Post_Fija.

2.

Construir a partir de la expresin en Post_Fija el Arbol de Expresin.

3.

Evaluar la expresin utilizando el rbol construido.

Construccin del rbol a partir de la expresin Post_Fija


El algoritmo sigue los siguientes pasos:
1.

Se lee la expresin postfija de izquierda


a derecha, carcter por carcter.

2.

Si carcter ledo es operando (A..Z), se


crea el nodo y se guarda su direccin en
una pila.

3.

Si carcter es operador, se crea el nodo


para el operador, y se conectan los
punteros izq/der con las direcciones
extradas de la pila.

4.

Se mete en la pila la direccin del nodo


que contiene el operando.

5.

Se repite desde el paso 2 hasta leer


toda la expresion..

AB+CD-*
PILA

D5
D2
D4
D6
D1
D3
D7

36

3.4.- Arboles de Expresin


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

37

3.4.- Arboles de Expresin


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

EVAL(d1)
op1=Eval(d2)
op2=Eval(d3)
return (A+B)*(E-F)
EVAL(d3)
EVAL(d2)
op1=Eval(d4)
op1=Eval(d6)
op2=Eval(d5)
op2=Eval(d7)
return (E-F)
(A+B)
EVAL(d7)
EVAL(d4)
EVAL(d5)
EVAL(d6)
cin>>A
cin>>B
cin>>E
cin>>F
return val
38

Vous aimerez peut-être aussi