Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бинарноe деревo 
:(
    Опции темы
skyangel27
Дата 8.11.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.11.2006

Репутация: нет
Всего: нет



имею следущую програму по бинарному дереву все в порядке но мне не хвотает функции котороя б удаляла за один рас полостю все дерево а не по одному листку знаю ето очень легко(дерево==нулл) но чето не виходить ,виставляю код может ктото посмотрет и поможет -заранее спасибоsmile
 


#define TAMVECTOR 100
#include <stdio.h>
#include <conio.h>
#include <IOSTREAM.H>

//Se define la estructura de arbol
typedef struct Arbol{
 int Dato;
 Arbol *Izq;
 Arbol *Der;
} Arbol;



/*
Arbol *borrarA(struct Arbol *Arbol1){
  Arbol1==NULL;
//delete arb;
//delete Raiz;
}*/


  /*if(Raiz->Dato==clave){
    if(Raiz->Izq==Raiz->Der){
     delete Raiz;
     return NULL;
    }*/





/*******************************************/
// DEFINICION DE UNA ESTRUCTURA DE PILA para el PREORDEN
typedef struct{
 Arbol* vector[TAMVECTOR];
 int nelem;
} tPila;

void crearPila(tPila *pila){
    pila->nelem = 0;
}

void push(tPila *pila,Arbol *put){
    pila->vector[pila->nelem] = put;
    pila->nelem++;
}

Arbol* pop(tPila *pila){
    pila->nelem--;
    return pila->vector[pila->nelem];

}

int pilavacia(tPila *pila){
    if (pila->nelem == 0) return 1;
    else return 0;
}
/*********************************************/
/*******************************************/
// DEFINICION DE UNA ESTRUCTURA DE COLA para INORDEN, POSTORDEN Y NIVELES
typedef struct{
 Arbol* vector[TAMVECTOR];
 int ind_izq;
 int ind_der;
} tCola;

void crearCola(tCola *cola){
    cola->ind_izq = 0;
    cola->ind_der = -1;
}

void encolar(tCola *cola,Arbol *put){
    cola->ind_der++;
    cola->vector[cola->ind_der] = put;
}

Arbol* desencolar(tCola *cola){
    cola->ind_izq++;
    return cola->vector[cola->ind_izq-1];
}

int colavacia(tCola *cola){
    if (cola->ind_der < cola->ind_izq) return 1;
    else return 0;
}
/*********************************/

void Menu(void)
{
 printf("\nEscoja su opcion:\n");
 printf("1. Insertar.\n");
 printf("2. Eliminar.\n");
 printf("3. Buscar.\n");
 printf("4. Inorden.\n");
 printf("5. PostOrden.\n");
 printf("6. Preorden.\n");
 printf("7. niveles.\n");


  printf("9. borrar.\n");

 printf("8. Salir.\n");
 printf("-> ");
}


void PreOrden(struct Arbol *a){
  tPila pila;
  Arbol *aux;

  if (a != NULL) {
     crearPila(&pila);
     push(&pila, a);
     while (pilavacia(&pila) == 0) {
        aux = pop(&pila);
        printf("%d\n",aux->Dato);
        if (aux->Der != NULL) push(&pila, aux->Der);
        if (aux->Izq!= NULL) push(&pila, aux->Izq);
     }
    }
}

void PostOrden(struct Arbol *a){

// Esta implementacion es valido cuando los valores del arbol son todos positivos!
    tPila pila;
    Arbol *temp;

    if (a == NULL)return;

    temp = a;
    crearPila(&pila);
    push(&pila,NULL);

    int salir = 0;

    while (salir == 0){
        while (temp != NULL){
            push(&pila, temp);
            if (temp->Der != NULL){
                temp->Der->Dato = -temp->Der->Dato;
                push(&pila, temp->Der);
            }
            temp = temp->Izq;
        }
        temp = pop(&pila);
        while (temp->Dato >= 0){
            printf("%d\n",temp->Dato);
            if (temp->Dato == a->Dato) return;
            temp = pop(&pila);
        }
        if (temp->Dato < 0)    temp->Dato = -temp->Dato;
        else salir = 1;
    }
}




void InOrden(struct Arbol *a){

// Esta implementacion es valido cuando los valores del arbol son todos positivos!
    tPila pila;
    Arbol *temp;

    if (a == NULL)return;

    temp = a;
    crearPila(&pila);
    push(&pila,NULL);

    int salir = 0;

    while (salir == 0){
        while (temp != NULL){
            push(&pila, temp);
            temp = temp->Izq;
        }
        temp = pop(&pila);
        int sal = 0;
        while ((temp != NULL) && (sal == 0)){
            printf("%d\n",temp->Dato);
            if (temp->Der != NULL){
                temp = temp->Der;
                sal = 1;
            } else
                temp = pop(&pila);
        }
        if (sal == 0) salir = 1;
    }


}


void Niveles(struct Arbol * a){
  tCola cola;
  Arbol *aux;

  if (a != NULL) {
     crearCola(&cola);
     encolar(&cola, a);
     while (colavacia(&cola) == 0) {
        aux = desencolar(&cola);
        printf("%d\n",aux->Dato);
        if (aux->Izq != NULL) encolar(&cola, aux->Izq );
        if (aux->Der!= NULL) encolar(&cola, aux->Der);
     }
  }

}


void InsertarNodo(struct Arbol **Raiz,int valor)
{
 if(*Raiz == NULL){

    *Raiz = new(Arbol);
    if(*Raiz!=NULL){
    (*Raiz)->Dato=valor;
    (*Raiz)->Izq=NULL;
    (*Raiz)->Der=NULL;
    }
    else{
        printf("%c no insertado.\n",valor);
    }
 }
 else if(valor<(*Raiz)->Dato)
  InsertarNodo(&((*Raiz)->Izq),valor);
 else if(valor>(*Raiz)->Dato)
  InsertarNodo(&((*Raiz)->Der),valor);
 else printf("Dato duplicado.\n");
}


Arbol *Buscar(struct Arbol *Raiz,int clave){
 if(!Raiz) return Raiz;
 while(Raiz->Dato!=clave){
  if(clave<Raiz->Dato) Raiz=Raiz->Izq;
  else Raiz=Raiz->Der;
  if(Raiz==NULL) break;
 }
 return Raiz;
}

Arbol *Borrar(struct Arbol *Raiz,int clave){
  struct Arbol *p,*p2;
  if(!Raiz){
    printf("%d elemento no encontrado.\n",clave);
    return Raiz;
  }
  if(Raiz->Dato==clave){
    if(Raiz->Izq==Raiz->Der){
     delete Raiz;
     return NULL;
    }
    else if(Raiz->Izq==NULL){
     p=Raiz->Der;
     delete Raiz;
     return p;
    }
    else if(Raiz->Der==NULL){
     p=Raiz->Izq;
     delete Raiz;
     return p;
    }
    else{
     p2=Raiz->Der;
     p=Raiz->Der;
     while(p->Izq) p=p->Izq;
     p->Izq=Raiz->Izq;
    delete Raiz;
     return p2;
    }
  }
  if(Raiz->Dato < clave)
    Raiz->Der=Borrar(Raiz->Der,clave);
  else
    Raiz->Izq=Borrar(Raiz->Izq,clave);

  return Raiz;
}
 //////////////////////////////



int main(void){
 int dato;
 int opcion;
 struct Arbol *Raiz=NULL;
 struct Arbol *aux ;

/*
EL ARBOL ES EL SIGUIENTE, HA DE SER BINARIO
                5
        2                9
    1        3        8        11


*/


 Raiz = new (Arbol);
 Raiz->Dato = 5;
 Raiz->Izq = new (Arbol);
 Raiz->Izq = new (Arbol);

 aux = Raiz->Izq;
 aux->Dato = 2;
 aux->Izq = new (Arbol);
 aux->Izq->Dato = 1;
 aux->Izq->Izq = NULL;
 aux->Izq->Der = NULL;
 aux->Der = new (Arbol);
 aux->Der->Dato = 3;
 aux->Der->Izq = NULL;
 aux->Der->Der = NULL;

 Raiz->Der = new (Arbol);
 aux = Raiz->Der;
 aux->Dato = 9;
 aux->Izq = new (Arbol);
 aux->Izq->Dato = 8;
 aux->Izq->Izq = NULL;
 aux->Izq->Der = NULL;
 aux->Der = new (Arbol);
 aux->Der->Dato = 11;
 aux->Der->Izq = NULL;
 aux->Der->Der = NULL;


 Menu();
 cin >> opcion;
 //scanf("%d",&opcion);
 while(opcion!=8){
  switch(opcion){
    case 1: printf("Introduce un numero: ");
                    cin >> dato;
                    InsertarNodo(&Raiz,dato);
                    break;
    case 2:   printf("Introduce el numero a eliminar: ");
                    cin >> dato;
                    Raiz = Borrar(Raiz,dato);

                    break;
    case 3:   printf("Introduzca el numero a buscar: ");
                    cin >> dato;
                    if(Buscar(Raiz,dato)) printf("Elemento encontrado.\n");
                    else printf("El elemento no se encontro en el arbol.\n");
                    break;
    case 4:  printf("En Inorden es:\n");
                    InOrden(Raiz);
                    break;
    case 5:printf("En Postorden es:\n");
                    PostOrden(Raiz);
                    break;
    case 6: printf("En preorden es:\n");
                    PreOrden(Raiz);
                    break;
    case 7:    printf("En niveles es:\n");
                    Niveles(Raiz);
                    break;


  case 9:    printf("borrar:\n");
                        cin >> dato;
                    Arbol1 = borrarA(Raiz,dato);

                    break;



      default:
                    printf("Opcion Incorrecta.");
                    Menu();
                    break;
    }
    Menu();
    cin >> opcion;
  }
 return 0;
}
PM MAIL   Вверх
Dude03
Дата 8.11.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Юзай теги кода!!!
В чем проблема?
Безобидная рекурсия :
Код

void Free( struct node* p )
{
   if( p ) {
      Free( p->l );
      Free( p->r );
      free( p );
   }
}

PM MAIL   Вверх
skyangel27
Дата 10.11.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.11.2006

Репутация: нет
Всего: нет



не виходит не пойму может чето в цасе надо поменять?
 


  case 9:    printf("borrar:\n");

                     Free(a);
                    break;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1305 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.