To właściwie drzewo binarne. Drzewo binarne to drzewo, na którym każdy węzeł ma co najwyżej dwoje dzieci węzłów. Jeśli węzeł ma tylko jeden węzeł dziecięcy, węzeł ten powinien być wykonany w lewym węźle. Jeśli ma oba dzieci, jest lewy węzeł i prawy węzeł.
Słownictwo drzewne
Wyjaśnienie przemieszczania drzewa odbywa się za pomocą słownictwa drzewnego.
Węzeł główny: Każdy węzeł w drzewie ma rodzica, z wyjątkiem węzła głównego.
Węzły liściowe: Zakończone węzły to węzły liściowe. Węzeł liściowy nie ma dziecka.
Klucz: To jest wartość węzła. Może to być prymitywna wartość typu danych lub znak. Może to być również operator, e.G., + OT - .
Poziomy: Drzewo jest zorganizowane na poziomy, z węzłem głównym na pierwszym poziomie. Węzły można wyobrazić się na poziomach poziomych. Powyższe drzewo ma cztery poziomy.
Węzeł nadrzędny: Węzeł główny jest jedynym węzłem, który nie ma rodzica. Każdy inny węzeł ma węzeł nadrzędny.
Węzły rodzeństwa: Dzieci dowolnego konkretnego węzła to węzły rodzeńskie.
Ścieżka: Ścieżka to ciąg węzłów i ich pojedynczych gałęzi.
Węzeł przodka: Wszystkie wyższe węzły połączone z dzieckiem, w tym rodzic i węzeł główny, są węzłami przodków.
Węzeł potomka: Wszystkie dolne węzły, podłączone do konkretnego węzła, w dół do podłączonych liści, są potomkami. Węzeł, o którym mowa, nie jest częścią potomnych węzłów. Węzłem, o którym mowa, nie musi być węzłem głównym.
Przejście: Węzeł plus wszystkich jego potomków, aż do powiązanych liści, tworzą poddrzew. Węzeł początkowy jest uwzględniony i nie musi to być root; W przeciwnym razie byłoby to całe drzewo.
Stopień: Węzeł drzewa binarnego może mieć jedno lub dwoje dzieci. Jeśli węzeł ma jedno dziecko, jego stopień jest jednym. Jeśli ma dwoje dzieci, jego stopień jest dwa.
W tym artykule wyjaśniono, jak przejść przez drzewo binarne w sposób w przedsprzedaży, używając języka Java.
Treść artykułu
Model Traversal
Zamówienia
Najmniejszy typowy pod-drzewo drzewa binarnego składa się z węzła macierzystego i dwojga węzłów dzieci. Węzły dziecięce są rodzeństwem złożonym z lewego węzła dziecięcego i prawego węzła dziecięcego. Prawidłowy węzeł dziecięcy może być nieobecny.
Przed Sprzedaż
Węzeł nadrzędny jest odwiedzany najpierw z tą kolejnością, a następnie lewy węzeł, a następnie prawy węzeł. Jeśli lewy węzeł ma własny poddrzewa, wszystkie węzły poddani zostaną odwiedzone najpierw przed odwiedzeniem prawego węzła. Jeśli właściwy węzeł ma własne poddrzewa, wówczas wszystkie jego poddrzewa zostanie odwiedzone wreszcie. Podczas wizyty w poddrzew, przed każdym trójkątem trzech węzłów przestrzega się schemat. Jeśli węzeł ma tylko jedno dziecko, co oznacza, że nie ma prawdziwego trójkąta, jedyne dziecko należy uznać za lewy węzeł, podczas gdy prawy węzeł jest nieobecny.
Po zamówieniu
Lewy węzeł jest odwiedzany najpierw z tą kolejnością, następnie prawym węzłem, a następnie węzłem nadrzędnym. Jeśli lewy węzeł ma własny poddrzewa, wszystkie węzły poddani zostaną odwiedzone najpierw przed odwiedzeniem prawego węzła. Jeśli właściwy węzeł ma własny poddrzewa, wówczas wszystkie jego poddrzewa zostanie odwiedzone po drugie przed odwiedzeniem rodzica. Podczas wizyty w poddrzew, po każdym trójkącie trzech węzł.
W celu
Lewy węzeł jest odwiedzany najpierw w tej kolejności, a następnie węzeł nadrzędny, a następnie prawy węzeł. Jeśli lewy węzeł ma własny poddrzewa, wszystkie węzły poddani zostaną odwiedzone najpierw przed odwiedzeniem węzła nadrzędnego. Jeśli właściwy węzeł ma własne poddrzewa, wówczas wszystkie jego poddrzewa zostanie odwiedzone wreszcie. Podczas wizyty w poddrzew, dla każdego trójkąta trzech węzłów śledzony jest schemat prawej.
W tym artykule ilustruje tylko schemat zamówienia w przedsprzedaży.
Rekurencja lub iteracja
Schemat zamówienia w przedsprzedaży można wdrożyć za pomocą Recursion lub iteracji. W tym artykule ilustrują jedyną rekurencję.
Zilustrowane podejście do przejścia
W tym artykule stosuje się schemat i rekurencję w przedsprzedaży. Powyższy schemat zostanie użyty. Schemat został tutaj przełączony tutaj, aby uzyskać łatwe odniesienie:
W tej sekcji ten schemat służy do wyświetlania sekwencji wartości (liter), które są wyświetlane (dostęp), przy użyciu schematu i rekurencji w przedsprzedaży i rekurencji. Litery a, b, c itp., to wartości (klucze) różnych węzłów.
W przedsprzedaży dostęp do drzewa rozpoczyna się od korzenia. Więc a jest dostęp. A ma dwoje dzieci: B (po lewej) i C (po prawej). W przedsprzedaży jest prawica dla rodziców. Dostęp do B jest następny. Gdyby B nigdy nie miał dzieci, to C byłby dostępny w następnym. Ponieważ B ma dzieci: D (po lewej) i e (po prawej), lewe dziecko musi być dostępne w następnej kolejności. Przypomnij sobie, że w przedsprzedaży jest prawica dla rodziców. Po uzyskaniu dostępu do rodzica, jego lewe dziecko, D, należy uzyskać dostęp do następnego, zgodnie z Parent-LeftCild-Rightchild.
Trójkąt dla węzła nadrzędnego, B, to BDE. W tym trójkącie właśnie uzyskano dostęp do węzła, a następnie węzła lewego dziecka. Dostęp do wszystkich węzłów trójkąta musi zostać ukończony najpierw. Tak więc następnym węzłem, do którego należy uzyskać dostęp.
Teraz trójkąt BDE to poddrzewa, która jest prowadzona przez węzeł B. W tym momencie włączono do niego węzeł B i jego trójkąt. Węzeł B jest lewym dzieckiem węzła A. Dostęp do węzła B i jego poddrzewa zostały właśnie zakończone. Po lewej stronie rodzica, po lewym dziecku, dostęp do węzła B, należy uzyskać dostęp do prawego dziecka rodzica A, C,.
Trójkąt, który prowadzi C, to CFG. C jest rodzicem, F jest lewym dzieckiem, a G jest właściwym dzieckiem. Tak więc, gdy tylko C zostanie dostępny, należy uzyskać dostęp do reguły prawicowej. F ma również dziecko, h. Tak więc, gdy tylko uzyskano dostęp do F, jego lewicowe dziecko musi uzyskać dostęp do prawej reguły.
Następnie F i jego poddrzewa byłyby całkowicie dostępne. W tym momencie nie byłoby kwestionowania ponownego dostępu do F. F jest lewym dzieckiem C, które ma prawe dziecko, g. Po tym, jak lewe dziecko, F całkowicie dostępny jest, prawe dziecko, G, należy następnie uzyskać dostęp do prawej reguły.
I tak sekwencja dostępu wynosi: Abdecfhg.
Zajęcia Java
Drzewo jest tutaj ponowne przesyłane tutaj, aby uzyskać łatwe odniesienie:
Węzeł
litera) węzła. Powinien mieć również dwie inne właściwości o nazwie lewy i prawy. Lewej właściwości otrzyma węzeł dziecięcy, jeśli węzeł ma lewe dziecko. Właściwą właściwość zostanie przypisana węzłem „a”, jeśli węzeł ma właściwe dziecko „a”.
Klasa węzłów potrzebuje konstruktora, który utworzy obiekt węzła i przypisuje wartość do klucza. Kod dla klasy to:
Węzeł klasy
Char Key;
Węzeł lewy, prawy;
Node public (wartość char)
key = wartość;
lewy = prawy = null;
Kiedy węzeł jest właśnie utworzony, nie ma dziecka. Dlatego lewe i prawe właściwości są przypisane zerowe. W metodzie Main (), jeśli dany węzeł ma lewe dziecko, dziecko zostanie utworzone i przypisane do lewej właściwości konkretnego węzła. Jeśli dany węzeł ma odpowiednie dziecko, dziecko zostanie utworzone i przypisane do właściwej właściwości konkretnego węzła.
Klasa drzewa
Kod dla klasy drzew jest:
klasa BinaryTree
Korzeń węzła;
BinaryTree ()
root = null;
Klasa drzewa wskazuje korzeń. Ma właściwość o nazwie root, która jest dla węzła głównego. Ma konstruktor bez żadnych parametrów. Ten konstruktor przypisuje NULL do korzenia. Kiedy drzewo jest właśnie tworzone, nie ma węzła i dlatego korzeń właściwości jest zerowa. Pierwszy utworzony węzeł będzie węzłem głównym i zostanie przypisany do tej właściwości, root. Stamtąd drzewo wzrośnie w metodzie Main () (patrz poniżej).
Klasa BinaryTree ma metody, w przedsprzedaż () i main () patrz poniżej.
Metoda zamówienia w przedsprzedaży
To jest rdzeń programu, chociaż metoda main () jest również ważna. Metoda zamówienia w przedsprzedaży implementuje zasadę Parent-Leftchild-Rightchild. To jest funkcja rekurencyjna, której kodem jest:
void w przedsprzedaży (węzeł węzły)
if (node == null)
powrót;
// Uzyskaj dostęp do węzła nadrzędnego
System.na zewnątrz.Drukuj (węzeł.klucz + "->");
// Dostęp do lewego dziecka
W przedsprzedaży (węzeł.lewy);
// Dostęp do właściwego dziecka
W przedsprzedaży (węzeł.Prawidłowy);
Na końcu przejścia drzewa żaden węzeł nie przejdzie, więc wartość dowolnego węzła będzie null. To uwzględnia pierwszą instrukcję w funkcji w przedsprzedaży. Druga instrukcja drukuje klucz bieżącego węzła. Trzecie stwierdzenie przypomina tę samą funkcję w przedsprzedaży z lewym węzłem dziecięcym. Następne i ostatnie stwierdzenie przypomina funkcję zamówienia w przedsprzedaży z odpowiednim węzłem dziecięcym. W ten sposób całe drzewo jest przemierzane.
Wyświetlając sekwencję, a-> b-> d, po dostępie do B, „Wymień w przedsprzedaży (węzeł.po prawej) ”jest wymagane do węzła C, ale zastrzeżone. Po uzyskaniu dostępu do „Wymień w przedsprzedaży (węzeł.po prawej) ”jest wymagane do węzła E. Wezwanie do węzła C, które zostało zarezerwowane, jest następnie wykonywane. To wyjaśnienie dotyczy odpowiedniej gałęzi całego drzewa.
I tak sekwencja wyjściowa powinna być: a-> b-> d-> e-> c-> f-> h-> g .
Metoda główna ()
Główna metoda buduje drzewo, przypisując nowe węzły do swoich kluczy do właściwości węzła nadrzędnego. Po pierwsze, powstaje puste drzewo. Na końcu metody main () metoda zamówienia w przedsprzedaży jest wywoływana raz. Ponieważ jest to funkcja rekurencyjna, będzie nadal wzywać, dopóki całe drzewo nie zostanie przemierzone. Kod to:
public static void main (string [] args)
// Utwórz obiekt drzewa bez żadnego węzła
BinaryTree Tree = new BinaryTree ();
// Utwórz węzły dla drzewa
drzewo.root = nowy węzeł („a”);
drzewo.źródło.Left = nowy węzeł („B”);
drzewo.źródło.right = nowy węzeł („c”);
drzewo.źródło.lewy.Left = nowy węzeł („D”);
drzewo.źródło.lewy.right = nowy węzeł („e”);
drzewo.źródło.Prawidłowy.Left = nowy węzeł („f”);
drzewo.źródło.Prawidłowy.right = nowy węzeł („g”);
drzewo.źródło.Prawidłowy.lewy.left = nowy węzeł („h”);
// Przemierzanie drzewa w przedsprzedaży
System.na zewnątrz.println („Przejazd w przedsprzedaży”);
drzewo.W przedsprzedaży (drzewo.źródło);
System.na zewnątrz.println ();
Wszystkie powyższe kody można zamontować w jednym programie do testowania.
Wyjście to:
A-> b-> d-> e-> c-> f-> h-> g->
Ostatnie -> można zignorować.
Wniosek
Binary Tree Preversal w Javie, który wykorzystuje Recursion, ma dwie klasy. Ma klasę węzłów i klasę binarytree. Klasa węzłów ma właściwość dla klucza. Ma również dwie właściwości węzłów dla lewego węzła dziecięcego i prawego węzła dziecięcego. Klasa BinaryTree ma dwie metody: metodę w przedsprzedaży () i metodę main (). Metoda w przedsprzedaży () implementuje rekurencyjnie schemat prawid-letchild-leftchild. Metoda main () buduje drzewo, przypisując nowe węzły z klawiszami jako lewe i prawe dzieci do węzłów nadrzędnych.
Problem z algorytmem rekurencyjnym dla zamówienia w przedsprzedaży polega na tym, że jeśli drzewo jest zbyt duże, pamięć może stać się krótka. Aby rozwiązać ten problem, użyj algorytmu iteracyjnego - patrz później.