Recursief zoeken op een Binary Tree

stemmen
0

kan iemand mij helpen om dit stukje code op te sporen als de juiste of incorrect.i studeer recursie deze dagen.

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;
}
De vraag is gesteld op 07/08/2011 om 13:44
bron van user
In andere talen...                            


3 antwoorden

stemmen
3

ontbreekt stopconditie. U moet controleren of t.left == null, of je zal NullPointerException krijgen. Ook moet je terug t.left.isExist(..)OR t.right.isExist(...)en niet isExist [wil je deze methode op de zoon roepen]

op dit moment, zal deze versie te krijgen in oneindige lus - want je zult altijd controleren in dezelfde wortel node.

antwoordde op 07/08/2011 om 13:47
bron van user

stemmen
1

De code is niet symmetrisch.

voor de ene kant, u belt isExist(t.left), voor een ander je bellenisExist(a.right)

Wilt u waarschijnlijk om te bellen t.left.isExist(a)en t.right.isExist(a), maar dat is puur speculatief, aangezien u niet over een volledige hebben SSCCE voor ons om naar te kijken.

antwoordde op 07/08/2011 om 13:52
bron van user

stemmen
0

Het is syntactisch correct Java. Maar ik zie niet in hoe het misschien zou kunnen doen wat je van plan bent.

Het lijkt erop dat de parameter 'element' is het wat je zoekt en de 'eerste' veld in de huidige klasse is de wortel van de binaire boom.

Het is onduidelijk of de sleutel voor de binaire boom en search (in het Element class) is 'actief' of 'data'. De 'minder dan' test maakt gebruik van 'actief', terwijl de 'groter dan' 'data' test maakt gebruik van. Het lijkt waarschijnlijk dat beide lijnen hetzelfde veld moet gebruiken. Het kan zijn dat een van deze twee velden ( 'actief' of 'data') mag niet worden genoemd in deze methode op alle. Misschien is de laatste regel van de methode moet gewoon 'return true;'?

(Ik vermoed dat de "stop toestand" en de "code is niet symmetrisch" bovenstaande antwoorden zijn beide onjuist, maar ik kan het mis hebben. Het is moeilijk te zeggen met alleen de code gegeven.)

Ik ben het eens dat oneindige looping is waarschijnlijk: Ik vermoed dat je nodig hebt om een ​​tweede functie 'zoeken' dat twee 'Element' parameters accepteert creëren - een wezen het ding om te zoeken naar (zoals de huidige parameter 'element') en de ander wezen het volgende element te zoeken - het equivalent van plaatselijk variabele 'c'. Ik zou de "Extract Method" refactoring doen op alles in het lichaam van de huidige 'zoeken' methode, behalve de eerste regel, en wijzig de twee recursieve aanroepen van de nieuwe methode te gebruiken.

(Een deel van dit is speculatief, gebaseerd op me raden wat je wilt of van plan, gezien de beperkte informatie. Dus ik kon, uiteraard geheel onjuist.)

antwoordde op 09/08/2011 om 03:11
bron van user

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