Z hlediska teorie grafů je stromem každý souvislý graf bez kružnic o hranách. Jedná se o hierarchickou strukturu, kde každý má otec 0 až mnoho dětí a každé dítě právě jednoho otce takovým způsobem, že v této struktuře nejsou cykly. Uzel, který je praotcem všech ostatních uzlů nazveme kořenem (z pohledu teorie grafů tím vytvoříme orientovaný strom). Uzel, který nemá žádné potomky nazýváme listem. Být stromem je rekurzívní vlastnost - každý podstrom stromu S je také stromem. Strom je velmi populární pro svoji jednoduchost a použitelnost. Příkladem mohou být vyhledávací stromy nebo haldy.
Vlastnosti stromu
N-arita - Kolik smí mít každý uzel maximálně potomků, z tohoto hlediska patří mezi neoblíbenější binární stromy (každý uzel má 0, 1 nebo 2 potomky).
Hloubka - Hloubkou rozumíme maximální hloubku libovolného uzlu (kořen je v hloubce 0, potomci v hloubce 1, vnuci v hloubce 2...).
Pravidelnost - N-ární strom je pravidelný, pokud má každý uzel 0 nebo N potomků.
Vyváženost - N-ární strom je vyvážený, pokud pro všechny listy platí, že jsou nejsou o nic více hlouběji, než kterýkoliv jiný list. Definice „o nic více hlouběji“ se liší v závislosti na konkrétní implementaci.
Úplná pravidelnost - Úplným N-árním pravidelným stromem hloubky k je strom, jehož každý uzel má 0 nebo N potomků a všechny uzly jsou ve hloubce k.
Průchody binárním stromem
Preorder - zpracuje se napřed kořen, poté levý podstrom a nakonec pravý podstrom.
Inorder - zpracuje se napřed levý podstrom, poté kořen a nakonec pravý podstrom.
Postorder - zpracuje se napřed levý podstrom, poté pravý podstrom a nakonec kořen.
Kód
01.
/**
02.
* N-arni strom
03.
* @author Pavel Micka
04.
*/
05.
public
class
Tree {
06.
/**
07.
* Kolekce potomku
08.
*/
09.
private
ArrayList<Tree> children;
10.
/**
11.
* Hodnota uchovavana v uzlu
12.
*/
13.
private
Object value;
14.
/**
15.
* Prida podstrom jako potomka tohoto korene
16.
* @param t strom k pridani
17.
* @param index poradi potomka
18.
*/
19.
public
void
addChild(Tree t,
int
index){
20.
children.add(index, t);
21.
}
22.
/**
23.
* Odstrani potomka na danem indexu
24.
* @param index index potomka k odstraneni
25.
*/
26.
public
void
removeChild(
int
index){
27.
children.remove(index);
28.
}
29.
/**
30.
* Vrati potomka na danem indexu
31.
* @param index poradi potomka
32.
* @return potomek na zadanem indexu
33.
*/
34.
public
Tree get(
int
index){
35.
return
children.get(index);
36.
}
37.
/**
38.
* @return the value
39.
*/
40.
public
Object getValue() {
41.
return
value;
42.
}
43.
/**
44.
* @param value the value to set
45.
*/
46.
public
void
setValue(Object value) {
47.
this
.value = value;
48.
}
49.
}