You are on page 1of 7

Inicio > Tecnologa e Internet > Programacin > C y C++

Arboles en C++
Respuesta de equargnolo a rosh18 24/10/2003

Usuario
Anuncios Google

Robot usados de ocasion


Robot industriales ABB Fanuc Motoman,Staubli garantizados www.eurobots.com.ar Hola hermano Mira tengo un proyecto de estructura de datos que no comprendo muy bien, mi proyecto consiste en insercion busqueda y eliminacion de arboles binarios pero tengo que programarlo en c++ ?????, pero la verdad estoy un poco confundido porque nunca habia programado arboles y la profesora no nos ha dejado mucha informacion del tema. Ojala puedas ayudarme o orientarme un poco de como hacerlo gracias y espero tu respuesta.

Experto
Hola, claro que te puedo ayudar. Los arboles binarios nacen de un nodo padre y puede tener 2 hijos, a su vez un nodo hijo se puede convertir en padre y puede tener dos hijos, la idea es que no pueden ser mas de 2 por eso lo de binario, un hijo no puede tener mas de un padre. Esto entonces son una lista con doble enlaze la diferencia con las listas doblemente enlazadas es que un puntero va a a la derecha y el otro a la izquierda (graficamente hablando ya que el computador no reconoce eso) no hay uno de vuelta. Ahora si el arbol binario es ordenado el hijo la izquiera y toda la descendencia que va a la izquierda tiene que ser menor que el padre y la descendencia de la derecha mayor. ej: 10 <- padre /\ 7 15 /\/\ 5 8 NULL 17

/\\ NULL NULL NULL ese es un ejemplo grafico simple de un arbol binario ordenado. Ahora ya empiezo con codigo c++. /*definicion del nodo (estructura del arbol binario)*/ struct nodo{ int info;/*numero de cada elemento del arbol*/ struct nodo *izq ; /*apunta al hijo inquierdo*/ struct nodo *der; /*apunta al nodo derecho*/ } typedef struct nodo *ptrnodo; ptrnodo l,a,b,p; /*crea variables del tipo nodo, l sera el que tenga el primer numero*/ /*ahora comienza el manejo del programa, copia esto en un texto si esta desordenado*/ int main() { int temporal; char op; l=NULL; do{ cout<<"ing numero: "; cin>>temporal; p=new nodo; p->info=temporal; p->der=NULL; p->izq=NULL; if (l==NULL) { l=p; } else { a=NULL; a=l; while(a!=NULL) { if(a->info>p->info) { if(a->izq!=NULL) a=a->izq; else

a->izq=p; } if(a->info<p->info) { if(a->der!=NULL) a=a->der; else a->der=p; } } } cout<<"desea ing otro n s/n: "; cin>>op; }while(op=='s'); /*Ya esta listo un ingreso de un arbol binario ordenado,ahora una busqueda*/ a=l; cout<<"ING N A BUSCAR: "; cin>>temporal; while(a!=NULL) { if(temporal<a->info) a=a->izq; else if(temporal>a->der) a=a->der; else break; } if(a!=NULL) cout<<"El numero fue encontrado";/*ESTA APUNTADO POR a*/ else cout<<"Numero no esta en el arbol"; /*ahora el eliminar te lo dejo a ti, aunque te dejo lo que es como una regla de eliminado. cuando necesita eliminar un nodo que no tiene hijos solo eliminas y enlazas el ultimo a NULL (para cerrar ese lado del arbol), si solo tiene un hijo solo enlazas el padre del a eliminar si es que tiene con el hijo del a eliminar y luego simplemente borras, para eliminar un arbol con mas de 1 hijo es mas complicado, en ese caso tienes que buscar el sucesor mas cercano del a eliminar. Bueno espero que te sirva de ayuda, y si tienes una duda me preguntas. saludos Enrique Quargnolo*/ return 0; }

Aplicaciones de rboles binarios

