Rekurzivně vyhledávání na binární strom

hlasů
0

může mi někdo pomoct vystopovat tento kus kódu v případě jeho správné nebo incorrect.i studuji rekurzi v těchto dnech.

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;
}
Položena 07/08/2011 v 13:44
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

postrádá zastaví stav. byste měli zkontrolovat, zda t.left == NULL, nebo dostanete NullPointerException. Také byste měli vrátit t.left.isExist(..)OR t.right.isExist(...)a ne isExist [budete chtít vyvolat tuto metodu na syna]

V současné době, tato verze se dostane do nekonečné smyčky - protože budete vždy zkontrolujte, zda ve stejné kořenový uzel.

Odpovězeno 07/08/2011 v 13:47
zdroj uživatelem

hlasů
1

Váš kód není symetrický.

na jedné straně říkáte isExist(t.left), pro další voláníisExist(a.right)

Pravděpodobně chcete volat t.left.isExist(a)a t.right.isExist(a), ale to je čistě spekulativní, dokud nebudete mít kompletní SSCCE pro nás podívat se na.

Odpovězeno 07/08/2011 v 13:52
zdroj uživatelem

hlasů
0

Je syntakticky správný Java. Ale já nechápu, jak by to mohlo být to, co máte v úmyslu.

Zdá se, že parametr ‚prvek‘ je věc, kterou hledáte a ‚první‘ pole v aktuální třídě je kořenem binárního stromu.

Je to jasné, pokud je klíč pro binární strom a vyhledávání (ve třídě Element) je ‚aktiva‘ nebo ‚údaje‘. Dále jen ‚menší než‘ test používá ‚aktivum‘, zatímco ‚větší než‘ ‚dat‘ test používá. Zdá se pravděpodobné, že oba řádky by měly používat stejné pole. Mohlo by se stát, že jeden z těchto dvou polí ( ‚aktiva‘ nebo ‚údaje‘) by se to být uvedeno v této metodě vůbec. Možná, že poslední řádek této metody by měly být jen ‚return true;‘?

(Mám podezření, že „stav zastavení“ a „kód není symetrický“ odpovědi výše, tak nesprávné, ale mohu se mýlit:. Je těžké říci jen s kódem dané.)

Souhlasím s tím, že nekonečné smyčky, je pravděpodobné, že: Mám podezření, že je třeba vytvořit druhý funkci ‚Hledat‘, který přijímá dva ‚prvek‘ parametry - jedním z nich je věc hledat (jako aktuální parametr ‚prvek‘) a druhá je další Element vyhledávat - ekvivalent aktuální místní proměnné ‚c‘. Já bych to refaktorování „Vyjmout metodu“ na vše, co v těle současné ‚hledej‘ metody s výjimkou prvního řádku, a změnit dva rekurzivní volání používat novou metodu.

(Něco z toho je spekulativní, založená na mě hádat, co chcete, nebo máte v úmyslu, vzhledem k omezené množství informací. Takže jsem mohl samozřejmě být docela špatné.)

Odpovězeno 09/08/2011 v 03:11
zdroj uživatelem

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