Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/04/2010, 16:47
Avatar de calichecal
calichecal
 
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 12
Duda con Metodo recursivo

hola a todos,e estado haciendo una clase generica para hacer arboles binarios perfectamente equilibrados, pero no me quiere funcionar bien el metodo que se encarga de buscar un nodo, siempre me devuelve un mismo objeto, e verficado varias veces pero no encuentro el error, agradesco por su tiempo, al que analize la clase, que la voy a dejar a continuacion:



Código:
//arbol binario prefectamente equilibrado


public abstract class CArbolPE
{

// Atributos del árbol binarlo
protected CNodo raiz = null; // raíz del árbol
// Nodo de un árbol binario
private class CNodo
{
// Atributos
private Object datos;	// referencia a los datos
private CNodo izquierdo;     // raíz del subárbol izquierdo 
private CNodo derecho;        // raíz del subárbol derecho 
// Métodos
public CNodo() {}	// constructor
}
// Métodos del árbol binario
public CArbolPE() {}	// constructor

 public abstract Object leerDatos();///////////////////////////////////////////////abstract////////////////////
public abstract int comparar(Object objl, Object obj2);////////////////////////////abstract///////////////////
public abstract void procesar(Object obj);/////////////////////////////////////////abstract////////////////
public abstract void visitarInorden();/////////////////////////////////abstract////////////////
private CNodo construirArbol(int n)/////////////////////////////////////////////////////////////////
{
// Construye un árbol de n nodos perfectamente equilibrado
CNodo nodo = null;
 int ni = 0, nd = 0;    
if( n == 0 )
 return null;
else
{
ni = n / 2;	// nodos del subárbol izquierdo
nd = n - ni - 1; // nodos del subárbol derecho
nodo = new CNodo();
nodo.datos = leerDatos();
nodo.izquierdo = construirArbol(ni);
nodo.derecho = construirArbol(nd);
return nodo;
}
}

public void construirArbolEquilibrado(int n)/////////////////////////////////////////////////////////////
{
raiz = construirArbol(n);
}
private void buscar(Object obj, CNodo r, Object[] datos, int[] pos) ///////////////////////////////////////
{

// Este método buscar permite acceder a un determinado nodo.
// Si los datos especificados por "obj" se localizan en el
// árbol referenciado por "r" a partir de la posición "pos[0]".
// "buscar" devuelve en datos[0] la referencia a esos datos: 
// en otro caso, devuelve null.
// Los nodos se consideran numerados (0. 1, 2,  ...) según 
// el orden en el que son accedidos por el método "inorden".
CNodo actual = r;
if ( actual != null && datos[0] == null )
{
buscar(obj, actual.izquierdo, datos, pos );
 if ( comparar( obj, actual.datos )== 0 )
 	 if (pos[0]--== 0)
 	 	 datos[0] = actual.datos;   // nodo encontrado
 	 buscar(obj, actual.derecho, datos, pos);
}
}

public Object buscar(Object obj)// <----- Este es el metodo que siempre me devuelve el mismo objeto
{
return buscar(obj, 0);
}
public Object buscar(Object obj, int posición) /////////////////////////////////////////////////////////
{
Object[] datos = {null};
int[] pos ={posición};
buscar(obj, raiz, datos, pos);
return datos[0];
}
public void inorden( CNodo r, boolean nodoRaiz )////////////////////////////////////////////////////////
{
// El método recursivo inorden visita los nodos del árbol
// utilizando la forma inorden; esto es, primero se visita 
// el subárbol izquierdo, después se visita la raíz, y por
// último, el subárbol derecho.
// SI el segundo argumento es true, la visita comienza
// en la raíz independientemente del primer argumento.
CNodo actual = null;
if ( nodoRaiz )
actual = raiz; // partir de la raiz else
else
actual = r;     // partir de un nodo cualquiera
if ( actual != null )
{
inorden( actual.izquierdo, false ); // visitar subárbol izq.
 // Procesar los datos del nodo visitado
 procesar( actual.datos );
inorden( actual.derecho, false ); // visitar subárbol dcho.
}
}
}
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-

Última edición por calichecal; 03/04/2010 a las 17:02