Oblicz głębokość poszukiwania binarnego drzewa?

głosy
0

Mam trudności obliczania sumowanie głębokościach [sumę poszczególnych głębokościach dla wszystkich dzieci w root] dla danego BST. Mam całkowitą liczbę węzłów do drzewa, a ja staram się obliczyć średnią głębokość na drzewie, wymagające mam tę sumę głębokości.

Rekurencja i nie dogadują się bardzo dobrze .. Jestem znalezienie tego problemu bardzo trudne. Chciałbym zobaczyć rekurencyjny rozwiązanie chociaż, jeśli to możliwe.

UWAGA:

Stworzyłem akcesorów Node.getLeft () i Node.getRight ()

Utwórz 09/12/2009 o 21:03
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
2

Pomyśl o tym, jak go o to kanonicznie przez strony, gdybym przedstawił obraz BST do ciebie na kartce papieru. Kiedy jesteś w węźle, jakie informacje musisz śledzić? W jaki sposób można znaleźć wysokość danego węzła?

Stąd, spróbuj przełożyć to na Pseudokod lub nawet prosto w Javie. Jeśli masz problemy, prosimy o komentarz, dzięki czemu użytkownicy mogą ci pomóc.

Odpowiedział 09/12/2009 o 21:08
źródło użytkownik

głosy
4

Trzeba tylko zachować licznik głębokości, jak przechodzić przez drzewo (patrzeć przechodzenie drzewa jeśli trzeba) i dodać wartość licznika za każdym razem dotrzeć do węzła. Następnie wystarczy podzielić przez liczbę węzłów.

To wygląda jak praca domowa, więc nie będę zapewniając bardziej szczegółowe rozwiązania.

Odpowiedział 09/12/2009 o 21:09
źródło użytkownik

głosy
0

Jest to praca domowa? Jeśli tak oznaczyć pytanie jako takiego.

Można stworzyć metodę, która:

  • ma odniesienie węzła i głębokość jako argumenty
  • przyrost głębokość
  • jeśli węzeł nie jest dzieckiem wezwanie węzeł rekurencyjnie dla sumy prawej i lewej oraz uaktualnienia odpowiednio
  • w przeciwnym razie zwraca sumę + głębokość

Po tej podzielić przez liczbę dzieci w drzewie, aby uzyskać średnią głębokość.

Odpowiedział 09/12/2009 o 21:10
źródło użytkownik

głosy
0

Musimy odwiedzić wszystkie węzły liści i dowiedzieć się, jak głębokie są. To sugeruje:

Nadaj funkcję węzła-odwiedzenie dodatkowy argument. Trzeba wiedzieć nie tylko gdzie to się dzieje, ale także, jak głęboko jest. Za każdym razem, jak się nazywa, to się nazywa na głębiej, więc węzeł gość po prostu musi zwiększyć liczbę głębokość to dostało od rozmówcy.

Teraz jedna z 2 rzeczy mogą się zdarzyć:

  • Albo znalazłeś węzeł jest węzłem liść, to znaczy nie ma żadnych dzieci; w tym przypadku, twój gość musi zwrócić swoją głębię rozmówcy. Tak, to właśnie zwraca liczbę Zrobiło się od rozmówcy, + 1.

  • czy to nie jest węzeł liścia. W tym przypadku będzie to mieć 1 lub 2 dzieci. Musimy dostać te raporty głębokości od naszych dzieci z powrotem do osoby dzwoniącej, tak po prostu wrócić sumę głębi zwracanych przez dzieci.

Przez magię rekursji, numer wrócił do odwiedzającego korzenia będzie sumą głębi wszystkich dzieci.

Aby uzyskać średnią głębokość, będziemy chcieli, aby podzielić to przez liczbę węzłów liściowych; który bym zostawić do drugiego przechodzenia do obliczenia. To może być wykonane w jednym, ale byłoby to trochę bardziej skomplikowane.

Odpowiedział 09/12/2009 o 21:26
źródło użytkownik

głosy
0

Ponieważ jest to praca domowa, nie chcę po prostu dać odpowiedź. Zamiast tego, oto rekurencyjny sposób obliczyć długość pojedynczo połączonej listy. Mam nadzieję, że to będzie wykazać rekurencji w pewnym sensie można zrozumieć, można ekstrapolować stamtąd do rozwiązania problemu BST.

public final class LL {
    public final int value;
    public LL next;

    public LL(final int value) {
        this.value = value;
    }

    public void add(final int value) {
        if (null == next) {
            next = new LL(value);
        } else {
            next.add(value);
        }
    }

    /**
     * Calculate the length of the linked list with this node as its head (includes this node in the count).
     *
     * @return the length.
     */
    public int length() {
        if (null == next) {
            return 1;
        }
        return 1 + next.length();
    }

    public static void main(final String... args) {
        final LL head = new LL(1);
        head.add(2);
        head.add(3);
        System.out.println(head.length());
        System.out.println(head.next.length());
    }
}
Odpowiedział 09/12/2009 o 21:57
źródło użytkownik

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