2010-02-02 11 views
5

Jak skonstruować drzewo, biorąc pod uwagę jego kolejność w przedsprzedaży i przedpremierowy? Po prostu szukam skutecznego algorytmu.Skonstruuj drzewo

+6

Cóż, rekurencyjnie. Mam nadzieję, że nie jesteś moim uczniem. –

+2

Potrzebuję wyjaśnienia. Jaki jest format danych wejściowych? Czy drzewo jest zrównoważone? Co rozumiesz przez sprawność (Ordo (x) lub po prostu "nie strasznie szalony"). Jaką strukturę chcesz zbudować? Drzewo jako obiekty połączone lub drzewo za pomocą tablicy. – ron

+1

http://forums.devshed.com/software-design-43/finding-binary-tree-from-inorder-and-preorder-traversals-151147.html – Heinzi

Odpowiedz

4

rażące kopiowania i wklejania z Sun's (Oracle now, I guess...) forum:

Pytanie:
Czy ktoś może mi pomóc w jaki sposób skonstruować drzewo binarne z Inorder i postorder z przechodzenia, chcę tylko wiedzieć algorytm tak że mogę go zastosować.

Odpowiedź:
Niech p_1, p_2...p_n być przechodzenie postorder i niech i_1, i_2...i_n być przechodzenie inorder. Z przechodzenia przez pocztę wiemy, że korzeniem drzewa jest p_n. Znajdź ten element w nieprzekraczalnej kolejności, na przykład: i_1, i_2...i_k-1p_ni_k+1...i_n. Z przechodzenie inorder znaleźć wszystkie tj i_1, i_2...i_k-1 aw prawym poddrzewie, tj i_k+1...i_n odpowiednio elementy w lewym poddrzewie,.

Usuń element p_n (i element i_k==p_n). Znajdź skrajną prawą elementu p_j w p_1, p_2...p_j...p_n-1 gdzie p_j jest elementem i_1, i_2 ... i_k-1. To jest korzeń lewego poddrzewu oryginalnego drzewa. Podział p_1, p_2...p_j i p_j+1 ... p_n-1 i i_1, i_2...i_k-1 i i_k+1...i_n. Teraz masz dwie podsekwencje reprezentujące pocztowe i nieruchome przejście dwóch drzewek drzewa oryginalnego .

Autor: JosAH.

Zaimplementowałam algorytm po wykonaniu instrukcji Jos'a i działał idealnie!

+0

Za mało czasu zajmuje znalezienie najbardziej prawego elementu p_j w p_1 ~ p_n-1, gdy jest on również w i_1 ~ i_k-1. Zajmuje czas O (n^2). Właściwie po usunięciu p_n i znalezieniu jego pozycji w i_1 ~ i_n. Znamy już pozycję p_j. Dzieje się tak, ponieważ znamy już liczbę węzłów w lewym i prawym poddrzewie, które można uzyskać przez zliczanie elementów po p_n w i_1 ~ i_n. Dzięki temu możemy łatwo znaleźć miejsce do podziału p_1 ~ p_n-1 – ibread

1

Ponieważ to praca domowa, nie udzielę ci pełnej odpowiedzi, ale mam nadzieję, że wystarczy, abyś się przeprowadził.

Wyobraź sobie, że masz przedsprzedaż w przedsprzedaży, np. this.

Przejście daje 2-7-2-6-5-11-5 ... itd. Zwróć uwagę, że 5 jest właściwie właściwym dzieckiem korzenia.

Oczywiście, nie można tego stwierdzić po prostu patrząc na liczby, więc albo zostaniesz poinformowany o strukturze drzewa, albo musisz przechowywać dodatkowe dane (np. Czy węzeł jest po lewej stronie dziecko lub prawe dziecko, na przykład).

Parsowanie drzewa to po prostu funkcja rekursywna, która przejmuje preorder jako wejście (pomyśl o swoim zasięgu podczas przekazywania sygnału wejściowego). Jak już wspomniałem wcześniej, Twoje wstępne przejście powinno zawierać dodatkowe dane.


Wydajność:

rozważyć, ile razy każdy węzeł jest odwiedzana podczas budowania tego drzewa, ale również rozważyć operację odczytu wejścia. Czy istnieje sposób na reorganizację danych wejściowych szybciej niż można zbudować drzewo? Jaką strukturę musiałbyś użyć, jeśli potrzebujesz manipulować danymi.


W Porządku: Będziesz potrzebować tego samego pomysłu, aby przejść przez to, więc nie będę go omawiać. Jestem pewien, że ktoś inny będzie, jeśli jesteście zdesperowani.