Título: arbol binario
Publicado por: karmi en 9 Diciembre 2010, 01:57 am
como eliminar un elemento de mi arbol...... #include <iostream.h> #include <windows.h> #include <conio.h> struct Nodo { Nodo *izq; int dato; Nodo *der; }; class arbolbinario { private: Nodo *raiz; public: arbolbinario() { raiz=NULL; } void insertar(int d) { Nodo *nuevo; nuevo = new Nodo(); nuevo->izq= NULL; nuevo->dato=d; nuevo->der=NULL; if (raiz==NULL) { raiz=nuevo; } else { Nodo *temp, *a; int b=0; temp = raiz; a = NULL; while(temp!=NULL) { a = temp; if(nuevo->dato<temp->dato) { temp = temp->izq; b=1; } else if (nuevo->dato>temp->dato) { temp = temp->der; b=2; } } if (b==1) { a->izq=nuevo; } else if (b==2) { a->der=nuevo; } } } void MostrarIn() { Nodo *temp; temp = raiz; MostrarInorden (temp); } void MostrarInorden(Nodo *T) { if (T!=NULL) { MostrarInorden(T->izq); cout << T->dato << endl; MostrarInorden(T->der); } } void MostrarPr() { Nodo *temp; temp = raiz; MostrarPreorden (temp); } void MostrarPreorden(Nodo *T) { if (T!=NULL) { cout << T->dato << endl; MostrarPreorden(T->izq); MostrarPreorden(T->der); } } void eliminar(); **************** }; void main (void) { arbolbinario numeros; int op, n; do { cout << "A R B O L B I N A R I O" << endl<<endl; cout << "1.- Insertar nodo"<< endl; cout << "2.- Mostrar inorden"<< endl; cout << "3.- Mostrar preorden"<< endl; cout << "4.- Mostrar postorden"<< endl; cout << "5.- Salir"<< endl << endl; cout << "Elige una opcion-> "; cin >> op; switch(op) { case 1: cout << "Introduce el numero: "; cin >> n; numeros.insertar(n); break; case 2: cout << "Inorden"<<endl; numeros.MostrarIn(); break; case 3: cout << "Preorden"<<endl; numeros.MostrarPr(); break; case 4: cout << "Postorden"<<endl; break; default: cout << "Bye!!!"<<endl; } }while(op>=1 && op<=4); }
Título: Re: arbol binario
Publicado por: darkraider en 9 Diciembre 2010, 11:38 am
No es por nada, pero yo usaría recursión porque aporta claridad al código. Y es mucho más compacto. Ya se: es más facil de depurar iterativo... pero bue... #include <iostream.h> class arbolBin { private: arbolBin *iz, *dr; int elem; public: arbolBin() { iz = NULL; dr = NULL; } arbolBin(int e) { arbolBin(); this.elem = e; } bool insertar(int e) { if(e < elem) // sin repeticion { if(iz != NULL) iz->insertar(e); else iz = new arbolBin(e); } else if(e > elem) { if(dr != NULL) dr->insertar(e); else dr = new arbolBin(e); } else return false; return true; } // yo devolvería una lista en vez de usar streams... void inorden() { // inorden... if(iz != NULL) iz->inorden(); cout << this.elem << " "; if(dr != NULL) dr->inorden(); } void preorden() { // preorden... cout << this.elem << " "; if(iz != NULL) iz->preorden(); if(dr != NULL) dr->preorden(); } void postorden() { // postorden... if(iz != NULL) iz->postorden(); if(dr != NULL) dr->postorden(); cout << this.elem << " "; } }
Salu2
Título: Re: arbol binario
Publicado por: ANTÓN RAMIREZ en 14 Diciembre 2010, 22:08 pm
Algunas operaciones que se les puede implementar aun arbol binario. using namespace std;
struct NODO{ int dato; struct NODO *izq; struct NODO *der; };
void crearArbol(NODO **cabeza); void insertar(NODO **cabeza, int elemento); void inorder(NODO *cabeza), preorder(NODO *cabeza); void postorder(NODO *cabeza); NODO *eliminar(NODO *cabeza, int elemento);
int main() { char opcion; int elemento; NODO *borrado, *raiz; clrscr(); crearArbol(&raiz); //raiz=NULL; for(;;){ system("cls"); printf("\tARBOLES BINARIOS DE BUSQUEDA\n\n"); printf("(0) SALIR\n(1) Insertar\n(2) Eliminar\n(3) Inorder\n(4) Preorder\n(5) Postorder\n"); printf("\n\tDigite su opcion ---> "); switch(opcion=getche()){ case '0': exit(0); case '1': system("cls"); printf("\nIngrese elemento a insertar: "); scanf("%d", &elemento); insertar(&raiz, elemento); break; case '2': if(raiz==NULL){ printf("\nNo hay nodos en al arbol\n\n"); break; } else{ printf("\nIngrese dato a eliminar: "); scanf("%d", & elemento); borrado=eliminar( raiz, elemento); if(borrado==NULL) printf("\nDato no encontrado\n\n"); break; } case '3': system("cls"); printf("\nEl arbol es: "); inorder(raiz); system("pause"); break; case '4': system("cls"); printf("\nEl arbol es: "); preorder(raiz); break; case '5': system("cls"); printf("\nEl arbol es: "); postorder(raiz); break; } printf("\n\n"); }
system("pause"); return(0); } void crearArbol(NODO **cabeza) { *cabeza=NULL; } void insertar(NODO **cabeza, int elemento) {
if(*cabeza==NULL){ *cabeza= (NODO *) malloc(sizeof(NODO)); if(*cabeza==NULL){ printf("No hay memoria\n"); return; } (*cabeza)->dato=elemento; (*cabeza)->izq=NULL; (*cabeza)->der=NULL; } else if(elemento< (*cabeza)->dato) insertar(& (*cabeza)->izq, elemento); else if(elemento> (*cabeza)->dato) insertar(& (*cabeza)->der, elemento); else printf("\nNo puede insertar: valor duplicado\n\n");
}
NODO *eliminar(NODO *cabeza, int elemento) { NODO *p, *p2; if(elemento==cabeza->dato){ if(cabeza->izq==cabeza->der){ free(cabeza); return(NULL); } else if(cabeza->izq==NULL){ p=cabeza->der; free(cabeza); return(p); } else if(cabeza->der==NULL){ p=cabeza->izq; free(cabeza); return(p); } else{ p2=cabeza->der; p=cabeza->der; while(p->izq) p=p->izq; p->izq=cabeza->izq; free(cabeza); return(p2); } } if(cabeza->dato<elemento) cabeza->der=eliminar(cabeza->der, elemento); else cabeza->izq=eliminar(cabeza->izq, elemento); return(cabeza); }
void inorder(NODO *cabeza) { if(cabeza!=NULL){ inorder(cabeza->izq); printf("%d ",cabeza->dato); inorder(cabeza->der); } }
void preorder(NODO *cabeza) { if(cabeza!=NULL){ printf("%d ", cabeza->dato); preorder(cabeza->izq); preorder(cabeza->der); } }
void postorder(NODO *cabeza) { if(cabeza!=NULL){ postorder(cabeza->izq); postorder(cabeza->der); printf("%d ",cabeza->dato); } } void salvar(NODO **cabeza, int elemento) { NODO *p, *p2; if(elemento==cabeza->dato){ if(cabeza->izq==cabeza->der){ free(cabeza); return(NULL); } if (elemento > 0){ if () moverDrcha(actual, k); else combina(actual, k);
else /* Sólo tiene "hermano" derecho */ if (actual->ramas[1]->cuenta > m/2) moverIzqda(actual, 1); else combina(actual, 1); } [/color]
|