Które kombinacje sekwencjonowania przed, po i w kolejności są wyjątkowe?

28

Znamy się na zamówieniu,

post L(x)     => [x]
post N(x,l,r) => (post l) ++ (post r) ++ [x]

i w przedsprzedaży

pre L(x)     => [x]
pre N(x,l,r) => [x] ++ (pre l) ++ (pre r)

oraz w kolejności przechodzenia lub. sekwencjonowanie.

in L(x)     => [x]
in N(x,l,r) => (in l) ++ [x] ++ (in r)

Łatwo zauważyć, że żadne z nich nie opisuje jednoznacznie danego drzewa, nawet jeśli przyjmiemy odrębne pary kluczy / etykiet.

Których kombinacji tych trzech można użyć do tego celu, a które nie?

Pozytywne odpowiedzi powinny obejmować (wydajny) algorytm do rekonstrukcji drzewa oraz dowód (pomysł), dlaczego jest on poprawny. Negatywne odpowiedzi powinny dawać kontrprzykłady, tj. Różne drzewa, które mają tę samą reprezentację.

Raphael
źródło

Odpowiedzi:

16

Najpierw założę, że wszystkie elementy są różne. Żadna ilość sekwencjonowania nie powie ci o kształcie drzewa z elementami [3,3,3,3,3]. Oczywiście można zrekonstruować niektóre drzewa ze zduplikowanymi elementami; Nie wiem, jakie istnieją wystarczające warunki.

Kontynuując negatywne wyniki, nie można w pełni odbudować drzewa binarnego na podstawie samej sekwencjonowania przed i po zamówieniu. [1,2]zamówienie przedpremierowe [2,1]musi być 1u podstawy, ale 2może być lewym dzieckiem lub prawym dzieckiem. Jeśli nie obchodzi Cię ta dwuznaczność, możesz zrekonstruować drzewo za pomocą następującego algorytmu:

  • Niech będzie przejściem przed zamówieniem, a będzie przejściem po zamówieniu. Musimy mieć , a to jest korzeń drzewa.[x1,,xn][yn,,y1]x1=y1
  • x2 jest na lewo potomkiem katalogu głównego, a jest skrajnie na prawo dzieckiem. Jeśli , węzeł główny jest jednoargumentowy; przechodź przez i aby zbudować pojedyncze poddrzewo.y2x2=y2[x2,,xn][yn,,y2]
  • W przeciwnym razie, niech i być wskaźniki takie, że i . to przejście w lewym poddrzewie w przedsprzedaży, w prawym poddrzewie i podobnie w przypadku przejścia po zamówieniu. Lewe poddrzewa ma elementy , a prawe poddrzewa ma elementy . Powtórz raz dla każdego poddrzewa. Nawiasem mówiąc, ta metoda uogólnia na drzewa z dowolnym rozgałęzieniem. W przypadku dowolnego rozgałęzienia sprawdź zasięg lewego poddrzewa i odetnij jego elementy z obu list, a następnie powtórz, aby odciąć drugie poddrzewo od lewej i tak dalej.ijx2=yiy2=xj[x2,,xj1][xj,,xn]j2=ni+1i2=nj+1
    j2

Jak wspomniano, czas działania wynosi z najgorszym przypadkiem (w przypadku dwojga dzieci przeszukujemy każdą listę liniowo). Możesz zmienić to w jeśli wstępnie przetworzysz listy, aby zbudować skończoną strukturę mapy od wartości elementów do pozycji na listach wejściowych . Użyj także tablicy lub mapy skończonej, aby przejść od indeksów do wartości; trzymaj się globalnych indeksów, aby rekursywne połączenia otrzymywały całe mapy i przyjmowały zasięg jako argument, aby wiedzieć, na czym należy działać.O(n2)Θ(n2)O(nlg(n))nlg(n)

Korzystając z przejścia w przedsprzedaży i przejścia w kolejności , możesz odbudować drzewo w następujący sposób:[x1,,xn][z1,,zn]

  • Rdzeń jest głową przejścia w przedsprzedaży .x1
  • Niech będzie indeksem takim, że . Zatem to przejście w kolejności lewego dziecka, a to przejście w kolejności prawego dziecka. Po liczbie elementów, jest przejściem w lewo lewego dziecka i tego prawego dziecka. Powtórz, aby zbudować lewe i prawe poddrzewa.kzk=x1[z1,,zk1][zk+1,,zn][x2,,xk][xk+1,,xn]

Ponownie, tym algorytmem jest jak podano, i można go wykonać w jeśli lista jest wstępnie przetwarzana w skończoną mapę od wartości do pozycji.O(n2)O(nlg(n))

Zamówienie po zamówieniu i zamówienie jest oczywiście symetryczne.

Gilles „SO- przestań być zły”
źródło
Czy jest tu literówka: „[1,2] przedsprzedaż, [1,2] post-order musi mieć 1 w katalogu głównym, ale 2 może być lewym dzieckiem lub prawym dzieckiem.” Kolejność postu takiego drzewo byłoby [2,1], a nie [1,2], czy 2 jest lewym czy prawym dzieckiem. Czy masz również na myśli, że jeśli podano zarówno zamówienie w przedsprzedaży, jak i w postorder, nie możemy zrekonstruować drzewa, czy masz na myśli, że jeśli otrzymamy tylko jedno z nich, to nie możemy odtworzyć drzewa?
CEGRD,
@CEGRD Rzeczywiście, postorder był literówką. Przykład pokazuje, że w tym przypadku nie można w pełni zrekonstruować drzewa: nie możesz wiedzieć, czy 2jest to lewe, czy prawe dziecko. Odpowiada to przypadkowi „pojedynczego poddrzewa” algorytmu rekonstrukcji.
Gilles „SO- przestań być zły”
jak to się zmienia, jeśli wiemy, że jest to drzewo wyszukiwania binarnego? dla prostego przypadku w twoim przykładzie ([1,2] przedsprzedaż, [2,1] po zamówieniu) moglibyśmy ustalić, że root to 1 i że 2 jest właściwym dzieckiem (ponieważ 2 jest większe niż 1) ... dobrze?
fersarr