Pregunta de arboles

Rev
14 de Enero del 2005
Tengo este código de busqueda:

//**************** CHECAR AQUI *****************************************
Aux=NULL;
Aux=&*raiz;
*Aux=Buscar_Nodo(Aux,nivel,1,valorX,1);
//**************** *****************************************

struct _Arbol Arbol::Buscar_Nodo(struct _Arbol *Nodo,short int valor,short int tipo_valor,short int valorX,short int modo)
{
struct _Arbol *Aux;
short int bien=0,y,regresa;//0 Aux 1: Nodo
char resp;

Aux=(struct _Arbol*)malloc(sizeof(struct _Arbol));

if(Nodo!=NULL && Aux!=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;
case 2://valorX
if(Nodo->PosX==valor)
bien=1;
break;
}

if(!bien)
{
*Aux=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX-80,modo);

if(Aux==NULL)
*Aux=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX+80,modo);
regresa=0;
}
else
regresa=1;
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);
setcolor(BLACK);
settextstyle(Fuente,HORIZ_DIR,4);
outtextxy(10,y-60,"Ese nodo esta bien: ");
outtextxy(10,y-52," S: SI N: NO");

do
{
HacerTextBox(200,y-60);
Cursor(206,y-56);
resp=toupper(getch());
}while(resp!='S' && resp!='N');

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(10,y-60,"Ese nodo esta bien: ");
outtextxy(10,y-52," S: SI N: NO");
fflush(stdin); fflush(stdout);
regresa=1;
break;
case 'N':
setcolor(WHITE);
outtextxy(10,y-60,"Ese nodo esta bien: ");
outtextxy(10,y-52," S: SI N: NO");
fflush(stdin); fflush(stdout);
ImprimirNodo(Nodo,0,0);
*Aux=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX-80,modo);

if(Aux==NULL)
*Aux=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX+80,modo);
regresa=0;
break;
}
}
else
{
*Aux=Buscar_Nodo(Nodo->Nodo[Izq],valor,tipo_valor,valorX-80,modo);

if(Aux==NULL)//no lo encontro en Izq
*Aux=Buscar_Nodo(Nodo->Nodo[Der],valor,tipo_valor,valorX+80,modo);
regresa=0;
}
break;
}
if(regresa)
return(*Nodo);
else
return(*Aux);
}//if que comprueba que el nodo no este vacio
else
return(*Nodo);
}

La clase de busqueda si encuentra el nodo al menos en el nivel 0 y uno pero no puedo seguir corrigiendo los errores ya que como verán al principio me da la dirección del nodo pero cuando modifico este nodo también modifica la raíz en el mejor de los casos si no modificara los valores de todos los nodos por lo que pasa.

Esta busqueda tal vez paresca erratica pues tienen razón ya que no sigue las características de un arbol binario normal ya que en este programa el usuario puede poner los valores en el nivel y nodo que se le antoje, por lo que el programa no lo ordena(vaya que sencillo sería así).

Bueno si alguien puede darme una sugerencia.
Tal vez no me explico muy bien así que daré un ejemplo de lo que trato de decir:

raiz [D8E] //la raiz y su espacio de memoria
valor= 50
nivel= 0
posX= 350
posY= 50
Izq[0000] //puntero que apunta al lado izquierdo
Der[000] //puntero que apunta al lado derecho

Aux [D8E] //Aux y su espacio de memoria
valor= 50
nivel= 0
posX= 350
posY= 50
Izq[0000] //puntero que apunta al lado izquierdo
Der[000] //puntero que apunta al lado derecho

Cómo pueden ver Aux y raiz son los mismos en la primera vuelta ya que agregare nuevos nodos a la raíz, y obviamente si modifico un valor de raiz afecta tambíen a Aux y viceversa, mi pregunta es esta:

Cómo puedo hacer para que después de obtener el nodo que voy a modificar(Aux), qué tengo que hacer para no modifcar también a raiz o al nodo a donde apunta Aux.

Gracias por la molestia de leer esto.