Arbol no veo el error(logico)
Por si esto lo ve Alejandro_ o alguno otro experto que me quiera ayudar este es mi problema, bueno tengo la clase de ingresa para ingresar un nuevo nodo en un arbol, esa funciona bien pero tengo un problema con la busqueda del nodo ya que lo que quiero hacer es, mostrar todos los nodos del mismo nivel y que el usuario escoja cual quiere de todos los niveles cuando diga que si la busqueda regresara el nodo pero si se acaban las opciones que hay en ese nivel, entónces vuelve a comenzar hasta que el usuario escoja un nodo.
Espero me ayuden llevo ya 2 dÃas revisando les dejo el código con las últimas modificaciones que hice con respecto a valorX si pueden también ya que me faltarÃa posicionar eso.
Cada estructura contiene esto
valor
nivel
posX
posY
donde cada nodo podra almacenar su valor en que nivel esta y su posicion dentro de la pantalla si desean el codigo completo solo diganme
short int Arbol::Introducir_Nodo(void)
{
short int y,bien,nivel,lado,valorX=350,valorY=50;
char aux[1][2];
struct _Arbol *Nuevo,*Actual;
y=getmaxy();
Nuevo=(struct _Arbol*)malloc(sizeof(struct _Arbol));
Actual=(struct _Arbol*)malloc(sizeof(struct _Arbol));
if(Nuevo!=NULL && Actual!=NULL)
{
Nuevo->Nodo[Izq]=NULL;
Nuevo->Nodo[Der]=NULL;
HacerFicha("Introducir Elemento");
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
if(raiz==NULL)//Si es el primero
{
outtextxy(10,y-80,"Introduzca el valor de la Raiz: ");
HacerTextBox(192,y-80);
Nuevo->Valor=LeerElemento(198,y-77);
Nuevo->Nivel=max_nivel;
Nuevo->PosX=valorX;
Nuevo->PosY=valorY;
raiz=Nuevo;
setcolor(BLUE);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,450,"Raiz Creada Correctamente");
}
else
{
outtextxy(10,y-80,"En que nivel desea introducirlo: ");
do
{
HacerTextBox(200,y-80);
nivel=LeerElemento(206,y-76);
if(nivel<0 || nivel>max_nivel)
{
setcolor(RED);
outtextxy(288,y-50,"Ese nivel no es valido");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Ese nivel no es valido");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
fflush(stdin); fflush(stdout);
}
}while(nivel<0 || nivel>max_nivel);
Actual=Buscar_Nodo(raiz,nivel,1,valorX,1);
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,y-60,"En que lado desea almacenarlo: ");
outtextxy(10,y-52," 0= Izquierda 1= Derecha");
do
{
do
{
HacerTextBox(200,y-60);
lado=LeerElemento(206,y-56);
if(lado<Izq || lado>Der)
{
setcolor(RED);
outtextxy(288,y-50,"El arbol es de Orden 2");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"El arbol es de Orden 2");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
fflush(stdin); fflush(stdout);
}
}while(lado<Izq || lado>Der);
if(Actual->Nodo[lado]!=NULL)
{
setcolor(RED);
outtextxy(288,y-50,"Esa hoja ya esta ocupada");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Esa hoja ya esta ocupada");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
}
}while(Actual->Nodo[lado]!=NULL);
if(nivel==max_nivel)
{
max_nivel++;
Nuevo->Nivel=max_nivel;
}
else
Nuevo->Nivel=nivel+1;
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,y-40,"Introduzca el nuevo valor");
HacerTextBox(200,y-40);
Nuevo->Valor=LeerElemento(206,y-36);
Nuevo->PosY=valorY*Nuevo->Nivel;
Actual->Nodo[lado]=Nuevo;
bien=1;
setcolor(BLUE);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(288,y-50," Nodo Introducido Correctamente ");
}
}//if que pide el nuevo memoria para el nuevo elemento
else
{
bien=0;
setcolor(RED);
outtextxy(10,400,"Â Error al asignar memoria para el nuevo elemento !");
}
getch();
fflush(stdin); fflush(stdout);
return(bien);
}
// tipo_valor tipo_busqueda modo
// 0: valor 0: preorden 2:post orden 0: buscar solo nodo
// 1: nivel 1: in orden 1: buscar para introducir nodo
//MODIFICAR LA BUSQUEDA
struct _Arbol* Arbol::Buscar_Nodo(struct _Arbol *Nodo,short int valor,short int tipo_valor,short int valorX,short int modo)
{
short int bien=0,y;
char resp;
if(Nodo!=NULL)
{
y=getmaxy();
switch(modo)
{
case 0:// SOLO BUSCAR PARA LOS MODOS PRE, IN, POST
switch(tipo_valor)
{
case 0://valor
if(Nodo->Valor==valor)
bien=1;
break;
case 1://nivel
if(Nodo->Nivel==valor)
bien=1;
break;
}
if(!bien)
{
Nodo=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX,modo);
if(Nodo==NULL)
Nodo=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX,modo);
}
break;
case 1:// BUSCAR NODO QUE SIRVE PARA SU INSERCION
switch(tipo_valor)
{
case 0://valor
if(Nodo->Valor==valor)
bien=1;
break;
case 1://nivel
if(Nodo->Nivel==valor)
bien=1;
break;
}//que valor busca
if(bien)//si encontro el valor
{
ImprimirNodo(Nodo,0,1);
outtextxy(10,y-60,"Ese nodo esta bien: ");
outtextxy(10,y-52," S: SI N: NO");
HacerTextBox(200,y-60);
Cursor(206,y-58);
resp=toupper(getch());
if(resp!='S' && resp!='N')
{
setcolor(RED);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
}
switch(resp)
{
case 'S':
Nodo->PosX=valorX;
setcolor(WHITE);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
break;
case 'N':
N:
ImprimirNodo(Nodo,0,0);
Nodo=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX-80,modo);
if(Nodo==NULL)
Nodo=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX+80,modo);
break;
}
}
else
goto N;
break;
}
return(Nodo);
}//if que comprueba que el nodo no este vacio
else
return(Nodo);
}
Espero me ayuden llevo ya 2 dÃas revisando les dejo el código con las últimas modificaciones que hice con respecto a valorX si pueden también ya que me faltarÃa posicionar eso.
Cada estructura contiene esto
valor
nivel
posX
posY
donde cada nodo podra almacenar su valor en que nivel esta y su posicion dentro de la pantalla si desean el codigo completo solo diganme
short int Arbol::Introducir_Nodo(void)
{
short int y,bien,nivel,lado,valorX=350,valorY=50;
char aux[1][2];
struct _Arbol *Nuevo,*Actual;
y=getmaxy();
Nuevo=(struct _Arbol*)malloc(sizeof(struct _Arbol));
Actual=(struct _Arbol*)malloc(sizeof(struct _Arbol));
if(Nuevo!=NULL && Actual!=NULL)
{
Nuevo->Nodo[Izq]=NULL;
Nuevo->Nodo[Der]=NULL;
HacerFicha("Introducir Elemento");
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
if(raiz==NULL)//Si es el primero
{
outtextxy(10,y-80,"Introduzca el valor de la Raiz: ");
HacerTextBox(192,y-80);
Nuevo->Valor=LeerElemento(198,y-77);
Nuevo->Nivel=max_nivel;
Nuevo->PosX=valorX;
Nuevo->PosY=valorY;
raiz=Nuevo;
setcolor(BLUE);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,450,"Raiz Creada Correctamente");
}
else
{
outtextxy(10,y-80,"En que nivel desea introducirlo: ");
do
{
HacerTextBox(200,y-80);
nivel=LeerElemento(206,y-76);
if(nivel<0 || nivel>max_nivel)
{
setcolor(RED);
outtextxy(288,y-50,"Ese nivel no es valido");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Ese nivel no es valido");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
fflush(stdin); fflush(stdout);
}
}while(nivel<0 || nivel>max_nivel);
Actual=Buscar_Nodo(raiz,nivel,1,valorX,1);
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,y-60,"En que lado desea almacenarlo: ");
outtextxy(10,y-52," 0= Izquierda 1= Derecha");
do
{
do
{
HacerTextBox(200,y-60);
lado=LeerElemento(206,y-56);
if(lado<Izq || lado>Der)
{
setcolor(RED);
outtextxy(288,y-50,"El arbol es de Orden 2");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"El arbol es de Orden 2");
outtextxy(288,y-40,"Presione cualquier tecla para continuar con la captura...");
fflush(stdin); fflush(stdout);
}
}while(lado<Izq || lado>Der);
if(Actual->Nodo[lado]!=NULL)
{
setcolor(RED);
outtextxy(288,y-50,"Esa hoja ya esta ocupada");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Esa hoja ya esta ocupada");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
}
}while(Actual->Nodo[lado]!=NULL);
if(nivel==max_nivel)
{
max_nivel++;
Nuevo->Nivel=max_nivel;
}
else
Nuevo->Nivel=nivel+1;
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,y-40,"Introduzca el nuevo valor");
HacerTextBox(200,y-40);
Nuevo->Valor=LeerElemento(206,y-36);
Nuevo->PosY=valorY*Nuevo->Nivel;
Actual->Nodo[lado]=Nuevo;
bien=1;
setcolor(BLUE);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(288,y-50," Nodo Introducido Correctamente ");
}
}//if que pide el nuevo memoria para el nuevo elemento
else
{
bien=0;
setcolor(RED);
outtextxy(10,400,"Â Error al asignar memoria para el nuevo elemento !");
}
getch();
fflush(stdin); fflush(stdout);
return(bien);
}
// tipo_valor tipo_busqueda modo
// 0: valor 0: preorden 2:post orden 0: buscar solo nodo
// 1: nivel 1: in orden 1: buscar para introducir nodo
//MODIFICAR LA BUSQUEDA
struct _Arbol* Arbol::Buscar_Nodo(struct _Arbol *Nodo,short int valor,short int tipo_valor,short int valorX,short int modo)
{
short int bien=0,y;
char resp;
if(Nodo!=NULL)
{
y=getmaxy();
switch(modo)
{
case 0:// SOLO BUSCAR PARA LOS MODOS PRE, IN, POST
switch(tipo_valor)
{
case 0://valor
if(Nodo->Valor==valor)
bien=1;
break;
case 1://nivel
if(Nodo->Nivel==valor)
bien=1;
break;
}
if(!bien)
{
Nodo=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX,modo);
if(Nodo==NULL)
Nodo=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX,modo);
}
break;
case 1:// BUSCAR NODO QUE SIRVE PARA SU INSERCION
switch(tipo_valor)
{
case 0://valor
if(Nodo->Valor==valor)
bien=1;
break;
case 1://nivel
if(Nodo->Nivel==valor)
bien=1;
break;
}//que valor busca
if(bien)//si encontro el valor
{
ImprimirNodo(Nodo,0,1);
outtextxy(10,y-60,"Ese nodo esta bien: ");
outtextxy(10,y-52," S: SI N: NO");
HacerTextBox(200,y-60);
Cursor(206,y-58);
resp=toupper(getch());
if(resp!='S' && resp!='N')
{
setcolor(RED);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
getch();
setcolor(WHITE);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
}
switch(resp)
{
case 'S':
Nodo->PosX=valorX;
setcolor(WHITE);
outtextxy(288,y-50,"Opcion Invalida presione 'S' o 'N'");
outtextxy(288,y-40,"Presione cualquier tecla para continuar...");
fflush(stdin); fflush(stdout);
break;
case 'N':
N:
ImprimirNodo(Nodo,0,0);
Nodo=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX-80,modo);
if(Nodo==NULL)
Nodo=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX+80,modo);
break;
}
}
else
goto N;
break;
}
return(Nodo);
}//if que comprueba que el nodo no este vacio
else
return(Nodo);
}
