Árboles binarios

17
 ÁRBOLES BINARIOS JAVIER LEONARDO LEON NUÑEZ Profesor: OSCAR MORERA UNIVERSIDAD DE CUNDINAMARCA INGENIERIA DE SISTEMAS FACATATIVA ± CUNDINAMARCA 2011

Upload: javier-leon

Post on 14-Jul-2015

580 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 1/17

 

ÁRBOLES BINARIOS

JAVIER LEONARDO LEON NUÑEZ

Profesor:

OSCAR MORERA

UNIVERSIDAD DE CUNDINAMARCA

INGENIERIA DE SISTEMAS

FACATATIVA ± CUNDINAMARCA

2011

Page 2: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 2/17

 

INTRODUCCION

Con este trabajo se pretende hacer una descripción acerca de los Arboles Binarios, que son,como se usan, cual es su utilidad, como manejarlos en el lenguaje C++.

La información que se muestra en este trabajo ha sido consultada en varias fuentes einternet y algunos libros.

Page 3: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 3/17

 

OBJETIVOS

OBJETIVO GENERAL

Dar a conocer la estructura de los Arboles Binarios, sus diferentes características yfunciones.

OBJETIVOS ESPECIFICOS

y  Explicar el concepto de Arboles Binarios. 

y  Mostrar el Uso y Manejo de los Arboles Binarios. 

Page 4: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 4/17

 

1.  DEFINICIONES

1.1 ÁRBOL

El árbol es una estructura usada en todos los ámbitos de la informática ya que se adapta a larepresentación natural de informaciones homogéneas organizadas y de una gran comodidady rapidez de manipulación. Las estructuras tipo árbol se usan para representar datos con unarelación jerárquica entre sus elementos, como son árboles genealógicos, tablas, etc.1 

Es un conjunto finito de uno o más nodos donde hay un nodo llamado Raíz del árbol el cual

es el punto de partida de la estructura, los nodos restantes se dividen en conjuntos disjuntoscada uno de los cuales a su vez es un árbol se denominan subárboles.

1.2 ÁRBOLES BINARIOS

Este tipo de árbol se caracteriza por tener un vértice principal denominado raíz y de él sedesprenden dos ramas (no más de dos), la rama derecha y la rama izquierda, quienes a suvez también son dos árboles binarios (árbol izquierdo, árbol derecho).

La Raíz de este árbol es A y el árbolderecho está conformado por otro árbolque tiene como raíz B, el árbol derechoestá conformado por un árbol sinramificaciones.

1 Arboles Binarios en C++( Laboratorio de Programación E.T.S.I)

Page 5: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 5/17

 

1.3 NODO

Un árbol binario está compuesto de unconjunto de elementos de los cuales cadauno se denomina nodo, un árbol puedetener cero nodos (árbol vacio). Puede tener un solo nodo (solo la raíz) o puede tener unnumero finito de nodos. Un nodo estácompuesto de la siguiente manera:

1.4 RAIZ 

Un árbol binario consta de la raíz principal y las raíces de los demás subárboles (si lostiene).

1.5 PADRE

Es un nodo que puede o no tener ramificaciones como por ejemplo:

En este caso el nodo A es el padre de los nodos B y C pero no es el padre del nodo D

1.6 HIJO

Como vemos en el ejemplo anterior el nodo D es el Hijo del nodo B y a su vez los nodos By C son hijos del nodo A.

1.7 HERMANO

Son los hijos del mismo padre.

1.8 HOJA

Es un nodo que no tiene ramificaciones.

1.9 NODO NO TERMINAL

Es aquel nodo que posee por lo menos una ramificación.

1.10 CAMINO

Page 6: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 6/17

 

 

Un árbol siempre se examina hacia abajo, podemos llegar a una hoja por medio del padre

 pero no podemos llegar al padre por medio de la hoja.

1.11 LONGITUD

Es el número de nodos que se deben de recorrer para pasar de un nodo a otro.

1.12 DESCENDIENTE

Un nodo es descendiente de otro si a través de un camino podemos llegar un nodo al otronodo, ejemplo de C hasta A (raíz principal).

1.13 ANCESTRO

Un nodo es Ancestro de otro si a través de un camino podemos llegar un nodo al otro nodo,ejemplo de A (raíz principal) hasta C.

1.14 NIVEL

Los nodos tienen un nivel dentro de un árbol, por concepto el nodo raíz tiene un nivel 0 ylos demás nodos tienen el nivel de su padre mas 1.

1.15 GRADO DE UN NODO

El grado de un nodo esta dado por el número de hijos, el grado de un nodo está entre 0 y 2.

1.16 ALTURA

Es el nivel de la hoja o de las hojas que están más distantes de la raíz.  

1.17 PESO

