Jak skonstruować drzewo, biorąc pod uwagę jego kolejność w przedsprzedaży i przedpremierowy? Po prostu szukam skutecznego algorytmu.Skonstruuj drzewo
Odpowiedz
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ź:
Niechp_1
,p_2
...
p_n
być przechodzenie postorder i niechi_1
,i_2
...
i_n
być przechodzenie inorder. Z przechodzenia przez pocztę wiemy, że korzeniem drzewa jestp_n
. Znajdź ten element w nieprzekraczalnej kolejności, na przykład:i_1
,i_2
...
i_k-1
p_n
i_k+1
...
i_n
. Z przechodzenie inorder znaleźć wszystkie tji_1
,i_2
...
i_k-1
aw prawym poddrzewie, tji_k+1
...
i_n
odpowiednio elementy w lewym poddrzewie,.Usuń element
p_n
(i elementi_k
==
p_n
). Znajdź skrajną prawą elementup_j
wp_1
,p_2
...
p_j
...
p_n-1
gdziep_j
jest elementemi_1
,i_2
...i_k-1
. To jest korzeń lewego poddrzewu oryginalnego drzewa. Podziałp_1
,p_2
...
p_j
ip_j+1
...p_n-1
ii_1
,i_2
...
i_k-1
ii_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!
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
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.
Cóż, rekurencyjnie. Mam nadzieję, że nie jesteś moim uczniem. –
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
http://forums.devshed.com/software-design-43/finding-binary-tree-from-inorder-and-preorder-traversals-151147.html – Heinzi