Metoda preorder odwiedza węzły w następującej kolejności:
- najpierw korzeń,
- potem lewe skrajne poddrzewo,
- potem prawe skrajne poddrzewo.
- najpierw lewe skrajne poddrzewo,
- potem prawe skrajne poddrzewo,
- i na końcu korzeń.
- najpierw lewe skrajne poddrzewo,
- potem korzeń,
- potem prawe skrajne poddrzewo.
preorder: Adam Ewa Jurek Max Iza Jarek Iwona Marta Rafał Ola postorder: Jurek Max Iza Ewa Iwona Jarek Rafał Ola Marta Adam
Gdybyśmy utworzyli drzewo binarne z następującą strukturą (takie drzewo nazywane jest drzewem wyrażeń arytmetycznych):
Node<String> korzen = new Node<String>(null, "*"); Node<String> n1 = korzen.addChild("+"); Node<String> n2 = korzen.addChild("-"); n1.addChild("7"); n1.addChild("3"); n2.addChild("6"); n2.addChild("2"); Tree<String> drzewo = new Tree<String>(korzen);
to przejście przez wszystkie jego elementy wyglądałoby w następujący sposób:
preorder: * + 7 3 - 6 2 postorder: 7 3 + 6 2 - * Inorder: 7 + 3 * 6 - 2
Jak łatwo zauważyć dla drzew zawierających wyrażenia arytmetyczne poszczególne metody odwiedzania węzłów odpowiadają odpowiedniej notacji. Preorder to notacja prefiksowa (notacja polska), postorder to notacja postfiksowa (odwrotna notacja polska), a inorder to zwykła notacja infiksowa.
Poniżej trzy metody rekurencyjne realizujące poszczególne sposoby trawersowania drzewa (umieszczamy je w ciele klasy Tree<T> z poprzedniego postu).
/** * Metody trawersowania drzewa * @author kodatnik.blogspot.com */ // metoda wyświetla węzły w kolejności preorder public void preOrder(Node<T> n) { //najpierw korzeń System.out.print(n + " "); // potem lewe skrajne poddrzewo, a później prawe Node<T> temp = n.getLeftMostChild(); while (temp != null) { preOrder(temp); temp = temp.getRightSibling(); } } // metoda wyświetla węzły w kolejności postorder public void postOrder(Node<T> n) { // najpierw lewe skrajne poddrzewo, potem prawe Node<T> temp = n.getLeftMostChild(); while (temp != null) { postOrder(temp); temp = temp.getRightSibling(); } // na końcu korzeń System.out.print(n + " "); } // metoda wyświetla węzły w kolejności inorder public void inOrder(Node<T> n) { if (n.isLeaf()) System.out.print(n + " "); else { // najpierw lewe skrajne poddrzewo Node<T> temp = n.getLeftMostChild(); inOrder(temp); // potem korzeń System.out.print(n + " "); // potem prawe temp = temp.getRightSibling(); while (temp != null) { inOrder(temp); temp = temp.getRightSibling(); } } }Mając już opanowane sposoby "chodzenia" po drzewie możemy zastanowić się nad prezentacją jego struktury na ekranie. To wszystko już w następnym poście.
4 Komentarze - Trawersowanie drzewa - metody preorder, postoder i inorder
Dobre !
dzięki, świetne porady!!! z wykładu miałem samą implementację bez wyjaśnień, więc w sam raz
popieram, świetny materiał, dzisiaj poszedłem z widza stąd zadanie 4 punkty na 5, bo popsułem ostatni liść (nie w tą stronę napisałem)
fachowy blog
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)