„Dinamikus adatszerkezetek tutorial” változatai közötti eltérés
| 351. sor: | 351. sor: | ||
A következő fv megszámolja, hány elemnek van jobb oldali gyermeke! | A következő fv megszámolja, hány elemnek van jobb oldali gyermeke! | ||
<pre> | |||
int gyerekek (pBIFA fa) { | |||
int n=0; | |||
if (fa==NULL) return -1; // üres a fa! | |||
if (fa->jobb !=NULL ) { // el lehet menni jobbra | |||
n = n + 1; // a fának van jobb oldali gyereke, így növeljük a számlálót | |||
n = n + gyerekek(fa->jobb); // megszamoljuk a jobb oldali reszt (n=n+ rövidebb verziója az n+=) | |||
} | |||
if (fa->bal !=NULL ) // el lehet menni balra | |||
n = n + gyerekek(fa->bal); // megszamoljuk a bal oldali reszt | |||
return n; // visszaterunk az eredmennyel | |||
} | |||
} | |||
</pre> | |||
Mit csináltunk itt? Fontos először is tudnunk, hogy a függvény egyszerre csak az aktuális elemmel törődik, s nem látja annak gyerekeinek gyerekeit. Annyit tud, hogy jobbra és balra el lehet-e menni. Ennyi elég, mert ha egyik irányba el lehet menni, akkor meghívja önmagát azzal az elemmel, ami a kívánt irányban van. Amikor visszatér, az előző függvényhíváshoz tér vissza, s ezzel átadja a lentebb fekvő gyerekek értékeit. Bonyolult. | Mit csináltunk itt? Fontos először is tudnunk, hogy a függvény egyszerre csak az aktuális elemmel törődik, s nem látja annak gyerekeinek gyerekeit. Annyit tud, hogy jobbra és balra el lehet-e menni. Ennyi elég, mert ha egyik irányba el lehet menni, akkor meghívja önmagát azzal az elemmel, ami a kívánt irányban van. Amikor visszatér, az előző függvényhíváshoz tér vissza, s ezzel átadja a lentebb fekvő gyerekek értékeit. Bonyolult. | ||
| 377. sor: | 374. sor: | ||
<pre> | <pre> | ||
(a) | |||
/ \ | |||
(b) (c) | |||
/ \ | |||
(d) (e) | |||
\ | |||
(f) | |||
</pre> | </pre> | ||
| 390. sor: | 387. sor: | ||
hozzáadódik (a) számlálójához, ami így már 3. | hozzáadódik (a) számlálójához, ami így már 3. | ||
Ha fenti bírod követni, akkor nem érted a rekurziót, ülj neki, és ha megvan, akkor gyere vissza. ( | Ha fenti bírod követni, akkor nem érted a rekurziót, ülj neki, és ha megvan, akkor gyere vissza. (''Ahhoz hogy megértsd a rekurziót, előbb meg kell értened a rekurziót :D'') | ||
Remélem érthető tehát a bináris fák bejárása. Ha nem a gyerekek számát, hanem mondjuk a fában tárolt adatok összegét kell meghatározni, akkor értelemszerűen azokat kell az n-hez adni, s azzal kell visszatérni. Pl.: | Remélem érthető tehát a bináris fák bejárása. Ha nem a gyerekek számát, hanem mondjuk a fában tárolt adatok összegét kell meghatározni, akkor értelemszerűen azokat kell az n-hez adni, s azzal kell visszatérni. Pl.: | ||
<pre> | |||
int osszeg (pBIFA fa) { | |||
int n; | |||
if (fa==NULL) return -1; | |||
n=fa->adat; | |||
if (fa->jobb !=NULL ) n = n + osszeg(fa->jobb); | |||
if (fa->bal !=NULL ) n = n + osszeg(fa->bal); | |||
return n; // visszaterunk az eredmennyel | |||
} | |||
</pre> | |||
===Fa rendezett kiíratása=== | ===Fa rendezett kiíratása=== | ||