Předchozí ukázka převodu stromu na text byla typickým příkladem průchodu stromem, při němž začneme kořenem stromu a postupně procházíme v určitém stanoveném pořadí jeho uzly a v každém provedeme nějakou akci. V principu můžeme u binárního stromu definovat tři typy průchodů v závislosti na tom, ve kterém okamžiku stanovenou akci provedeme:
Kontrolní otázka: Který z těchto průchodů jsme použili při převodu stromu na text?
Volba typu průchodu vždy závisí na konkrétním algoritmu. Pokud nám nezáleží na pořadí, ve kterém se budou uzly stromu zpracovávat, můžeme v podstatě zvolit libovolný typ průchodu - např. pokud bychom chtěli pouze zjistit počet uzlů stromu, určit jeho výšku nebo sečíst hodnoty ve všech uzlech.
Pokusíme se nejprve realizovat algoritmus, který pouze vytvoří seznam obsahující všechny hodnoty uložené v jednotlivých uzlech jako data. Vytvoříme tedy metodu traverse(), kterou zavoláme vždy na kořenový uzel stromu a které dodáme jako parametr příznak určující jeden ze tří výše uvedených typů průchodů:
public static final int PREORDER = 1;
public static final int INORDER = 2;
public static final int POSTORDER = 3;
public List traverse(int order)
{
List list = new ArrayList();
traverse(list, order);
return list;
}
private void traverse(List list, int order)
{
if( order == PREORDER ) list.add(_data);
if( _left != null ) _left.traverse(list, order);
if( order == INORDER ) list.add(_data);
if( _right != null ) _right.traverse(list, order);
if( order == POSTORDER ) list.add(_data);
}
Pro označení typu průchodu jsme si zavedli konstanty PREORDER, INORDER a POSTORDER. Jak poznáme, že jde o konstanty? V jazyce Java musí být nepříliš názorně označeny atributy static a final. Seznam, do něhož budeme data postupně ukládat, je instancí třídy ArrayList. Můžeme zde využít implementace seznamu z předchozí kapitoly, ale v praxi budeme spíš využívat tříd, které jsou standardní součástí každé instalace prostředí Java. V tom případě ale nezapomeňte na začátek zdrojového textu doplnit příkazy pro dovoz balíku java.util, v němž jsou třídy Iterator, List a ArrayList definovány:
Import java.util.Iterator; import java.util.List; import java.util.ArrayList;nebo jednodušeji příkazem
import java.util.*;jenž ovšem doveze i všechny další třídy z tohoto balíku.
V odstavci věnovaném kolekcím a iterátorem jsme si ukázali použití rozhraní Command pro zpracování všech prvků v seznamu. Podobným způsobem můžeme řešit i procházení stromem. Stačí do třídy TreeNode doplnit následující metodu forAll():
public void forAll(Command command, int order)
{
if( order == PREORDER ) command.execute(_data);
if( _left != null ) _left.forAll(command, order);
if( order == INORDER ) command.execute (_data);
if( _right != null ) _right. forAll(command, order);
if( order == POSTORDER ) command.execute (_data);
}
Použití si opět ukážeme na příkladu.