Suchen Recursively auf einem Binary Tree

stimmen
0

kann mir jemand helfen, dieses Stück Code zu verfolgen, wenn seine korrekte oder incorrect.i in diesen Tagen Rekursion studiere.

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;
}
Veröffentlicht am 07/08/2011 um 13:44
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
3

es fehlt Zustand stoppen. Sie sollten , wenn t.left == null überprüfen, oder Sie werden Nullpointer bekommen. Außerdem sollten Sie zurückkommen t.left.isExist(..)OR t.right.isExist(...)und nicht isExist [wollen Sie diese Methode auf dem Sohn aufzurufen]

Derzeit wird diese Version in Endlosschleife bekommen - weil man immer in der gleichen Wurzel-Knoten überprüft.

Beantwortet am 07/08/2011 um 13:47
quelle vom benutzer

stimmen
1

Der Code ist nicht symmetrisch.

für eine Seite, rufen Sie isExist(t.left), für eine andere Sie anrufenisExist(a.right)

Sie wollen wahrscheinlich nennen t.left.isExist(a)und t.right.isExist(a), aber das ist rein spekulativ , da Sie nicht einen kompletten haben SSCCE für uns zu suchen.

Beantwortet am 07/08/2011 um 13:52
quelle vom benutzer

stimmen
0

Es ist syntaktisch korrektes Java. Aber ich sehe nicht, wie es vielleicht tun könnte, was Sie beabsichtigen.

Es scheint, dass die ‚Element‘ Parameter ist die Sache, die Sie suchen und das ‚erste‘ Feld in der aktuellen Klasse ist die Wurzel des binären Baumes.

Es ist unklar , ob der Schlüssel für den binären Baum und suchen (in der Klasse Element) ist ‚Vermögenswert‘ oder ‚Daten‘. Der ‚kleiner als‘ Test verwendet ‚Vermögenswert‘, während der ‚größer als‘ Testzwecke ‚Daten‘. Es scheint wahrscheinlich , dass beide Linien das gleiche Feld verwendet werden soll. Es könnte sein , dass eines dieser beiden Felder ( ‚Asset‘ oder ‚Daten‘ genannt ) sollte nicht bei allen in diesem Verfahren verwiesen werden. Vielleicht nur wurde die letzte Zeile des Verfahrens sollte ‚return true;‘?

(Ich vermute, dass die „Stoppbedingung“ und der „Code ist nicht symmetrisch“ Antworten oben sind beide falsch Aber ich könnte falsch sein. Es ist schwer, nur mit dem Code gegeben zu sagen.)

Ich bin damit einverstanden, dass eine unendliche Looping ist wahrscheinlich: Ich vermute, dass Sie eine zweite ‚Suche‘ Funktion erstellen müssen, die zwei ‚Element‘ Parameter akzeptiert - man das Ding ist zu suchen (wie die aktuelle ‚Element‘ Parameter) und die andere das nächste Element zu suchen, - das Äquivalent von aktuellen lokalen variablen ‚c‘. Ich würde tun, um das „Methode Extract“ Refactoring auf allem im Körper der aktuellen ‚Suche‘ Methode mit Ausnahme der ersten Zeile, und dann die beide rekursiven Aufrufe ändern, um die neue Methode zu verwenden.

(Ein Teil davon ist spekulativ, basierend auf mich raten, was Sie wollen oder beabsichtigen, begrenzte Informationen gegeben. So konnte ich, natürlich, ganz falsch sein.)

Beantwortet am 09/08/2011 um 03:11
quelle vom benutzer

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