Es el número de nodos en el árbol si contarse el mismo (raíz).

Page 7: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 7/17

 

2.  CREACION

NODO2 

Tipo de datos que representa un nodo:Struct nodo {

int info;struct nodo *izq;struct nodo *der;

};Y una variable definida:

struct nodo*raiz

La instrucción sería:

raiz=(struct nodo *)malloc(sizeof (struct nodo)); //malloc solicitud bloque de memoria

Queda algo como: Raíz

Si queremos por la izquierda el número 5 elaboraremos una función que inserte por laizquierda un nuevo nodo dado un apuntador a nodo padre del nuevo hijo, la función recibelos datos así:void ins_izq(struct nodo *p, int n); // p se recibe por valor ya que el contenido de p concambiaLa función:void ins_izq(struct nodo *p, int n){

struct nodo *nuevo;nuevo = nodo_arbol; // nodo_arbol macro instrucción explicada más adelante

nuevo->info = n;nuevo->izq =NULL;nuevo->der = NULL; p->izq = nuevo;

}

2Estructuras de datos en C++ (Cesar A. Becerra)

Page 8: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 8/17

 

Si n = 5 entonces:

La Macro instrucción introducida anteriormente: nodo_arbol está diseñada así:#define nodo_arbol(struct nodo*)malloc(sizeof(struct nodo))

Utilizando esa función y la de derecha (void ins_der en el que cambia p->izq por p->der)

 podemos seguir añadiendo datos al árbol.

3.  FORMAS DE RECORRER UN ARBOL

Existen 3 formas de recorrer un árbol binario: Preorden, Posorden, inorden,Si construimos un árbol como:

3.1  PREORDEN

Entonces para recorrer un árbol en preorden tenemos que:-  Examinar el dato del nodo raíz.-  Recorrer el árbol izquierdo en preorden.-  Recorrer el árbol derecho en preorden.

Para recorrer este árbol en preorden entonces:Examinar el dato raíz en este caso seria A luego recorrer el árbol izquierdo en preorden para lo cual necesitamos examinar el dato raíz de este árbol que sería B luego recorrer elárbol izquierdo en preorden, es una hoja por lo tanto no tiene hijos, examinamos esa raíz Dy pasamos al recorrer el árbol derecho E, luego pasamos a recorrer el árbol izquierdo de laraíz principal, nos encontramos con otro árbol entonces examinamos el dato C y recorremos

Page 9: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 9/17

 

el árbol izquierdo F y luego el derecho G con lo que nos quedaría el árbol recorrido en  preorden así:

A-B-D-E-C-F-G.

3.2  INORDEN

Ahora veamos el recorrido en inorden para ello tenemos que:-  Recorrer el árbol izquierdo en inorden.-  Examinar la raíz.-  Recorrer el árbol derecho en inorden.

Para recorrer este árbol en inorden entonces:Examinar el árbol izquierdo en inorden con lo que encontramos el árbol con raíz B este lorecorremos en inorden de nuevo con lo que nos encontramos en este caso con la raíz D queni tiene hijos, luego examinamos la raíz en este caso B luego el árbol derecho en inordencon lo que nos encontramos a E una raíz sin hijos, luego examinamos la raíz principal Aque es la raíz padre de B luego pasamos al árbol derecho de la raíz y encontramos el árbolcon raíz C el cual recorremos en inorden y nos encontramos con F una raíz si hijos, laexaminamos y pasamos a examinar la raíz C y luego el otro árbol el izquierdo y allíencontramos G raíz sin hijos examinamos esta raíz y terminamos de examinar el árbol nosqueda así :

D-B-E-A-F-C-G

3.3  POSTORDEN

Ahora veamos el recorrido en posoden para ello tenemos que:-  Recorrer el árbol izquierdo en posorden.-  Recorrer el árbol derecho en posorden. -  Examinar la raíz.

Para recorrer este árbol en posorden entonces:Examinamos el árbol izquierdo en postorden encontramos B que a su vez tiene como hijo D

en el árbol izquierdo luego analizamos el árbol derecho E y por último la raíz B, luegoanalizamos el árbol derecho C el cual tiene en su árbol izquierdo a F y en el derecho a G yluego analizamos la raíz C y por último la raíz que seria A el árbol nos quedaría:

D-E-B-F-G-C-A

Page 10: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 10/17

 

4.  UTLIDAD

