Labor, 11. hét: bináris fák
Czirkos Zoltán, Pohl László · 2024.11.07.
Bináris fák és rekurzív algoritmusaik.
Felkészülés a laborra:
- A bináris fákról szóló előadás átismétlése.
Megoldás
Az alábbi feladatok megoldása letölthető innen: binaris_fa.c.
Az alábbi program létrehoz egy bináris keresőfát. A fa elemei egy egész típusú értéket tartalmaznak. Az órai feladatokat a program által létrehozott fával tudjátok kipróbálni. A létrehozott fa jobb oldalt látható.
#include <stdio.h>
#include <stdlib.h>
typedef struct BiFa {
int ertek;
struct BiFa *bal, *jobb;
} BiFa;
BiFa *beszur(BiFa *gyoker, int ertek) {
if (gyoker == NULL) {
BiFa *uj = (BiFa*) malloc(sizeof(BiFa));
uj->ertek = ertek;
uj->bal = uj->jobb = NULL;
return uj;
}
if (ertek < gyoker->ertek) { /* balra szur */
gyoker->bal = beszur(gyoker->bal, ertek);
}
else if (ertek > gyoker->ertek) { /* jobbra szur */
gyoker->jobb = beszur(gyoker->jobb, ertek);
}
else {
/* mar benne van */
}
return gyoker;
}
int main(void) {
int minta[] = {15, 96, 34, 12, 14, 56, 21, 11, 10, 9, 78, 43, 0};
BiFa *gyoker = NULL;
for (int i = 0; minta[i] > 0; i++)
gyoker = beszur(gyoker, minta[i]);
/* Ide tedd be a kipróbálandó függvények hívásait! */
return 0;
}
Írj függvényt, amely megkeres egy elemet a fában, és visszaadja az arra mutató pointert! A
visszatérési érték legyen NULL
, ha az adott szám a fában nem szerepel.
Tipp
Tipp a megoldáshoz:
- Legyen bármi a keresett adat, üres fában nincs benne.
- Ha a fa gyökerében van a keresett elem, akkor már meg is találtuk.
- Ha a fa gyökerében kisebb elem van, akkor jobbra kell továbbhaladni.
- Ha nagyobb elem van ott, akkor viszont balra kell menni.
Írj függvényt, amely ellentettjére változtat, azaz −1-gyel szoroz minden elemet a fában!
Keress most meg egy elemet az előbbi függvénnyel. Mit tapasztalsz? Miért történik ez? Hogyan módosítanád a kereső függvényt, hogy működjön az így kapott fán? Írd meg ezt a változatot is! Ha kell, rajzold le egy kis részletét a gyökértől indulva a negált fának, és képzeletben hajtsd rajta végre az algoritmust! Ki is írathatod a negált fát az inorder bejárás függvényeddel.
Írj egy rekurzív függvényt, amely tükröz egy paraméterként kapott fát!
Tipp
Tipp a megoldáshoz:
- Üres fán nincs mit tükrözni.
- A fa elemeiben tárolt adatokat sem kell változni. A tükrözés által a szerkezete változik, nem az adatok!
- A tükrözés megcseréli a bal és jobb oldali részfákat.
Most működik a módosított kereső függvény? Miért? (Írasd ki a fa tartalmát az inorder függvénnyel, vagy készíts rajzot!)