Recursiv Caută pe un arbore binar

voturi
0

poate cineva să mă ajute să urmărească această bucată de cod dacă este corect sau sa incorrect.i Studiez de recurență aceste zile.

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;
}
Întrebat 07/08/2011 la 13:44
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
3

îi lipsește opri condiție. ar trebui să verificați dacă t.left == null, sau vei primi NullPointerException. De asemenea, ar trebui să se întoarcă t.left.isExist(..)SAU t.right.isExist(...)și nu isExist [veți dori să invoce această metodă pe fiul]

în prezent, această versiune va intra în buclă infinită - pentru că va verifica întotdeauna în același nod rădăcină.

Publicat 07/08/2011 la 13:47
sursa de către utilizator

voturi
1

Codul dvs. nu este simetrică.

pentru o parte, te sun isExist(t.left), pentru un alt sunaisExist(a.right)

Probabil că doriți să apelați t.left.isExist(a)și t.right.isExist(a), dar că este pur speculativă ca nu ai un complet SSCCE pentru noi să se uite la.

Publicat 07/08/2011 la 13:52
sursa de către utilizator

voturi
0

Este corect sintactic Java. Dar eu nu văd cum ar putea fi, eventual, să faci ceea ce intenționați.

Se pare că parametrul „elementul“ este lucrul pe care îl căutați și câmpul „prima“ în clasa curentă este rădăcina arborelui binar.

Este neclar dacă cheia pentru arborele binar și de căutare (în clasa Element) este „activ“ sau „date“. „Mai puțin decât“ testul utilizează „activ“, în timp ce „mai mare decât“ „date“ utilizări de testare. Se pare că ambele linii ar trebui să utilizeze același domeniu. S - ar putea fi faptul că una dintre aceste două domenii ( „active“ sau „date“) ar trebui să nu se face referire în această metodă , la toate. Poate ultima linie a metodei ar trebui să fie pur și simplu „return true;“?

(Bănuiesc că „starea de oprire“ și „codul nu este simetrică“ răspunsurile de mai sus sunt ambele incorecte, dar am putea fi greșit. Este greu de spus doar cu codul dat.)

Sunt de acord că looping infinit este probabil: Bănuiesc că aveți nevoie pentru a crea o a doua funcție de „căutare“ care acceptă doi parametri „elementul“ - unul dintre ei fiind lucru pentru a căuta (cum ar fi parametrul curent „elementul“), iar cealaltă următorul element pentru a căuta - echivalentul curentului variabil „c“ locale. Mi-ar face „Extras metoda“ refactorizarii pe tot în corpul metodei curente „căutare“, cu excepția primei linii, apoi modificați cele două apeluri recursive pentru a utiliza noua metodă.

(O parte din aceasta este speculativă, bazată pe mine ghicitul ceea ce doriți sau intenționați, având în vedere informațiile limitate. Așa că am putea, desigur, să fie destul de greșit.)

Publicat 09/08/2011 la 03:11
sursa de către utilizator

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