Un rbol binario es una estructura de datos til cuando se trata de hacer modelos de procesos en donde se requiere tomar decisiones en uno de dos sentidos en cada parte del proceso. Por ejemplo, supongamos que tenemos un arreglo en donde queremos encontrar todos los duplicados. Esta situacin es bastante til en el manejo de las bases de datos, para evitar un problema que se llama redundancia. Una manera de encontrar los elementos duplicados en un arreglo es recorrer todo el arreglo y comparar con cada uno de los elementos del arreglo. Esto implica que si el arreglo tiene elementos, se deben hacer comparaciones, claro, no es mucho problema si es un nmero pequeo, pero el problema se va complicando ms a medida que aumenta. Si usamos un rbol binario, el nmero de comparaciones se reduce bastante, veamos cmo. El primer nmero del arreglo se coloca en la raz del rbol (como en este ejemplo siempre vamos a trabajar con rboles binarios, simplemente diremos rbol, para referirnos a un rbol binario) con sus subrboles izquierdo y derecho vacos. Luego, cada elemento del arreglo se compara son la informacin del nodo raz y se crean los nuevos hijos con el siguiente criterio:

Si el elemento del arreglo es igual que la informacin del nodo raz, entonces notificar duplicidad. Si el elemento del arreglo es menor que la informacin del nodo raz, entonces se crea un hijo izquierdo. Si el elemento del arreglo es mayor que la informacin del nodo raz, entonces se crea un hijo derecho.

Una vez que ya est creado el rbol, se pueden buscar los elementos repetidos. Si x el elemento buscado, se debe recorrer el rbol del siguiente modo: Sea k la informacin del nodo actual p. Si entonces cambiar el nodo actual a right(p), en caso contrario, en caso de que informar una ocurrencia duplicada y en caso de que El siguiente algoritmo
leer numero buscado >> n

cambiar el nodo actual a left(p).

tree=makeTree(n) while(hay numeros en el arreglo){ leeSiguienteNumero >> k p=q=tree; while(k!=info(p)&&q!=NULL){ p=q if(k<info(p)) q=left(p) else q=right(p) } if(k==info(p)) despliega<<" el numero es duplicado"; else if (k<info(p)) setLeft(p,k) else setRight(p,k) }

Figura 28: rbol binario para encontrar nmeros duplicados

Para saber el contenido de todos los nodos en un rbol es necesario recorrer el rbol. Esto es debido a que solo tenemos conocimiento del contenido de la direccin de un nodo a la vez. Al recorrer el rbol es necesario tener la direccin de cada nodo, no necesariamente todos al mismo tiempo, de hecho normalmente se tiene la direccin de uno o dos nodos a la vez; de manera que cuando se tiene la direccin de un nodo, se dice que sevisita ese nodo. Aunque hay un orden preestablecido (la enumeracin de los nodos) no siempre es bueno recorrer el rbol en ese orden, porque el manejo de los apuntadores se vuelve ms complejo. En su lugar se han adoptado tres criterios principales para recorrer un rbol binario, sin que de omita cualquier otro criterio diferente. Los tres criterios principales para recorrer un rbol binario y visitar todos sus nodos son, recorrer el rbol en:

preorden: Se ejecutan las operaciones: 1. Visitar la raz 2. recorrer el subrbol izquierdo en preorden 3. recorrer el subrbol derecho en preorden entreorden: Se ejecutan las operaciones: 1. recorrer el subrbol izquierdo en entreorden 2. Visitar la raz 3. recorrer el subrbol derecho en entreorden postorden: Se ejecutan las operaciones: 1. recorrer el subrbol izquierdo en postorden 2. recorrer el subrbol derecho en postorden 3. Visitar la raz Al considerar el rbol binario que se muestra en la figura 28 usando cada uno de los tres criterios para recorrer el rbol se tienen las siguientes secuencias de nodos: En preorden: En entreorden: En postorden: Esto nos lleva a pensar en otra aplicacin, el ordenamiento de los elementos de un arreglo. Para ordenar los elementos de un arreglo en sentido ascendente, se debe construir un rbol similar al rbol binario de bsqueda, pero sin omitir las coincidencias.

El arreglo usado para crear el rbol binario de bsqueda fue


<14,15,4,9,7,18,3,5,16,4,20,17,9,14,5>

El rbol de ordenamiento es el que se muestra en la figura 29

Figura 29: rbol binario para ordenar una secuencia de nmeros

Para ordenar los elementos de este arreglo basta recorrer el rbol en forma de entreorden. Cul sera el algoritmo para ordenarlo de manera descendente?

You might also like