9.  Stromy

9.3  Prehľadávanie binárneho stromu

So stromami môžeme vykonávať rôzne operácie, napr.: vytvorenie prázdneho stromu, pridanie nového vrcholu (ako syna určeného vrcholu), odstránenie určeného vrcholu, presun ukazovateľa na syna daného vrcholu (toho, ktorý vyhovuje nejakej podmienke) resp. presun ukazovateľa na otca a pod.

Za základnú operáciu sa však považuje prehľadávanie stromu (pohyb po strome). Vzhľadom na to, že strom je výhodne definovaný ako rekurzívna údajová štruktúra, aj na prehľadávanie sa využívajú rekurzívne metódy.

Pre binárne stromy sú to tri základné rekurzívne metódy:

  • priame prehľadávanie - PREORDER
    Strom sa prehľadáva v poradí: koreň, ľavý podstrom, pravý podstrom (KLP)
    void preorder(TVrchol *koren)   
    {
       if (koren != NULL) {
         printf("%d", koren->hodnota);
         preorder(koren->ls); 
         preorder(koren->ps);
       }
    }

  • stredové prehľadávanie - INORDER
    Strom sa prehľadáva v poradí: ľavý podstrom, koreň, pravý podstrom (LKP)
    void inorder(TVrchol *koren)   
    {
       if (koren != NULL) {
         inorder(koren->ls);
         printf("%d", koren->hodnota); 
         inorder(koren->ps);
       }
    }

  • Spätné prehľadávanie - POSTORDER
    Strom sa prehľadáva v poradí: ľavý podstrom, pravý podstrom, koreň (LPK)
    void postorder(TVrchol *koren)   
    {
       if (koren != NULL) {
         postorder(koren->ls);
         postorder(koren->ps);
         printf("%d", koren->hodnota);      
       }
    }

  Pre binárny strom na obrázku, dostaneme použitím jednotlivých metód tieto rôzne výsledky:



preorder(strom);       OBRÁZOK
KLP : 1, 2, 4, 5, 3, 6, 8, 7

inorder(strom);
LKP : 4, 2, 5, 1, 6, 8, 3, 7

postorder(strom);
LPK : 4, 5, 2, 8, 6, 7, 3, 1

  Pri prehľadávaní stromu samozrejme nemusíme vždy len vypisovať hodnoty vrcholov na obrazovku. Postupujeme takto vždy, keď chceme na vrcholoch stromu (či už všetkých, alebo len tých, ktoré vyhovujú určenej podmienke) vykonať nejakú operáciu. Alebo strom prehľadávame len preto, aby sme zistili, či sa príslušný vrchol v strome nachádza alebo nie.