P. 1
ÁRBOLES BINARIOS

ÁRBOLES BINARIOS

|Views: 583|Likes:
Publicado porJavier Leon

More info:

Published by: Javier Leon on Jan 16, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

06/11/2015

pdf

text

original

ÁRBOLES BINARIOS

JAVIER LEONARDO LEON NUÑEZ

Profesor: OSCAR MORERA

UNIVERSIDAD DE CUNDINAMARCA INGENIERIA DE SISTEMAS FACATATIVA ± CUNDINAMARCA 2011

. La información que se muestra en este trabajo ha sido consultada en varias fuentes e internet y algunos libros. como se usan. como manejarlos en el lenguaje C++. cual es su utilidad. que son.INTRODUCCION Con este trabajo se pretende hacer una descripción acerca de los Arboles Binarios.

OBJETIVOS ESPECIFICOS y y Explicar el concepto de Arboles Binarios.OBJETIVOS OBJETIVO GENERAL Dar a conocer la estructura de los Arboles Binarios. sus diferentes características y funciones. Mostrar el Uso y Manejo de los Arboles Binarios. .

I) . Las estructuras tipo árbol se usan para representar datos con una relación jerárquica entre sus elementos. La Raíz de este árbol es A y el árbol derecho está conformado por otro árbol que tiene como raíz B. DEFINICIONES 1. árbol derecho).1. la rama derecha y la rama izquierda.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. tablas. 1. los nodos restantes se dividen en conjuntos disjuntos cada uno de los cuales a su vez es un árbol se denominan subárboles.S. el árbol derecho está conformado por un árbol sin ramificaciones.2 ÁRBOLES BINARIOS Este tipo de árbol se caracteriza por tener un vértice principal denominado raíz y de él se desprenden dos ramas (no más de dos).1 ÁRBOL El árbol es una estructura usada en todos los ámbitos de la informática ya que se adapta a la representación natural de informaciones homogéneas organizadas y de una gran comodidad y rapidez de manipulación. etc.T. 1 Arboles Binarios en C++( Laboratorio de Programación E. quienes a su vez también son dos árboles binarios (árbol izquierdo. como son árboles genealógicos.

3 NODO Un árbol binario está compuesto de un conjunto de elementos de los cuales cada uno se denomina nodo.10 CAMINO . 1. un árbol puede tener cero nodos (árbol vacio).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. Puede tener un solo nodo (solo la raíz) o puede tener un numero finito de nodos. 1. 1.4 RAIZ Un árbol binario consta de la raíz principal y las raíces de los demás subárboles (si los tiene). 1. Un nodo está compuesto de la siguiente manera: 1.6 HIJO Como vemos en el ejemplo anterior el nodo D es el Hijo del nodo B y a su vez los nodos B y C son hijos del nodo A.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.

el grado de un nodo está entre 0 y 2.14 NIVEL Los nodos tienen un nivel dentro de un árbol.11 LONGITUD Es el número de nodos que se deben de recorrer para pasar de un nodo a otro.17 PESO Es el número de nodos en el árbol si contarse el mismo (raíz). 1.13 ANCESTRO Un nodo es Ancestro de otro si a través de un camino podemos llegar un nodo al otro nodo. 1.15 GRADO DE UN NODO El grado de un nodo esta dado por el número de hijos. 1. podemos llegar a una hoja por medio del padre pero no podemos llegar al padre por medio de la hoja. 1. 1. . por concepto el nodo raíz tiene un nivel 0 y los demás nodos tienen el nivel de su padre mas 1.Un árbol siempre se examina hacia abajo. ejemplo de A (raíz principal) hasta C. 1.12 DESCENDIENTE Un nodo es descendiente de otro si a través de un camino podemos llegar un nodo al otro nodo. ejemplo de C hasta A (raíz principal). 1.16 ALTURA Es el nivel de la hoja o de las hojas que están más distantes de la raíz.

}. nuevo->izq =NULL. nuevo = nodo_arbol. int n) { struct nodo *nuevo. struct nodo *der. int n). Queda algo como: Raíz //malloc solicitud bloque de memoria Si queremos por la izquierda el número 5 elaboraremos una función que inserte por la izquierda un nuevo nodo dado un apuntador a nodo padre del nuevo hijo. la función recibe los datos así: void ins_izq(struct nodo *p. Y una variable definida: struct nodo*raiz La instrucción sería: raiz=(struct nodo *)malloc(sizeof (struct nodo)). Becerra) . nuevo->der = NULL. struct nodo *izq. // nodo_arbol macro instrucción explicada más adelante nuevo->info = n. } 2 Estructuras de datos en C++ (Cesar A. p->izq = nuevo. CREACION NODO2 Tipo de datos que representa un nodo: Struct nodo { int info. // p se recibe por valor ya que el contenido de p con cambia La función: void ins_izq(struct nodo *p.2.

