Rekurencyjnie Szukaj binarne drzewo

głosy
0

Czy ktoś może mi pomóc, aby śledzić ten fragment kodu, jeżeli jego poprawne lub incorrect.i studiuję rekursji te dni.

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;
}
Utwórz 07/08/2011 o 13:44
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
3

brakuje mu przestać warunek. należy sprawdzić, czy t.left == null, albo dostaniesz NullPointerException. Ponadto, należy zwrócić t.left.isExist(..)OR t.right.isExist(...)i nie isExist [będziemy chcieli, aby wywołać tej metody na syna]

Obecnie, ta wersja będzie dostać się do nieskończonej pętli - ponieważ będzie zawsze sprawdzać w tym samym węźle głównym.

Odpowiedział 07/08/2011 o 13:47
źródło użytkownik

głosy
1

Twój kod nie jest symetryczna.

na jednej stronie, należy zadzwonić isExist(t.left)na inny zadzwonićisExist(a.right)

Prawdopodobnie chcesz zadzwonić t.left.isExist(a)i t.right.isExist(a), ale jest czysto spekulacyjny, jak nie mieć pełny SSCCE dla nas patrzeć.

Odpowiedział 07/08/2011 o 13:52
źródło użytkownik

głosy
0

Jest składniowo poprawne Java. Ale ja nie rozumiem, jak to może być ewentualnie robi to, co zamierzają.

Wydaje się, że parametr „Element” jest rzeczą szukasz i „pierwsze” pole w bieżącej klasy jest korzeniem drzewa binarnego.

Nie wiadomo, czy klucz do binarnego drzewa i wyszukiwania (w klasie element) jest „atutem” lub „dane”. Do „mniej niż” test wykorzystuje „aktywa”, natomiast „większą niż” „danych” test zastosowań. Wydaje się prawdopodobne, że obie linie powinny korzystać z tego samego pola. Może być tak, że jeden z tych dwóch pól ( „aktywa” lub „dane”) powinno nie być uwzględniona w tej metodzie w ogóle. Może ostatnia linia metody powinny być po prostu „return true;”?

(Podejrzewam, że „stan zatrzymania” i „kod nie jest symetryczny” odpowiedzi powyżej są zarówno błędna Ale mogę się mylić. Trudno powiedzieć tylko z kodem danej).

Zgadzam się, że nieskończonej pętli jest prawdopodobne: Podejrzewam, że trzeba utworzyć drugą funkcję „szukaj”, która przyjmuje dwa parametry „element” - jedna jest rzeczą, aby szukać (jak bieżącego parametru „elementu”) i drugim jest kolejnym elementem, aby szukać - odpowiednik obecnego zmiennej lokalnej „c”. Chciałbym zrobić „Extract Method” refaktoryzacji na wszystko w organizmie bieżącego „Szukaj” metody za wyjątkiem pierwszej linii, a następnie zmienić dwa rekurencyjnych wywołań korzystać z nowej metody.

(Niektóre to spekulacyjny, na podstawie mi zgadywać, co chcesz lub zamierzają, biorąc pod uwagę ograniczone informacje. Więc mógłby być oczywiście bardzo źle).

Odpowiedział 09/08/2011 o 03:11
źródło użytkownik

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