Buscar de forma recursiva en un árbol binario

votos
0

¿Alguien puede ayudarme a rastrear esta pieza de código si es correcta o incorrect.i estoy estudiando la recursividad en estos días.

boolean search(Element element) {
    Element c=first;
    if(c==null)
        return false;
    else if(element.asset < c.asset)
        if(c.left==null)
            return false;
        else
            return search(c.left);
    else if(element.data>c.data)
        if(c.right==null)
            return false;
        else
            return search(c.right);
     else  
         return element.asset==c.asset;
}
Publicado el 07/08/2011 a las 13:44
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
3

que carece de condición de parada. usted debe comprobar si t.left == null, o se obtendrá NullPointerException. También, debe devolver t.left.isExist(..)o t.right.isExist(...)no isExist [tendrá que invocar este método sobre el hijo]

Actualmente, esta versión va a entrar en un bucle infinito - porque siempre se va a comprobar en el mismo nodo raíz.

Respondida el 07/08/2011 a las 13:47
fuente por usuario

votos
1

El código no es simétrica.

por un lado, se llama isExist(t.left), por otra se llamaisExist(a.right)

Es posible que desee llamar t.left.isExist(a)y t.right.isExist(a), pero que es puramente especulativa, ya que no tiene un completo SSCCE para que veamos.

Respondida el 07/08/2011 a las 13:52
fuente por usuario

votos
0

Es sintácticamente correcta de Java. Pero no veo cómo podría estar haciendo lo que se propone.

Parece ser que el parámetro 'elemento' es lo que está buscando y el campo 'primero' en la clase actual es la raíz del árbol binario.

No está claro si la clave para el árbol binario y de búsqueda (en la clase Element) es 'activo' o 'datos'. El 'menor que' prueba utiliza 'activo', mientras que el 'mayor que' 'datos' de prueba usos. Parece probable que las dos líneas deben utilizar el mismo campo. Puede ser que uno de estos dos campos ( 'activo' o 'datos') debe no hacer referencia en este método en absoluto. Tal vez la última línea del método debe ser sólo 'return true;'?

(Sospecho que la "condición de parada" y el "código no es simétrica" ​​respuestas anteriores son incorrectas tanto Pero podría estar equivocado:. Es difícil decir sólo con el código dado.)

Estoy de acuerdo en que es probable bucles infinitos: Sospecho que es necesario crear una segunda función de 'búsqueda' que acepta dos parámetros 'elemento' - uno que es el que hay que buscar (como el parámetro actual 'elemento') y el otro el siguiente elemento a buscar - el equivalente de corriente variable 'c' local. Haría la refactorización "Extract Method" en todo en el cuerpo del método actual de 'búsqueda', excepto la primera línea, y luego cambiar las dos llamadas recursivas a utilizar el nuevo método.

(Algo de esto es especulativo, basado en mi adivinar lo que quiere o tiene la intención, dada la información limitada. Así que podría, por supuesto, ser muy mal).

Respondida el 09/08/2011 a las 03:11
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more