1 PREORDEN Entonces para recorrer un árbol en preorden tenemos que: . es una hoja por lo tanto no tiene hijos. 3. examinamos esa raíz D y pasamos al recorrer el árbol derecho E. inorden.Recorrer el árbol izquierdo en preorden. nos encontramos con otro árbol entonces examinamos el dato C y recorremos . . luego pasamos a recorrer el árbol izquierdo de la raíz principal.Examinar el dato del nodo raíz. Posorden. FORMAS DE RECORRER UN ARBOL Existen 3 formas de recorrer un árbol binario: Preorden.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. . Si construimos un árbol como: 3. 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.Recorrer el árbol derecho en preorden.

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. .Examinar la raíz. . luego examinamos la raíz principal A que es la raíz padre de B luego pasamos al árbol derecho de la raíz y encontramos el árbol con raíz C el cual recorremos en inorden y nos encontramos con F una raíz si hijos.Recorrer el árbol izquierdo en posorden.Recorrer el árbol derecho en inorden.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.3 POSTORDEN Ahora veamos el recorrido en posoden para ello tenemos que: .Recorrer el árbol izquierdo 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 lo recorremos en inorden de nuevo con lo que nos encontramos en este caso con la raíz D que ni tiene hijos. la examinamos 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 nos queda así : D-B-E-A-F-C-G 3. luego analizamos el árbol derecho C el cual tiene en su árbol izquierdo a F y en el derecho a G y luego 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 . .Recorrer el árbol derecho en posorden. luego examinamos la raíz en este caso B luego el árbol derecho en inorden con lo que nos encontramos a E una raíz sin hijos. .2 INORDEN Ahora veamos el recorrido en inorden para ello tenemos que: . 3.

