2015-04-17 12 views
6

Czytam łamanie wywiadu kodowania i mam pytanie dotyczące rozwiązania następującego problemu: Masz dwa bardzo duże drzewa binarne: T1, z milionami węzłów, i T2, z setkami węzłów. Utwórz algorytm, aby zdecydować, czy T2 jest poddrzewem T1.Algorytmy do określenia, czy drzewo jest poddrzewem innego drzewa

Najprostszym rozwiązaniem, które sugeruje, jest utworzenie ciągu znaków reprezentującego nieregularne i poprzedzające zamówienia ruchy i sprawdzenie, czy przemieszczenie T2 w kolejności/kolejności w kolejności jest podciąganiu w kolejności T1 w kolejności.

Zastanawiam się, dlaczego potrzebujemy porównać obie traversale? I dlaczego dokładnie te dwie traversale, dlaczego nie na przykład w kolejności i po zamówieniu. A przede wszystkim wystarczy nie tylko jedno przejście? Powiedzieć tylko traversal w kolejności lub w przedsprzedaży?

+2

Najpierw wyjaśnijmy, co masz na myśli przez "podtekst". Standardowe znaczenie teoretyczno-graficzne byłoby "pod-grafem utworzonym przez usunięcie zer lub więcej wierzchołków i krawędzi z drzewa, a które samo jest drzewem" - ale jest jeszcze inne powszechnie używane znaczenie, mianowicie "usuń krawędź", 2 połączone komponenty pozostać, z których oba są poddresami ". Ta pierwsza definicja obejmuje niektóre drzewa, których ta druga nie. –

+2

Co ciekawe, algorytm, który podałeś, nie zadziała dla pewnych sensownych definicji "poddrzew": jako matematyk nazwałbym 2 <-1-> 3 poddrzewo 4 <-2<-1-> 3-> 5. Ale preorder pierwszego nie jest podciągiem drugiego. – Joel

+0

Kiedy mówisz "Drzewo binarne", czy możemy założyć, że są one "drzewem binarnym wyszukiwania" (tzn. Rodzic jest mniejszy od któregokolwiek z jego dwójki dzieci)? Czy wartości w węzłach są unikalne w każdym drzewie, czy też nie? –

Odpowiedz

3

Jedno przemieszczenie nie wystarczy. Rozważmy wykresy 1-> 2-> 3 i 2 < -1-> 3. Jeśli zaczniesz od węzła 1 i wykonasz przemierzanie, natrafisz na węzły w kolejności 1, 2, 3. Jeśli po prostu utworzysz łańcuch pokazujący zamówienie w przedsprzedaży, dasz taki sam wynik: 1,2,3

Z drugiej strony strony, jeśli używasz post-order, wtedy dwa dadzą inny wynik. 3,2,1 i 2,3,1

Założę się o jedno zamówienie, możesz znaleźć dwa różne drzewa z tym samym wynikiem.

Pytanie, na które należy odpowiedzieć dla jakiejkolwiek innej pary, na którą chcesz spojrzeć, brzmi: czy istnieje drzewo, które dałoby tę samą kolejność dla obu przejazdów? Zamierzam zostawić to jako coś do przemyślenia i wrócić później, aby sprawdzić, czy je masz.

0

Myślę, że preorder traversal z wartownika do reprezentowania węzła zerowego jest wystarczający. możemy użyć tego podejścia do serializacji/deserializacji drzewa binarnego. Oznacza to, że jest to odwzorowanie typu "jeden do jednego" między drzewem binarnym a jego preorderową + wartowniczą reprezentacją.

Po otrzymaniu strun dla małego drzewa i dużego drzewa. następnie robimy dopasowanie łańcuchowe za pomocą algorytmu kmp.

Wiem, że ludzie mówią, że musimy używać zarówno w przedsprzedaży, jak i w zamówieniu (lub w zamówieniach i zamówieniach). ale większość z nich podąża za tym, co mówią inni, zamiast myśleć samodzielnie.