szó jelentését keresi. A DICTIOUS-ban nem csak a
szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a
szót egyes és többes számban mondani. Minden, amit a
szóról tudni kell, itt található. A
szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. A
és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.
Főnév
tree traversal (tsz. tree traversals)
- (informatika, mesterséges intelligencia) fabejárás
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.