9. Stromy
9.4 Binárny strom – príklad
Typickým príkladom binárneho stromu je vlastný rodokmeň. Jednotlivé vcholy tohto stromu predstavujú členov rodiny (informácie o nich – napr. meno, rok narodenia, zamestnanie a pod.)
 |
Namiesto ľavého a pravého syna každého vrcholu by sme mali vlastne hovoriť o matke a otcovi. |
Napíšeme postupne funkcie, pomocou ktorých budeme s naším rodokmeňom pracovať. Budeme predpokladať, že žiadny dvaja naši príbuzní nemajú rovnaké meno (pre jednoduchosť). Definujme si najskôr typ vrcholu:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct vrchol {
char meno[20]; /* meno */
struct vrchol *ls; /* otec */
struct vrchol *ps; /* matka */
} TVrchol;
TVrchol *strom = NULL;
Náš strom je zatiaľ prázdny. Vytvorme teda prvý vrchol – koreň stromu: strom = (TVrchol*)malloc(sizeof(TVrchol));
strcpy(strom->meno, "ja");
strom->ls = NULL;
strom->ps = NULL;
Alebo si rovno pripravme funkciu na vytvorenie nového vrcholu – bude vracať ukazovateľ na vytvorený vrchol: TVrchol *novy(char *kto)
{
TVrchol *pom = (TVrchol*)malloc(sizeof(TVrchol));
pom->ps = NULL;
pom->ls = NULL;
strcpy(pom->meno, kto);
return (pom);
} Koreň stromu potom vytvoríme takto:
strom = novy("ja");
Teraz by sme chceli do stromu pridať ďalších členov rodiny. Každý nový prvok pridáme na správne miesto – t. j. ako ľavého alebo pravého syna určeného vrcholu.
void pridaj(TVrchol *koren, char *komu, char *kto, char syn)
{
if (!strcmp(koren->meno, komu)) {
if (syn == 'P')
if (koren->ps != NULL) printf("Dany vrchol uz existuje!");
else koren->ps = novy(kto);
if (syn == 'L')
if (koren->ls != NULL) printf("Dany vrchol uz existuje!");
else koren->ls = novy(kto);
}
else {
if (koren->ls != NULL) pridaj(koren->ls, komu, kto, syn);
if (koren->ps != NULL) pridaj(koren->ps, komu, kto, syn);
}
}
Funkcia strcmp porovnáva dva reťazce. Ak sú rovnaké, vráti hodnotu 0!
Pridajme teda do stromu ďalší vrchol:
pridaj(strom, "ja", "mama", 'L'); Čo sa udeje? V strome hľadáme vrchol s hodnotou „ja“ ktorému máme ako ľavého syna pridať nový vrchol s hodnotou „mama.“ Všimnite si, že strom prehľadávame metódou KLP. Ak hľadaný vrchol nájdeme a zistíme, že už ľavého syna má, vypíšeme o tom oznam na obrazovku. Pridajme do stromu ďalších:
pridaj(strom, "ja", "otec", 'P');
pridaj(strom, "otec", "dedko2", 'P');
pridaj(strom, "otec", "babka2", 'L'); atď.
Vytvorený rodokmeň („rodostrom“), samozrejme, chceme zviditeľniť: void vypis(TVrchol *koren) LKP
{
if (koren != NULL) {
vypis(koren->ls);
printf("%s ", koren->meno);
vypis(koren->ps);
}
}
|