eliminar un dato de arbol

Iniciado por Anduresu, 30 Julio 2020, 00:36 AM

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

Anduresu

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


#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;
}