Una de las principales utilidades que encontramos a la hora de usar arboles binarios esclasificar un conjunto de números.Utilizando un árbol binario es posible mantener un conjunto e números clasificados demanera ascendente sin necesidad de rutinas de ordenamiento para el ejemplo tenemos unconjunto de números se ordenaran de manera ascendente y que de estar repetidos seránrechazados.La entrada es 87, 25, 23, 25, 48, 8 ,92.Para solucionar este ³problema´ simplemente tenemos que ir leyendo cifra a cifra yadicionarla en el árbol, si es menor al contenido del nodo se adiciona al árbol por laizquierda y si es mayor por la derecha, entonces: al leer el numero 87 creamos este dato enel nodo raíz, luego al leer 25 como 25 es menor que 87 lo creamos un nuevo nodo por la

izquierda de 87, luego al leer 23, este dato es menor que 87 por lo que nos desplaza por laizquierda hacia abajo, al llegar a 25 creamos un nuevo nodo a la izquierda por lo que 23 esmenor que 25, al leer el siguiente dato este esrechazado porque ya existe el 25 en el árbol,al leer 48 , nos desplazamos por la izquierdadel 87 hasta el 25 y luego creamos un nuevonodo a la derecha del 25 ya que 48 es mayor que 25, así mismo al leer el 8 este debe ser colocado a la izquierda del 23 y por ultimo alleer el 92 lo colocaremos a la derecha del 87ya que es mayor, si imprimimos el contenido

de este árbol recorriéndolo en inorden,tendremos la lista pedida (ascendente) 8, 23,25,48 ,87, 92.Al recorrer este árbol en inorden quedaría:

8-23-25-48-87-92Ahora implementar el problema para qué función en un computador, La raiz de el árbol esnecesaria crearla solamente una vez, las instrucciones para crearla están fuera de el ciclo para controlar la finalización de los datos:n=lea_entero();raiz=nodo_arbol;raiz->info=n;

raiz->izq=NULL;raiz->der=NULL;while(n!=9999){

 buscar sitio parainsertar n;insertar n;n=lea_entero();

}

Page 11: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 11/17

 

Antes del while tenemos creado un árbol cuya raíz es 87 y tanto izquierda como derechaapuntan al NULL.

³buscar sitio para insertar n´ este ciclo direcciona el apuntador al nodo en el cual sealmacenara el apuntador al nuevo nodo insertado, teniendo un apuntador q que examinacada nodo, desde la raíz hasta cuando encuentre el sitio apropiado para insertar n y unapuntador p que avanza tras de del ciclo que encuentra un lugar apropiado para insertar nes:

q=p=raiz;while (q!=NULL && p->info !n){

 p=q;if (n<p->info)

q=q->izq;elseq=q->der;

}

Ahora determinaremos si podemos o no insertar n en el árbol:

if(p->info = = n)cout<<´repetido´

elseinsertar n;

El proceso de insertar n consiste en conectar un nodo que contenga n ya sea por la izquierdao por la derecha del nodo indicado por p así:if (n < p->info)

ins_izq(p,n);else

ins_der(p,n);Rutina general:3 

#include <stdio.h>#include <stdlib.h>

#define nodo_arbol (struct nodo *)malloc(sizeof(struct nodo))struct nodo{int info;struct nodo *izq;struct nodo *der;

};

3Estructuras de datos en C++ (Cesar A. Becerra)

Page 12: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 12/17

 

void ins_izq(struct nodo *p, int n);void ins_der(struct nodo *p, int n);

lea_ entero ();

void main(){struct nodo *raiz,*p,*q;int n;int lea_entero(); printf(³de numero \n´);n= lea_entero();raiz=nodo_arbol;raiz->info=n;raiz->izq=NULL;

raiz->der=NULL; printf(³de numero \n´);while(n!=9999){

q=p=raiz;while (q!=NULL && p->info !n){

 p=q;if (n<p->info)q=q->izq;elseq=q->der;

}if(p->info = = n) printf(³numero repetido \n´);

else{

if(n < p->info)ins_izq(p,n);elseins_der(p,n);

} printf(³de numero \n´);

n= lea entero();}}

Page 13: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 13/17

 

lea_ entero (){

char línea[10];texto(línea,10);return(converi(linea));

}

void ins_izq(struct nodo *p, int n){

struct nodo *nuevo;nuevo = nodo_arbol; // nodo_arbol macro instrucción explicada más adelantenuevo->info = n;nuevo->izq =NULL;

nuevo->der = NULL; p->izq = nuevo;}void ins_der(struct nodo *p, int n){

struct nodo *nuevo;nuevo = nodo_arbol; // nodo_arbol macro instrucción explicada más adelantenuevo->info = n;nuevo->izq =NULL;nuevo->der = NULL; p->der = nuevo;

}IMPRESIÓN DE UN ARBOL EN INORDEN

Observando el proceso lo primero que se escribesiempre es el contenido del nodo de la extremaizquierda del árbol. Luego debemos escribir elcontenido del nodo padre para luego escribir eninorden el árbol de la derecha, para escribir elcontenido de la hoja que está en el extremoizquierdo es necesario desplazar un apuntador desde la raíz hasta el nodo, por ejemplo el ciclo

