necesito ayuda la verdad no puede logarar que los datos del arbol se eliminen
no logro avanzar de ahi me serviria mucho su ayuda o consejos gracias
eliminar un solo dato del arbol
y despues que se eliminen todos los datos del arbol
no logro avanzar de ahi me serviria mucho su ayuda o consejos gracias
eliminar un solo dato del arbol
y despues que se eliminen todos los datos del arbol
Código (c) [Seleccionar]
#include<stdio.h>
#include<windows.h>
struct nodo{
double dato;
nodo *derecho;
nodo *izquierdo;
nodo *padre;
};
nodo *arbol=NULL;
//--------------------------elliminar dato----------------------------------
void eliminar(nodo*arbol,double num)
{
if(arbol ==NULL)
{
return;
}
else if(num<arbol ->dato)
{
eliminar(arbol->izquierdo,num);
}
else if(num>arbol->dato)
{
eliminar(arbol-> derecho,num);
}
else
{
eliminarnodo(arbol);
}
}
//--------------------------------------------------------------------------
nodo*minimo(nodo*arbol)
{
if(arbol ==NULL)
{
return NULL;
}
if(arbole->izquierdo)
{
return minimo(arbol->izquierdo);
}
else
{
return arbol;
}
}
//----------------------------------------------------------------
void reemplazar(nodo *arbol,nodo* nuevonodo)
{
if(arbol->padre)
{
if(arbol->dato =arbol->padre->izquierdo->dato)
{
arbol->padre->padre->izquierdo=nuevonodo;
}
else if(arbol->dato==arbol->padre->derecho->dato)
{
arbol->padre->derecho=nuevonodo;
}
}
if(nuevonodo)
{
nuevonodo->padre=arbol->padre;
}
}
//--------------------------------------------------------------------------
void destruirnodo(nodo *nodo)
{
nodo->izquierdo=NULL;
nodo->derecho=NULL;
delete nodo;
}
//---------------------------------------------------------------------------
void eliminarnodo(nodo*nodoeliminar)
{
if(nodoeliminar->izquerdo && nodoeliminar->derecho)
{
nodo*menor=minimo(nodoeliminar->derecho);
nodoeliminar->dato=menor->dato;
eliminarnodo(menor);
}
else if(nodoeliminar->izquierdo)
{
reemplazar(nodoeliminar,nodoeliminar->izquierda);
destruirnodo(nodoeliminar);
}
else if(nodoeliminar->derecho)
{
reemplazar(nodoeliminar,nodoeliminar->derecho);
destruirnodo(nodoeliminar);
}
}
//--------------------------CONSULTAR DATOS---------------------------------
bool consultar(nodo *arbol, double num){
if(arbol == NULL)
{
return false;
}
else if(arbol->dato == num)
{
return true;
}
else if(num < arbol->dato)
{
return consultar(arbol->izquierdo, num);
}
else
{
return consultar(arbol->derecho, num);
}
}
//--------------------------MOSTRAR DATOS---------------------------------
void mostrar(nodo *arbol, double cont)
{
if(arbol==NULL)
{
return;
}
else
{
mostrar(arbol->derecho, cont+1);
for(int i=0;i<cont; i++)
printf(" ");
printf(" %.2lf \n\n",arbol->dato);
mostrar(arbol->izquierdo, cont+1);
}
}
//-------------------------------------------------------------------------
nodo * crear(double num)
{
nodo * nuevonodo = new nodo();
nuevonodo->dato = num;
nuevonodo->derecho = NULL;
nuevonodo->izquierdo = NULL;
return nuevonodo;
}
//---------------------------INSERTAR DATOS--------------------------------
void insertar(nodo *&arbol, double num)
{
if(arbol == NULL)
{
nodo *nuevonodo = crear(num);
arbol = nuevonodo;
}
else
{
int raiz=arbol->dato;
if(num < raiz)
insertar(arbol->izquierdo, num);
else
{
insertar(arbol->derecho, num);
}
}
}
//------------------------------MENU-----------------------------------------------------
void menu()
{
int opc, cont=0;
double num;
char resp;
do{
system("cls");
printf("\n\t MENU ARBOLES BINARIOS");
printf("\n\t **** ******* ********");
printf("\n [1]...Agregando datos al %crbol",160);
printf("\n [2]...Mostrar datos del %crbol",160);
printf("\n [3]...Consultar datos del %crbol",160);
printf("\n [4]...Eliminar un dato del %crbol",160);
printf("\n [5]...Eliminar todos los datos del %crbol",160);
printf("\n [6]...SALIR");
do{
printf("\n Ingrese una opci%cn: ",162);
scanf("%d", &opc);
if(opc<1 || opc>6);
printf("\n ERROR...Ingrese una opci%cn v%clida[1-6]: ",162, 160);
}while(opc<1 || opc>6);
switch(opc){
case 1:
system("cls");
printf("\n\t INGRESO DATOS AL ARBOL");
printf("\n\t ******* ** ***** ** *****");
do{
printf("\n Ingrese un n%cmero al arbol: ", 163);
scanf("%lf", &num);
insertar(arbol, num);
do
{
printf("\n %cDesea ingresar otro dato al arbol?: ",168);
scanf("%s", &resp);
resp=toupper(resp);
if(resp != 'S' && resp != 'N')
printf("\n ERROR... Ingrese una opcion valida[S-N]");
}while(resp != 'S' && resp != 'N');
}while(resp=='S');
break;
case 2:
system("cls");
printf("\n\t MOSTRANDO DATOS DEL ARBOL");
printf("\n\t ********* ***** *** *****\n");
mostrar(arbol, cont);
system("pause");
break;
case 3:
system("cls");
printf("\n\t CONSULTAR DATOS DEL DATOS");
printf("\n\t ********* ***** *** *****");
do{
printf("\n Ingrese un n%cmero a buscar del arbol: ",163);
scanf("%lf", &num);
if(consultar(arbol, num) == true)
{
printf("\n EL ELEMENTO [%.2lf] HA SIDO ENCONTRADO", num);
printf("\n");
}
else
{
printf("\n EL DATO [%.2lf] NO ESTA GUARDADO EN EL ARBOL.",num);
printf("\n");
}
printf("\n");
system("pause");
do
{
printf("\n %cDesea buscar otro dato dentro del %crbol?: ",168,160);
scanf("%s", &resp);
resp=toupper(resp);
if(resp != 'S' && resp != 'N')
printf("\n ERROR... Ingrese una opcion valida[S-N]");
}while(resp != 'S' && resp != 'N');
}while(resp=='S');
break;
case 4:
system("cls");
printf("\n\t eliminar un DATO DEL arbol");
printf("\n\t ********* ***** *** *****");
eliminar(arbol,num);
default:
exit(0);
}
}while(opc != 6);
}
main()
{
menu();
return 0;
}