Ayuda Urgente Arbol [contiene codigo]

Iniciado por sTaborracho, 1 Diciembre 2011, 22:12 PM

0 Miembros y 1 Visitante están viendo este tema.

sTaborracho

Buenas.. De antemano agradezco a los que se tomen la molestia de checar este mensaje, el codigo y sobretodo la molestia que se tomen en compartir su conocimiento...

MUCHAS GRACIAS AL QUE PUEDA AYUDARME (creanme entre tanto codigo y el hecho de que soy novato, ya hasta me perdi un poco)

El programa es de arbol... debe contener las opciones:
Insertar
Eliminar
Preorden
Inorden
Postorden
Salir

Basado en lo que he leido en algunos libros y en internet, he podido realizar lo sig:
Citar
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include <iostream>

typedef struct nodo{
   int dato;
   struct nodo *izq;
   struct nodo *der;
   } NODOARBOL;

void insertar();
void eliminar();
void preorden();
void inorden();
void postorden();
void salir();

int main()
{
    int elemento, valor, opcion;
     NODOARBOL *raiz=NULL;
     system("cls");
    int menu; //declaramos la variable "menu"
   
         //mostramos en pantalla todas las opciones disponibles
         std::cout << "Menu C para programas C/C++" << std::endl;
         std::cout << "2008 Inc1ud3zn" << std::endl;
         
         //incluimos una tabulación para hacer el menú a dos linias (t)
         std::cout << "Introduzca su seleccion" << std::endl;
         std::cout << "1. Insertar"  << std::endl;
         std::cout << "2. Eliminar"  << std::endl;
         std::cout << "3. Preorden"  << std::endl;
         std::cout << "4. Inorden"  << std::endl;
         std::cout << "5. Postorden"  << std::endl;
         std::cout << "6. Salir"  << std::endl;
         
         std::cin >> menu; //hacemos que el programa lea del teclado la variable "menu"
         
          switch (menu)
  {
case 1:
    system("cls");
    printf("\nIngrese elemento a insertar [0 : 99]: ");
    scanf("%d", &elemento);
    if(elemento<0 || elemento>99){
          printf("\nDato desbordado");
          getch();
    break;
       }
       insertar(&raiz, elemento);
       break;
case 2:
    system("cls");
       printf("\nIngrese elemento a eliminar [0 : 99]: ");
       scanf("%d", &elemento);
       if(elemento<0 || elemento>99)
       {
          printf("\nDato desbordado");
          getch();
       break;
       }
       valor = 0;
       buscar(raiz, elemento, &valor);
       if(valor==1){
          raiz=eliminar( raiz, elemento);
          printf("\nNodo eliminado\n");
          getch();
       }
       break;
case 3:
system("cls");
        printf("El  arbol inorder es: "); inorden(raiz);
        getch();
        break;
case 4:
system("cls");
        printf("El  arbol preorder es: "); preorden(raiz);
        getch();
        break;
case 5:
system("cls");
        printf("El  arbol postorder es: "); postorden(raiz);
        getch();
        break;
case 6: //para salir
      break; //rompemos el control del programa y lo enviamos al final del switch ( } ) ahí acabará la ejecución después del return 0;
default://en caso de otro número, limpiamos la pantalla y enviamos el programa al inicio.
    system("cls");
    goto top;
    break;
   }
   
return 0;   
}

//funciones secundarias
void insertar(NODOARBOL **cabeza, int elemento){

     if(*cabeza==NULL){
   *cabeza= (NODOARBOL *) malloc(sizeof(NODOARBOL));

   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");
      getch(); }
}

void inorden(NODOARBOL *cabeza){
     if(cabeza!=NULL){
   inorden(cabeza->izq);
   printf("%d ",cabeza->dato);
   inorden(cabeza->der);
     }
}


void preorden(NODOARBOL *cabeza){
     if(cabeza!=NULL){
   printf("%d ", cabeza->dato);
   preorden(cabeza->izq);
   preorden(cabeza->der);
     }
}


void postorden(NODOARBOL *cabeza){
     if(cabeza!=NULL){
   postorden(cabeza->izq);
   postorden(cabeza->der);
   printf("%d ",cabeza->dato);
     }
}


void buscar(NODOARBOL *cabeza, int elemento, int *valor){
    if(cabeza!=NULL){
       if((cabeza)->dato==elemento) *valor=1;

       else{
       if(elemento<(cabeza)->dato) buscar((cabeza)->izq, elemento, valor);

       else buscar((cabeza)->der, elemento, valor);
       }
    }
    else{ printf("\nDato no encontrado\n");
     getch(); }
}

NODOARBOL *eliminar(NODOARBOL *cabeza, int elemento){
        NODOARBOL *p1, *p2;

        if(elemento==cabeza->dato){
      if(cabeza->izq==cabeza->der){
         free(cabeza);
         return(NULL);
      }

      else if(cabeza->izq==NULL){
         p1=cabeza->der;
         free(cabeza);
         return(p1);
      }

      else if(cabeza->der==NULL){
         p1=cabeza->izq;
         free(cabeza);
         return(p1);
          }

          else{
         p2=cabeza->der;
         p1=cabeza->der;
         while(p1->izq) p1=p1->izq;
         p1->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);
}

Dentro de mi poca experiencia puede que haya librerias innecesarias... fue la desesperacion de no encontrarle como solucionarlo... Por favor ayudenme!!

**Si tambien tienen otra forma de hacerlo agradeceria si pudieran compartirlo**
                                 ###### GRACIAS ######