/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

arbol que ingrese, elimine y liste datos

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
gervasioe



Registrado: 18 Jul 2011
Mensajes: 1

MensajePublicado: 18/07/2011 11:55 am
Título: arbol que ingrese, elimine y liste datos

Tengo un problema para la eliminación de datos, depende que dato elimine me lo raliza bien o no. Acá dejo el código

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <cassert>

using namespace std;

struct arbol{
int dato;
struct arbol *izq;
struct arbol *der;
};

void imprime(struct arbol *);
void reemplazar(struct arbol *, struct arbol *);

int main(int argc, char *argv[])
{
struct arbol *raiz, *marca, *actual, *p;
int d,v;
char opcion;


printf("Presione i para ingresar valores y para finalizar ingrese 1000\n");
printf("Presione b para borrar un valor\n");
printf("Presione l para listarlos\n");
printf("Presione s para salir\n");

cin>>opcion;
do{
switch(opcion)
{
case 'i':{
printf("Ingrese el primer valor\n");
raiz= new struct arbol;
assert(raiz);
cin>>raiz->dato;
raiz->izq=0;
raiz->der=0;

while(d!=1000)
{
printf("Ingrese el siguiente valor\n");
actual= new struct arbol;
cin>>d;
if(d!=1000)
{
marca=raiz;
while(marca!=0)
{
actual=marca;
if(d < actual->dato)
marca= actual->izq;
else
marca=actual->der;
}

p=new struct arbol;
p->izq=0;
p->der=0;
p->dato=d;
if(d<actual->dato)
actual->izq=p;
else
actual->der=p;
}

}
printf("Los datos ordenados son:\n");
imprime(raiz);
break;
}
case 'b':
{
cout<<"Ingrese el valor a borrar"<<endl;
cin>>v;
marca=raiz;
while(marca->dato!=v) //busca el nodo a borrar
{
actual=marca;
if(v<marca->dato)
marca=marca->izq;
else
marca=marca->der;
}
p=marca;
if(marca->der!=0) //busca el el valor mas proximo
{ //para reemplazarlo por él
marca=marca->der;
actual->der=marca;
while(marca->izq!=0)
{
marca=marca->izq;
actual->izq=marca;
}
p->dato=marca->dato;
actual->izq=0;
free(marca);
}
else
{ //En el caso de que no
//tenga hijo derecho hace
//que el padre del
if(marca->izq!=0) //nodo a borrar apunte
{ //directamente al hijo
marca=marca->izq; //izquierdo del nodo a borrar
actual->izq=marca;
free(p);
}
else
if(p->dato<actual->dato)
actual->izq=0;
else actual->der=0;
free(p); //Si ambos hijos del nodo a
} //borrar son nulos hace que el padre
break; //apunte a nulo
}
case 'l':
{
printf("Los datos ordenados son:\n");
imprime(raiz);
printf("\n\n");
break;
}
default: break;
}
printf("\nPresione i para ingresar valores\n");
printf("Presione b para borrar un valor\n");
printf("Presione l para listarlos\n");
printf("Presione s para salir\n");

cin>>opcion;
}while(opcion!='s');

system("PAUSE");
return 0;
}
void imprime(struct arbol *p)
{
if(p->izq!=0)
imprime(p->izq);
printf("==> %d\n",p->dato);
if(p->der!=0)
imprime(p->der);
}
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com