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.
.jpg)


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 :)