Foros del Web » Programación para mayores de 30 ;) » Java »

Duda con Metodo recursivo

Estas en el tema de Duda con Metodo recursivo en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/04/2010, 16:47
Avatar de 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
  #2 (permalink)  
Antiguo 03/04/2010, 22:53
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 21 años, 2 meses
Puntos: 4
Respuesta: Duda con Metodo recursivo

Código Javascript:
Ver original
  1. public Object buscar(Object obj)// <----- Este es el metodo que siempre me devuelve el mismo objeto
  2. {
  3. return buscar(obj, 0); // AQUI ESTA EL Problema
  4. }

Estas cosas siempre pasan, a veces estamos tan saturado de codigo en nuestras mentes que un simple detalle se nos convierte en un verdadero dolor de cabeza...

Lo que esta pasando es que siempre le estas recuperando el indice 0 "CERO"...

Saludos...
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #3 (permalink)  
Antiguo 06/04/2010, 07:16
 
Fecha de Ingreso: marzo-2010
Mensajes: 15
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Duda con Metodo recursivo

Lo que no entiendo porque tanta complicacion para buscar un elemento en el Arbol... eres de la UCI???
  #4 (permalink)  
Antiguo 06/04/2010, 08:15
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Duda con Metodo recursivo

dackiller lo ha clavado.

Tendrías que recorrer el conjunto de nodos y buscar el objeto en un bucle

llamando a: buscar(obj, i) donde i es el índice que va tomando el valor del nodo en cada paso del bucle.
  #5 (permalink)  
Antiguo 10/04/2010, 20:34
Avatar de calichecal  
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Duda con Metodo recursivo

Cita:
Iniciado por Fuzzylog Ver Mensaje
dackiller lo ha clavado.

Tendrías que recorrer el conjunto de nodos y buscar el objeto en un bucle

llamando a: buscar(obj, i) donde i es el índice que va tomando el valor del nodo en cada paso del bucle.
El codigo esta hecho en base a un libro en donde lo encontre y afirma que el metodo recursivo esta bien, entonces es un error del libro?
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-
  #6 (permalink)  
Antiguo 10/04/2010, 20:37
Avatar de calichecal  
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Duda con Metodo recursivo

Cita:
Iniciado por Fuzzylog Ver Mensaje
dackiller lo ha clavado.

Tendrías que recorrer el conjunto de nodos y buscar el objeto en un bucle

llamando a: buscar(obj, i) donde i es el índice que va tomando el valor del nodo en cada paso del bucle.
es que el codigo se basa en un libro que insiste en trabajar asi con el metodo recursivo por tratarse de arboles, entonces el libro esta en un error?
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-
  #7 (permalink)  
Antiguo 12/04/2010, 22:10
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 21 años, 2 meses
Puntos: 4
Respuesta: Duda con Metodo recursivo

Porque NO ?

Equivocarse es un derecho que todos tenemos pero no un deber !

Jeje...
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.

Etiquetas: metodo, recursivo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:42.