Rechercher récursive sur un arbre binaire

voix
0

quelqu'un peut me aider à TRACE ce morceau de code si son correct ou incorrect.i je étudie récursion ces jours-ci.

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;
}
Créé 07/08/2011 à 13:44
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
3

il manque arrêter condition. vous devriez vérifier si t.left == null, ou vous obtiendrez NullPointerException. En outre, vous devez retourner t.left.isExist(..)OU t.right.isExist(...)et non isExist [vous voulez appeler cette méthode sur le fils]

actuellement, cette version s'en boucle infinie - parce que vous vérifiez toujours dans le même nœud racine.

Créé 07/08/2011 à 13:47
source utilisateur

voix
1

Votre code n'est pas symétrique.

pour un côté, vous appelez isExist(t.left), pour un autre que vous appelezisExist(a.right)

Vous voulez probablement appeler t.left.isExist(a)et t.right.isExist(a), mais est purement spéculative que vous ne disposez pas d' une complète SSCCE pour nous de regarder.

Créé 07/08/2011 à 13:52
source utilisateur

voix
0

Il est syntaxiquement correct Java. Mais je ne vois pas comment il pourrait peut-être faire ce que vous avez l'intention.

Il semble que le paramètre « élément » est la chose que vous recherchez et le champ « première » dans la classe actuelle est la racine de l'arbre binaire.

On ne sait pas si la clé de l'arbre binaire et la recherche (dans la classe Element) est « actif » ou « données ». Le « moins » test utilise « actif », alors que le « plus grand que » utilisations de test « données ». Il semble probable que les deux lignes devraient utiliser le même champ. Il est peut - être que l' un de ces deux domaines ( « actifs » ou « données ») devrait ne pas être référencé dans cette méthode du tout. Peut - être la dernière ligne de la méthode doit être juste « return true; »?

(Je soupçonne que la « condition d'arrêt » et le « code n'est pas symétrique » réponses ci-dessus sont à la fois erronée, mais je peux me tromper. Il est difficile de dire avec seulement le code donné.)

Je suis d'accord que boucle infinie est probable: Je pense que vous devez créer une deuxième fonction « recherche » qui accepte deux paramètres « élément » - l'une étant la chose à rechercher (comme le paramètre « élément » courant) et l'autre l'élément suivant à la recherche - l'équivalent de la variable locale actuelle « c ». Je ferais le refactoring sur tout « Extraire la méthode » dans le corps de la méthode « recherche » en cours, sauf la première ligne, puis modifiez les deux appels récursifs à utiliser la nouvelle méthode.

(Une partie de c'est spéculative, basée sur moi deviner ce que vous voulez ou avez l'intention, compte tenu des informations limitées. Je pourrais, bien sûr, tout à fait faux.)

Créé 09/08/2011 à 03:11
source utilisateur

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