Najkrótsza oddział w binarne drzewo?

głosy
1

Binarne drzewo może być zakodowane przy użyciu dwóch funkcji l i r takie, że dla node n, l(n)dać lewy dziecko n, r(n) dać właściwą dziecko n.

Gałąź drzewa jest ścieżka od korzenia do liścia, długość gałęzi do konkretnego liścia jest liczbą łuków na ścieżce od korzenia do tego liścia.

Niech MinBranch(l,r,x)będzie prosty rekurencyjny algorytm biorąc drzewa binarnego zakodowanego przez funkcje L i R razem z węzła głównego X na drzewo binarne i zwraca długość najkrótszego gałęzi drzewa binarnego.

Daj Pseudokod dla tego algorytmu.

OK, więc w zasadzie to, co mam wymyślić do tej pory:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Oczywiście nie jest to wielka lub doskonały. Byłbym wdzięczny, gdyby ludzie mogą mi pomóc to doskonały i pracy - każda pomoc będzie mile widziane.

Utwórz 28/08/2009 o 05:07
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
3

Wątpię ktoś rozwiąże zadanie domowe dla was prosto-up. Wskazówką: wartość zwracana na pewno musi rosnąć wyżej jak drzewo staje się większe, prawda? Jednak nie widzę żadnych literałów liczbowych w swojej funkcji z wyjątkiem 0, a żaden operatorzy addycyjnych albo. Jak będzie kiedykolwiek wrócić większych liczb?

Inny kąt w tej samej sprawie: w każdej chwili piszesz funkcji rekurencyjnej, pomaga wyliczyć „jakie są wszystkie warunki, gdzie powinienem przestać nazywać siebie co wrócić w każdej sytuacji?”

Odpowiedział 28/08/2009 o 05:15
źródło użytkownik

głosy
2

Jesteś na właściwym podejściem, ale nie jesteś całkiem tam; Twój rekurencyjny algorytm zawsze zwraca 0. (logika jest prawie w porządku, chociaż ...)

pamiętać, że długość filii jest o jeden mniejsza niż długość oddziału; tak left_onei right_onepowinna być 1 + MinBranch....

Steping przez algorytm z niektórych drzew próbnych pomogą odkryć błędy off-by-one jak ten ...

Odpowiedział 28/08/2009 o 05:16
źródło użytkownik

głosy
0

Co utworzeniu można traktować jako przeszukiwanie w głąb. Jednak biorąc pod uwagę to, co jesteś po (najkrótszą oddział), to nie może być najbardziej skuteczny podejście. Pomyśl o tym, jak algorytm będzie wykonywać na drzewie, który był bardzo ciężki po lewej stronie (węzła głównego), ale miał tylko jeden węzeł po prawej stronie.

Podpowiedź: rozważyć podejście przeszukiwanie wszerz.

Odpowiedział 28/08/2009 o 05:19
źródło użytkownik

głosy
0

Wygląda na to, co masz tam jak głębokość pierwszego algorytmu wyszukiwania, który będzie musiał przeszukać całe drzewo przed wymyślić rozwiązanie. co trzeba jest przeszukiwanie wszerz algorytm, który może powrócić jak najszybciej znajdzie rozwiązanie nie robiąc pełny wyszukiwanie

Odpowiedział 28/08/2009 o 05:19
źródło użytkownik

głosy
1

Wygląda na to, że prawie go mieć, ale za to na przykład:

      4

   3     5

Gdy prześledzić dzięki MinBranch, zobaczysz, że w swojej MinBranch(l,r,4)rozmowy:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

To ma sens, mimo wszystko, 3 jest węzłem liść, więc oczywiście odległość do najbliższego węzła liścia 0. To samo dzieje się na right_one.

Ale wtedy skończyć tutaj:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

ale to oczywiście błędne, ponieważ ten węzeł (4) nie jest węzłem liść. Kod zapomniał policzyć bieżący węzeł (ups!). Jestem pewien, że uda ci się naprawić.


Teraz, faktycznie, to sposób robisz to nie jest najszybszy, ale nie jestem pewien, czy to jest istotne dla tego ćwiczenia. Rozważmy to drzewo:

         4
       3   5
     2
   1

Twój algorytm będzie liczyć się lewą gałąź rekurencyjnie, mimo że mógłby hipotetycznie, wyskoczyć, jeśli najpierw liczone prawą gałąź i zauważyć, że 3 ma lewy, więc jest wyraźnie dłuższy niż 5 (który jest liść). Ale, oczywiście, licząc właściwego oddziału pierwszy nie zawsze działa!

Zamiast tego, z bardziej skomplikowanego kodu i prawdopodobnie kompromis większego zużycia pamięci, można sprawdzić węzły od lewej do prawej, od góry do dołu (tak jak angielski kolejności czytania) i zatrzymują się na pierwszym liściem znaleźć.

Odpowiedział 28/08/2009 o 05:20
źródło użytkownik

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