PDA

Ver la versión completa : Duda en un Arbol Binario de Busqueda en C++



Deskicio
09-01-2006, 16:11
Buenas a tod@s. Programando un ABB para la uni me ha surgido un problema.
Tengo todas las clases definidas, pero las funciones esVacio(),Podar()..., requieren el contenido de un puntero a raiz del arbol o de una hoja...
Como puedo hacer para llamarlos en el int main(), par saber si tengo el arbol vacio o deseo borrar desde cuaquier nodo elegido por mi.

Gracias

ChotaJr
23-03-2006, 15:39
:mad: Ya se que es demasiado tarde pero en fin a alguien le servira

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define true 1

void PORTADA(void);
void intro_nodo(void);
void lista_nodos(void);
void borra_nodo(void);
void lista_preorden();
void lista_inorden();
void lista_postorden();

struct arbol *borra();
struct arbol *crea_arbol();

struct arbol{
char clave;
struct arbol *izquierda;
struct arbol *derecha;
};

struct arbol *raiz;

struct arbol *borra (struct arbol *raiz, char nodo){
struct arbol *d1, *d2;
if(raiz->clave == nodo){
if(raiz->izquierda == raiz->derecha){
free(raiz);
return (NULL);
}
else if(raiz->izquierda == NULL){
d1 = raiz->derecha;
free(raiz);
return (d1);
}
else if(raiz->derecha == NULL){
d1 = raiz->izquierda;
free(raiz);
return (d1);
}
else{
d2 = raiz->derecha;
d1 = raiz->derecha;
while(d1->izquierda)d1 = d1->izquierda;
d1->izquierda = raiz->izquierda;
free(raiz);
return(d2);
}
}
if(raiz->clave<nodo)
raiz->derecha = (struct arbol *)borra(raiz->derecha, nodo);
else
raiz->izquierda = (struct arbol *)borra(raiz->izquierda, nodo);
return raiz;
}



struct arbol *crea_arbol(struct arbol *raiz, struct arbol *aux, char dato){
if(!aux){
aux = (struct arbol *)malloc (sizeof(struct arbol));
aux->izquierda = (struct arbol *)NULL;
aux->derecha = (struct arbol *)NULL;
aux->clave = dato;
if(!raiz)raiz = (struct arbol *) crea_arbol(raiz, raiz, dato);
else raiz->derecha = aux;
return aux;
}
if
(dato < aux->clave) (struct arbol*)crea_arbol(aux, aux->izquierda, dato);
else
if(dato > aux->clave) (struct arbol *)crea_arbol(aux, aux->derecha, dato);
}



void intro_nodo(void){
char dato;
do{
printf("\n\tIntroduzca dato: ");
gets(&dato);
if(!raiz)raiz = (struct arbol *)crea_arbol(raiz, raiz, dato);
else (struct arbol *) crea_arbol(raiz, raiz, dato);
}while(dato);
}



void borra_nodo(void){
char dato;
printf("\n\tDato a borrar: ");
gets(&dato);
(struct arbol *) borra (raiz, dato);
}



void lista_preorden(struct arbol *aux){
int orden;
if(!aux)return;
printf("\n\t%c\t", aux->clave);
lista_preorden(aux->izquierda);
lista_preorden(aux->derecha);
}



void lista_inorden(struct arbol *aux){
int orden;
if(!aux)return;
lista_inorden(aux->izquierda);
printf("\n\t%c\t", aux->clave);
lista_inorden(aux->derecha);
}



void lista_postorden(struct arbol *aux){
int orden;
if(!aux)return;
lista_postorden(aux->izquierda);
lista_postorden(aux->derecha);
printf("\n\t%c\t", aux->clave);
}



void lista_nodos(void){
clrscr();
printf("\n\tListado de los nodos del arbol");
printf("\n\tP.............Preorden");
printf("\n\tI.............Inorden");
printf("\n\tS.............Postorden");
switch(toupper(getche())){
case 'P': lista_preorden(raiz);
break;
case 'I': lista_inorden(raiz);
break;
case 'S': lista_postorden(raiz);
break;
}
}




void main(void){
raiz = (struct arbol *)NULL;
while(true){
clrscr();
printf("\n\tMenu del programa de un arbol");
printf("\n\tA.............Añadir nodo");
printf("\n\tL.............Listado de nodos");
printf("\n\tB.............Borrar nodos");
printf("\n\tX.............Terminar");
switch(toupper(getche())){
case 'A': intro_nodo();
break;
case 'L': lista_nodos();
break;
case 'B': borra_nodo();
break;
case 'X': exit(0);}}}

Deskicio
23-03-2006, 19:57
muchas gracias por el arbol.
Muy currado XDXD

ChotaJr
30-03-2006, 10:58
:mad: :mad: :mad:
Muy bueno que te haya servido.
ojala mueras joven

SxR
30-03-2006, 13:27
Te puedes explicar ChotaJr¿?¿?

Marchi
31-03-2006, 02:30
Ya lei varios posts de ChotaJr y puedo decir que de assembler y C/C++ parece que sabe, pero es un poco agresivo , ¿no? :confused:


Chau saludos

ChotaJr
01-04-2006, 21:37
:mad: :mad: :mad: :mad:
ok lo acepto no fue lo adecuado decirle que muera joven pero es un chiste local creo que no debi decirlo porque solo yo me entiendo pero el punto qes que le sirvio el arbol y un usuario contento es un usuario que potencialmente nos podria ayudar despues cuando ya se vuelva mejor programador asi como yo os he ayudado el podra ayudar en fin lo siento. :mad: :mad: