elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  arbol binario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: arbol binario  (Leído 4,400 veces)
karmi

Desconectado Desconectado

Mensajes: 21



Ver Perfil
arbol binario
« en: 9 Diciembre 2010, 01:57 am »

como eliminar un elemento de mi arbol......
Código
  1. #include <iostream.h>
  2. #include <windows.h>
  3. #include <conio.h>
  4.  
  5. struct Nodo
  6. {
  7. Nodo *izq;
  8. int dato;
  9. Nodo *der;
  10. };
  11.  
  12. class arbolbinario
  13. {
  14. private:
  15. Nodo *raiz;
  16. public:
  17. arbolbinario()
  18. {
  19. raiz=NULL;
  20. }
  21. void insertar(int d)
  22. {
  23. Nodo *nuevo;
  24. nuevo = new Nodo();
  25. nuevo->izq= NULL;
  26. nuevo->dato=d;
  27. nuevo->der=NULL;
  28.  
  29. if (raiz==NULL)
  30. {
  31. raiz=nuevo;
  32. }
  33. else
  34. {
  35. Nodo *temp, *a;
  36. int b=0;
  37. temp = raiz;
  38. a = NULL;
  39. while(temp!=NULL)
  40. {
  41. a = temp;
  42. if(nuevo->dato<temp->dato)
  43. {
  44. temp = temp->izq;
  45. b=1;
  46. }
  47. else if (nuevo->dato>temp->dato)
  48. {
  49. temp = temp->der;
  50. b=2;
  51. }
  52. }
  53. if (b==1)
  54. {
  55. a->izq=nuevo;
  56. }
  57. else if (b==2)
  58. {
  59. a->der=nuevo;
  60. }
  61. }
  62.  
  63. }
  64.  
  65. void MostrarIn()
  66. {
  67. Nodo *temp;
  68. temp = raiz;
  69. MostrarInorden (temp);
  70. }
  71. void MostrarInorden(Nodo *T)
  72. {
  73. if (T!=NULL)
  74. {
  75. MostrarInorden(T->izq);
  76. cout << T->dato << endl;
  77. MostrarInorden(T->der);
  78. }
  79. }
  80. void MostrarPr()
  81. {
  82. Nodo *temp;
  83. temp = raiz;
  84. MostrarPreorden (temp);
  85. }
  86. void MostrarPreorden(Nodo *T)
  87. {
  88. if (T!=NULL)
  89. {
  90. cout << T->dato << endl;
  91. MostrarPreorden(T->izq);
  92. MostrarPreorden(T->der);
  93. }
  94. }
  95.  
  96.  
  97.  
  98.    void eliminar();
  99.     ****************
  100. };
  101.  
  102. void main (void)
  103. {
  104. arbolbinario numeros;
  105. int op, n;
  106. do
  107. {
  108. system("cls");
  109. cout << "A R B O L   B I N A R I O" << endl<<endl;
  110. cout << "1.- Insertar nodo"<< endl;
  111. cout << "2.- Mostrar inorden"<< endl;
  112. cout << "3.- Mostrar preorden"<< endl;
  113. cout << "4.- Mostrar postorden"<< endl;
  114. cout << "5.- Salir"<< endl << endl;
  115.  
  116. cout << "Elige una opcion-> ";
  117. cin >> op;
  118.  
  119. system("cls");
  120. switch(op)
  121. {
  122. case 1:
  123. cout << "Introduce el numero: ";
  124. cin >> n;
  125. numeros.insertar(n);
  126. break;
  127. case 2:
  128. cout << "Inorden"<<endl;
  129. numeros.MostrarIn();
  130. break;
  131. case 3:
  132. cout << "Preorden"<<endl;
  133. numeros.MostrarPr();
  134. break;
  135. case 4:
  136. cout << "Postorden"<<endl;
  137.  
  138. break;
  139. default:
  140.  
  141. cout << "Bye!!!"<<endl;
  142. }
  143. getch();
  144. }while(op>=1 && op<=4);
  145.  
  146. }
  147.  


« Última modificación: 9 Diciembre 2010, 02:03 am por karmi » En línea

darkraider

Desconectado Desconectado

Mensajes: 231



Ver Perfil
Re: arbol binario
« Respuesta #1 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...

Código
  1. #include <iostream.h>
  2.  
  3. class arbolBin
  4. {
  5. private:
  6. arbolBin *iz, *dr;
  7. int elem;
  8. public:
  9. arbolBin()
  10. {
  11. iz = NULL;
  12. dr = NULL;
  13. }
  14.  
  15. arbolBin(int e)
  16. {
  17. arbolBin();
  18. this.elem = e;
  19. }
  20.  
  21. bool insertar(int e)
  22. {
  23. if(e < elem) // sin repeticion
  24. {
  25. if(iz != NULL) iz->insertar(e);
  26. else iz = new arbolBin(e);
  27. }
  28. else if(e > elem)
  29. {
  30. if(dr != NULL) dr->insertar(e);
  31. else dr = new arbolBin(e);
  32. }
  33. else return false;
  34. return true;
  35. }
  36.  
  37. // yo devolvería una lista en vez de usar streams...
  38. void inorden()
  39. {
  40. // inorden...
  41. if(iz != NULL) iz->inorden();
  42. cout << this.elem << " ";
  43. if(dr != NULL) dr->inorden();
  44. }
  45. void preorden()
  46. {
  47. // preorden...
  48. cout << this.elem << " ";
  49. if(iz != NULL) iz->preorden();
  50. if(dr != NULL) dr->preorden();
  51.  
  52. }
  53. void postorden()
  54. {
  55. // postorden...
  56. if(iz != NULL) iz->postorden();
  57. if(dr != NULL) dr->postorden();
  58. cout << this.elem << " ";
  59. }
  60. }
  61.  

Salu2


En línea

Curioso de mi...
ANTÓN RAMIREZ

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: arbol binario
« Respuesta #2 en: 14 Diciembre 2010, 22:08 pm »

Algunas operaciones que se les puede implementar aun arbol binario.




Código:
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]
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines