#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define true 1
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);}}}