siguiente puede servir: p=NULL;q=raiz;while(q){

 p=q;q=q->izq;

}

Page 14: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 14/17

 

Luego lo imprimimos p ya que q tiene el valor en NULL, ahora debemos imprimir el nodo padre, pero nos damos cuenta que no dejamos indicado el camino por el cual llegamos a a

ultima hoja lo cual hace imposible regresar para continuar el proceso, para resolver este problema podemos utilizar una pila entonces la pila para el ultimo nodoDebe contener:

Donde cada elemento de la pila contiene la dirección de cada nodo

Que se debió visitar para llegar a la hoja indicada para cargar la pila con esta información elciclo puede ser el siguiente: p=raiz;while(q){

ins_pila(&pila,p) //función para agregar un dato en este caso dirección a la pila p=p->izq;}

El siguiente paso sería retirar de la pila el último componente y escribir el contenido en esadirección así:

retira_pila(&pila,&p) //rutina para retirar un dato de la pila y en este caso  printf(³%d´,p->info) // asignarle a p la dirección donde está el dato a imprimir 

Siguiendo este ejemplo tendríamos impreso 8 y en la pila en el apuntador p existe la

 posición C ahora debemosInvestigar si existe un árbol por la derecha de este nodo así: p=p->der;si p = NULL no existe por lo tanto debemos retirar de la pila la direccióndel nodo padre así :retira_pila(&pila,&p);Y escribir o imprimir p->info en este momento tenemos escrito: 8, 23 y la pilaasi:

Comprobamos una vez más si existe un árbol a la derecha de este nodo y tenemos como

resultado que p=NULL por lo tanto retiramos nuevamente de la pila la dirección del nodo  padre y imprimimos p->info en este momento tenemos escrito: 8,23, 25 ylaPila así:

4 D A B C

3 D A B

2 D A

1 D

Page 15: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 15/17

 

Comprobamos una vez más si existe un árbol a la derecha de este nodo y tenemos comoresultado que p es diferente de NULL así que tenemos que desplazarnos en inorden hasta la

hoja externa izquierda de este nuevo árbol con:while(q){

ins_pila(&pila,p); p=p->izq;

}En este momento la pila estaría asi:Ahora repetimos el proceso de retirar de la pila la dirección E y escribir el contenido en estecaso 48Con lo que la pila nos quedaríaContinuamos con los pasos de comprobación y impresión hasta imprimir la última hoja

externa derecha del árbol con lo que nos quedaría la pila asi:Y la escritura o impresión asi: 8, 23, 25, 48, 87, 92

/* -----Pilas C++ ³Estructuras de datos en C++ (Cesar A. Becerra)´ ----

int ins_pila(struct LIFO *p){

if(p->t = = MAXIMO)cout<<´Esta Lleno, La pila no puede soportar mas elementos´<<endl;

else{

 p->t++; p->a[p->t-1];}

}

void retira_pila(struct LIFO *p, struct nodo *s){

if(pila_vacia(p)){

cout<<´La pila esta vacia´<<endl;*s=NULL;

}else{

*s=p->a[p->t-1]; p->t--;

}} */

2 D E

1 D

0

Page 16: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 16/17

 

CONCLUSIÓN

Los arboles binarios facilitan u optimizan la utilización de recursos en el computador además es una manera más sencilla de manejar los datos a comparación de listas sencillas odobles que para consultar un dato hay que pasar por lo menos una vez por cada nodo encasos donde el dato deseado esta al final de la lista, mientras que con arboles binarios elnúmero máximo de nodos recorridos es la posición dentro del árbol de la hoja más lejana.

Page 17: ÁRBOLES BINARIOS

5/12/2018 ÁRBOLES BINARIOS - slidepdf.com

http://slidepdf.com/reader/full/arboles-binarios-55a4d2af9ff95 17/17

 

BIBLIOGRAFÍA ± INFOGRAFÍA

-  Estructuras de datos en C++ 4ª Edición Autor: César A. Becerra Santamaría

-  Árboles Binarios en C++ Laboratorio de Programación 1ºA E.T.S.I. InformáticaGestión José Luis Pastrana Brincones @ 2004 - 

http://www.lcc.uma.es/~pastrana/LP/curso0304/P19_04.pdf 

-  Curso de C Por Nacho Cabanes, versión 0.90 pre4http://www.nachocabanes.com/c/curso/cc09.ph p

-  Árbol binario http://es.wikipedia.org/wiki/%C3%81rbol_binario

-  Memoria dinámica: malloc y free -http://sopa.dis.ulpgc.es/so/cpp/intro_c/introc75.htm