ARBOL_FINAL.
CPP // Nombre:ARBOL BINARIO // Descripcin:Permite ingresar una serie de numeros, los cuales se ordenarn en el arbol segun si son mayores o menores. // si son mayores que la raiz se insertarn a la derecha y si son menores a la izquierda. // Autor: Fabian Andrs Yepes Gutirrez // Fecha: Mayo 20 de 2011 - Versin: 1 // Historico: Es la nica versin.
#include #include #include #include
<stdio.h> <conio.h> <stdlib.h> <iostream.h>
struct Arbol { int Numero; struct Arbol *izquierda; struct Arbol *derecha; } *Raiz_Arbol=NULL,*Nuevo=NULL,*aux,*aux1,*aux2,*padre,*padre1; void Agregar_Numero(); void Insertizq(struct Arbol *aux, struct Arbol*nuevo); void Insertder(struct Arbol *aux, struct Arbol*nuevo); void Preorden(struct Arbol *Nuevo ); void Inorden(struct Arbol *Nuevo ); void posorden(struct Arbol *Nuevo ); void Borrar_Nodo(struct Arbol *aux, struct Arbol *padre); struct Arbol *Buscar_Nodo(struct Arbol * ,int Nodo_Borrar ); int Nodo_Borrar;
void main() { textcolor(10); int opcion; do { clrscr(); cout<<"\n\n\n"; cout<<" MENU PRINCIPAL "; cout<<"\n\n\n"; cout<<" 1. INSERTAR NUMERO\n"; cout<<" 2. MOSTRAR LOS NUMEROS EN PREORDEN\n"; cout<<" 3. MOSTRAR LOS NUMEROS EN INORDEN\n"; cout<<" 4. MOSTRAR LOS NUMEROS EN EN POSTORDEN\n"; cout<<" 5. ELIMINAR NUMERO\n"; cout<<" 6. SALIR DEL PROGRAMA\n\n"; cout<<" DIGITE LA OPCION QUE DESEE REALIZAR:"; cin >>opcion; switch (opcion) { case 1: Agregar_Numero(); break; case 2: Preorden(Raiz_Arbol); break; Pgina 1
ARBOL_FINAL.CPP case 3: Inorden(Raiz_Arbol); break; case 4: posorden(Raiz_Arbol); break; case 5: clrscr(); cout<<" NODO\n\n\n"; cout<<" ELIMINAR:"; cin>>Nodo_Borrar; Buscar_Nodo(Raiz_Arbol,Nodo_Borrar); Borrar_Nodo(aux1,padre1); break; case 6: exit(1); } getch(); }while (opcion!=6); } void Agregar_Numero() { clrscr(); Nuevo=(struct Arbol *)malloc(sizeof(struct Arbol)); cout <<"\n\n\n\n\t\t\tDIGITE NUMERO QUE DESEA INGRESAR:"; cin>>Nuevo->Numero; Nuevo -> izquierda = NULL; Nuevo -> derecha = NULL; if (Raiz_Arbol==NULL) { Raiz_Arbol=Nuevo; } else { if (Nuevo->Numero > Raiz_Arbol->Numero) Insertder (Raiz_Arbol, Nuevo); else Insertizq (Raiz_Arbol, Nuevo); } } void Insertder (struct Arbol *aux, struct Arbol*Nuevo) { if (aux->derecha==NULL) { aux->derecha = Nuevo; } else { aux=aux->derecha; if (Nuevo->Numero>aux->Numero) Insertder (aux,Nuevo); else Insertizq(aux,Nuevo); } Pgina 2 INGRESE NUMERO QUE DESEA
BORRADO DE
ARBOL_FINAL.CPP } void Insertizq (struct Arbol *aux, struct Arbol *Nuevo) { if (aux->izquierda==NULL) { aux->izquierda=Nuevo; } else { aux = aux-> izquierda; if (Nuevo->Numero > aux->Numero) Insertder (aux, Nuevo); else Insertizq (aux, Nuevo); } } void Preorden(struct Arbol *Nuevo) { if(!Nuevo) return; cout << "**"; cout << Nuevo->Numero ; Preorden( Nuevo->izquierda ); Preorden( Nuevo->derecha ); } void Inorden(struct Arbol *Nuevo) { if(!Nuevo) return; Inorden( Nuevo->izquierda ); cout << "**"; cout <<Nuevo->Numero ; Inorden( Nuevo->derecha ); } void posorden(struct Arbol *Nuevo) { if( !Nuevo ) return; posorden( Nuevo->izquierda ); posorden( Nuevo->derecha ); cout <<"**"; cout<<Nuevo->Numero ; }
struct Arbol *Buscar_Nodo(struct Arbol * aux,int Nodo_Borrar) { if (aux->Numero==Nodo_Borrar) { aux1 =aux; padre1=padre; } else { if ((Nodo_Borrar<aux->Numero)&&(aux->izquierda)) { padre=aux; Buscar_Nodo (aux->izquierda,Nodo_Borrar); } else if ((Nodo_Borrar>aux->Numero)&&(aux->derecha)) { Pgina 3
ARBOL_FINAL.CPP padre=aux; Buscar_Nodo (aux-> derecha,Nodo_Borrar); } else { EXISTE********"; getch(); } } return NULL; } void Borrar_Nodo(struct Arbol *aux1, struct Arbol*padre1) { while(aux1) { if ((aux1->izquierda==NULL)&&(aux1->derecha==NULL)) // si es hoja { if (padre1->izquierda==aux1) padre1->izquierda=NULL; else if (padre1->derecha==aux1) padre1->derecha=NULL; free(aux1); aux1=NULL; return; } else { padre1 = aux1; derecha */ if(aux1->derecha) { aux2= aux1->derecha; while(aux2->izquierda) { padre1 = aux2; aux2 = aux2->izquierda; } } /* buscar nodo mas derecho de rama izquierda */ else { aux2 = aux1->izquierda; while(aux2->derecha) { padre = aux2; aux2 = aux2->derecha; } } Nodo_Borrar=aux1->Numero; aux1-> Numero = aux2 ->Numero; aux2->Numero = Nodo_Borrar; aux1=aux2; } } } /* Buscar nodo mas izquierdo de rama cout<<"\n\n\n\n"; cout<<"
********EL NUMERO NO
Pgina 4