tree traversal
Főnév
tree traversal (tsz. tree traversals)
Egy bináris vagy általános fán a bejárás (traversal) során valamennyi csomópontot sorra felkeresünk és valamilyen műveletet végzünk az adatokon. A bejárási algoritmusoknak több típusa van, amelyek különféle sorrendet biztosítanak. Három alapvető, rekurzív binárisfa-bejárási stratégia létezik:
1. Preorder (Előrendű) bejárás
Minta:
Preorder(node):
if node == nullptr: return
visit(node)
Preorder(node->left)
Preorder(node->right)
- Látogatjuk (feldolgozzuk) a gyökeret
- Rekurzívan bejárjuk a bal alfát
- Rekurzívan bejárjuk a jobb alfát
Tulajdonságok:
- Először látjuk a gyökért.
- Hasznos, ha először akarjuk kiírni vagy másolni a fa szerkezetét (például klónozáskor).
C++ példa:
void preorder(Node* node) {
if (!node) return;
std::cout << node->value << " ";
preorder(node->left);
preorder(node->right);
}
2. Inorder (Középrendű) bejárás
Minta:
Inorder(node):
if node == nullptr: return
Inorder(node->left)
visit(node)
Inorder(node->right)
- Rekurzívan bejárjuk a bal alfát
- Látogatjuk a gyökeret
- Rekurzívan bejárjuk a jobb alfát
Tulajdonságok:
- Bináris keresőfán (BST) alkalmazva a csomópontok növekvő sorrendben kerülnek feldolgozásra.
- Ezért az inorder az egyik legegyszerűbb módja a fában tárolt elemek sorba rendezett kinyerésének.
C++ példa:
void inorder(Node* node) {
if (!node) return;
inorder(node->left);
std::cout << node->value << " ";
inorder(node->right);
}
3. Postorder (Utórendű) bejárás
Minta:
Postorder(node):
if node == nullptr: return
Postorder(node->left)
Postorder(node->right)
visit(node)
- Rekurzívan bejárjuk a bal alfát
- Rekurzívan bejárjuk a jobb alfát
- Látogatjuk a gyökeret
Tulajdonságok:
- A csomópontot csak miután annak gyerekeit már feldolgoztuk.
- Hasznos lebontó műveletekhez: például fákat felszabadító (
delete) algoritmusában, mert előbb a gyermekek törlődnek, aztán a gyökér.
C++ példa:
void postorder(Node* node) {
if (!node) return;
postorder(node->left);
postorder(node->right);
std::cout << node->value << " ";
}
4. Szintek szerinti (Level-order) bejárás
Ez nem rekurzív, hanem szélességi keresés (Breadth-First Search, BFS) alkalmazása:
- Egy sor (queue) adatszerkezetben tartjuk a még be nem járt csomópontokat.
- Kezdjük a gyökérnél: betesszük a sortürelébe.
- A sorból kiveszünk egy csomópontot, feldolgozzuk, majd sorba tesszük az ő gyermekeit (bal, majd jobb).
- Amíg a sor nem üres, ismételjük.
#include <queue>
void levelOrder(Node* root) {
if (!root) return;
std::queue<Node*> q;
q.push(root);
while (!q.empty()) {
Node* u = q.front(); q.pop();
std::cout << u->value << " ";
if (u->left) q.push(u->left);
if (u->right) q.push(u->right);
}
}
Tulajdonságok:
- Szintenkénti sorrendben látogatja a csomópontokat.
- Hasznos, ha a gyökér-közeli elemeket előbb kell feldolgozni (pl. gráfokban a legrövidebb út keresésénél).
Rekurzív vs. iteratív
A fenti {pre,in,post}order mind rekurzív definíció. Iteratív megoldást is adhatunk verem használatával:
- Preorder:
- Verembe betesszük a gyökért.
- Amíg a verem nem üres: pop, látogat, majd először jobb, aztán bal gyereket tolunk a verembe.
- Inorder:
- Csomóponttól balra lemegyünk, toljuk a verembe, amíg bal gyerek van.
- Verem tetejét pop, látogat, ezután jobbra lépünk, onnan megint balra le…
- Postorder: Bonyolultabb veremes módszerek vagy két verem használata, vagy jelölők alkalmazása, mert a gyerekek feldolgozása előbb kell történjen.
Összetettség
- Idő: mind a négy fő módszer , ahol a csomópontok száma, mert minden csomópontot pontosan egyszer dolgozunk fel.
- Tér: rekurzív megoldásnak a rekurziós verem mélysége a fa magasságával arányos . BSF‐nek van egy teljes szinttároló sorigénye .
Mikor melyiket használjuk?
| Bejárás | Fő felhasználás |
|---|---|
| Preorder | Fa klónozása, először a gyökér-feldolgozás |
| Inorder | Keresőfa → növekvő sorrend |
| Postorder | Fa törlése, érték-kalkuláció gyerekek alapján |
| Level-order | Szintenkénti feldolgozás, legrövidebb út gráfban |
Példa: kifejezésfák
Egy aritmetikai kifejezés bináris fává alakítható, ahol a belső csomópontok operátorok, levelek operandusok.
- Preorder ⇒ prefix (pl.
+ * A B C) - Inorder ⇒ infix (pl.
A * B + C) - Postorder ⇒ postfix (pl.
A B * C +)
Postfix formából veremmel gyorsan értékelhető a kifejezés, prefixből pedig rekurzív kiértékelés indul.
Összefoglalva, a fa bejárása a faalkalmazások alapképessége:
- pre/in/post: DFS‐szerű, rekurzívan egyszerű, konkrét sorrendek
- level: BFS‐szerű, sorral, szintek feldolgozása
Ezeket a mintákat mindenfa‐ vagy gráf‐algoritmus építi, és elengedhetetlenek a hatékony adatstruktúra‐kezeléshez.
- tree traversal - Szótár.net (en-hu)
- tree traversal - Sztaki (en-hu)
- tree traversal - Merriam–Webster
- tree traversal - Cambridge
- tree traversal - WordNet
- tree traversal - Яндекс (en-ru)
- tree traversal - Google (en-hu)
- tree traversal - Wikidata
- tree traversal - Wikipédia (angol)