25.87. si es menor al contenido del nodo se adiciona al árbol por la izquierda y si es mayor por la derecha. así mismo al leer el 8 este debe ser colocado a la izquierda del 23 y por ultimo al leer el 92 lo colocaremos a la derecha del 87 ya que es mayor. tendremos la lista pedida (ascendente) 8. } . La raiz de el árbol es necesaria crearla solamente una vez. UTLIDAD Una de las principales utilidades que encontramos a la hora de usar arboles binarios es clasificar un conjunto de números.48 . luego al leer 23. while(n!=9999){ buscar sitio para insertar n. La entrada es 87. 8 . luego al leer 25 como 25 es menor que 87 lo creamos un nuevo nodo por la izquierda de 87. 23. este dato es menor que 87 por lo que nos desplaza por la izquierda hacia abajo. raiz->der=NULL. nos desplazamos por la izquierda del 87 hasta el 25 y luego creamos un nuevo nodo a la derecha del 25 ya que 48 es mayor que 25. Utilizando un árbol binario es posible mantener un conjunto e números clasificados de manera ascendente sin necesidad de rutinas de ordenamiento para el ejemplo tenemos un conjunto de números se ordenaran de manera ascendente y que de estar repetidos serán rechazados. 25. si imprimimos el contenido de este árbol recorriéndolo en inorden. 92. al leer el siguiente dato este es rechazado porque ya existe el 25 en el árbol. al leer 48 . n=lea_entero(). Al recorrer este árbol en inorden quedaría: 8-23-25-48-87-92 Ahora implementar el problema para qué función en un computador. raiz->izq=NULL. insertar n. 25. raiz->info=n.92. raiz=nodo_arbol. 23. las instrucciones para crearla están fuera de el ciclo para controlar la finalización de los datos: n=lea_entero(). 48. entonces: al leer el numero 87 creamos este dato en el nodo raíz. Para solucionar este ³problema´ simplemente tenemos que ir leyendo cifra a cifra y adicionarla en el árbol.4. al llegar a 25 creamos un nuevo nodo a la izquierda por lo que 23 es menor que 25.

Antes del while tenemos creado un árbol cuya raíz es 87 y tanto izquierda como derecha apuntan al NULL. }.h> #define nodo_arbol (struct nodo *)malloc(sizeof(struct nodo)) struct nodo{ int info. else q=q->der. 3 Estructuras de datos en C++ (Cesar A. Rutina general:3 #include <stdio. else ins_der(p. struct nodo *der. Becerra) . ³buscar sitio para insertar n´ este ciclo direcciona el apuntador al nodo en el cual se almacenara el apuntador al nuevo nodo insertado. El proceso de insertar n consiste en conectar un nodo que contenga n ya sea por la izquierda o por la derecha del nodo indicado por p así: if (n < p->info) ins_izq(p.n).h> #include <stdlib. while (q!=NULL && p->info !n) { p=q.n). } Ahora determinaremos si podemos o no insertar n en el árbol: if(p->info = = n) cout<<´repetido´ else insertar n. struct nodo *izq. desde la raíz hasta cuando encuentre el sitio apropiado para insertar n y un apuntador p que avanza tras de del ciclo que encuentra un lugar apropiado para insertar n es: q=p=raiz. teniendo un apuntador q que examina cada nodo. if (n<p->info) q=q->izq.

} if(p->info = = n) printf(³numero repetido \n´). } printf(³de numero \n´). raiz->izq=NULL. while (q!=NULL && p->info !n) { p=q. } } .n). void ins_der(struct nodo *p. else { if(n < p->info) ins_izq(p. while(n!=9999){ q=p=raiz.*q. int n.void ins_izq(struct nodo *p. printf(³de numero \n´). if (n<p->info) q=q->izq. else ins_der(p. int n). raiz->info=n. n= lea entero(). int n). int lea_entero().n).*p. n= lea_entero(). raiz=nodo_arbol. raiz->der=NULL. else q=q->der. void main(){ struct nodo *raiz. lea_ entero (). printf(³de numero \n´).

while(q) { p=q.10). } void ins_der(struct nodo *p. q=q->izq. } IMPRESIÓN DE UN ARBOL EN INORDEN Observando el proceso lo primero que se escribe siempre es el contenido del nodo de la extrema izquierda del árbol. texto(línea. nuevo = nodo_arbol. p->izq = nuevo. por ejemplo el ciclo siguiente puede servir: p=NULL. } void ins_izq(struct nodo *p.lea_ entero () { char línea[10]. nuevo->izq =NULL. q=raiz. return(converi(linea)). nuevo = nodo_arbol. p->der = nuevo. // nodo_arbol macro instrucción explicada más adelante nuevo->info = n. // nodo_arbol macro instrucción explicada más adelante nuevo->info = n. int n) { struct nodo *nuevo. nuevo->der = NULL. } . int n) { struct nodo *nuevo. Luego debemos escribir el contenido del nodo padre para luego escribir en inorden el árbol de la derecha. nuevo->izq =NULL. nuevo->der = NULL. para escribir el contenido de la hoja que está en el extremo izquierdo es necesario desplazar un apuntador desde la raíz hasta el nodo.

si p = NULL no existe por lo tanto debemos retirar de la pila la dirección del nodo padre así : retira_pila(&pila. 25 y 1 D la Pila así: . while(q) { ins_pila(&pila.p->info) //rutina para retirar un dato de la pila y en este caso // 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 debemos Investigar si existe un árbol por la derecha de este nodo así: 3 D A B p=p->der.&p) printf(³%d´. } El siguiente paso sería retirar de la pila el último componente y escribir el contenido en esa dirección así: retira_pila(&pila. 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 nodo Debe contener: 4 D A B C 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 el ciclo puede ser el siguiente: p=raiz.p) //función para agregar un dato en este caso dirección a la pila p=p->izq.&p). 23 y la pila asi: 2 D A 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.Luego lo imprimimos p ya que q tiene el valor en NULL.23. ahora debemos imprimir el nodo padre. Y escribir o imprimir p->info en este momento tenemos escrito: 8.

p->a[p->t-1].p). p=p->izq. Becerra)´ ---int ins_pila(struct LIFO *p) { if(p->t = = MAXIMO) cout<<´Esta Lleno. *s=NULL. } 2 D E 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 este caso 48 1 D Con lo que la pila nos quedaría Continuamos 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: 0 Y la escritura o impresión asi: 8. 25. else { p->t++. } } */ .Comprobamos una vez más si existe un árbol a la derecha de este nodo y tenemos como resultado 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. 23. struct nodo *s) { if(pila_vacia(p)) { cout<<´La pila esta vacia´<<endl. 87. 48. La pila no puede soportar mas elementos´<<endl. p->t--. } else { *s=p->a[p->t-1]. 92 /* -----Pilas C++ ³Estructuras de datos en C++ (Cesar A. } } void retira_pila(struct LIFO *p.

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 o dobles que para consultar un dato hay que pasar por lo menos una vez por cada nodo en casos donde el dato deseado esta al final de la lista. . mientras que con arboles binarios el número máximo de nodos recorridos es la posición dentro del árbol de la hoja más lejana.

wikipedia.es/~pastrana/LP/curso0304/P19_04.com/c/curso/cc09.lcc.90 pre4 http://www.php Árbol binario http://es. Informática Gestión José Luis Pastrana Brincones @ 2004 http://www.htm - .T. Becerra Santamaría Árboles Binarios en C++ Laboratorio de Programación 1ºA E.es/so/cpp/intro_c/introc75.pdf Curso de C Por Nacho Cabanes.uma.I. versión 0.S.org/wiki/%C3%81rbol_binario Memoria dinámica: malloc y free http://sopa.nachocabanes.BIBLIOGRAFÍA ± INFOGRAFÍA - Estructuras de datos en C++ 4ª Edición Autor: César A.ulpgc.dis.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->