Bináris fa fájlbaírás rekurzívan hogy?
A problémám az, hogy vagy 1 függvénnyel írom meg, rekurzívan, de ekkor minden hívásnál megnyitja a fájlt. Vagy 2 fügvénnyel oldom meg, de az több mint 1 :)
Mi a szép megoldás?
int fajlbairaltern(elofordulasok* gyoker){
if(gyoker!=NULL){
FILE* fp=NULL;
fp=fopen("ki2.txt","ab");
fwrite(&gyoker->szo,sizeof(gyoker->szo),1,fp);
fajlbairaltern(gyoker->bal);
fajlbairaltern(gyoker->jobb);
}
}
De miképpen akarod kiírni?
Csak az adatokat kiírni belőle, úgy mint egy vektorból, vagy meg akarod tartani a fa jellegét, hogy mikor kiolvasod, egyszerűen újraépíthetsd ugyanazt a fát?
Értem, de ezzel a kóddal nem tudod visszanyerni az eredeti fát, mivel
pl. van egy ilyen fád:
a-val jelölöm a gyökeret, b-el a bal fiát, c-vel a jobb fiát.
van a gyökér, aminek csak jobb oldali fia van, baloldali nincs, akkor ezt fogja kiírni:
a c
Viszont, ha csak bal fia van akkor ezt:
a b
Mivel a fa elemeinek értékét írod ki, ami bármennyi lehet, nem tudod visszanyerni azt az információt, hogy melyik oldalon volt az illető elem.
Hogy jobban megértsd mit akarok:
pl1. a-gyökér, b-bal fiu, ezt fogja kiirni:
a b
pl2. a-gyökér, b-jobb fiu, ezt fogja kiirni:
a b
A két fa nem ugyanolyan, de ugyanazt írja ki.
pl2. a-nak két fia van: a b c
a-nak egy fia van:b, és bnek is egy van, a c: a b c
Ahhoz, hogy visszanyerhetsd az eredeti fát kicsit még bonyolítani kell a dolgot... legegyszerűbb ha mikor üres elemhez értél, akkor kiírsz egy karaktert, hogy jelöld, hogy itt pont nincs semmi. És ekkor a következőre alakulnak a dolgok (itt a 0t használom üresnek...):
a, jobb oldalt b:
a 0 b
a, bal oldalt b:
a b 0 0 0
a, két fiuval:
a b 0 0 c 0 0
a, fia b, b-nek c a fia (miind bal):
a b c 0 0 0 0
a nak bal fia b, akinek c a jobb fia:
a b 0 c 0 0 0
Ezzel csak az a gond, hogy jelentősen nagyobb lehet a kiírt adatok mennyisége, ezen még javíthatsz, ha a leveleknél egy másik jelző karaktert írsz ki.
pl. a, fia b, b-nek c a fia (miind bal):
a b c 1 0 0
Még ezen is hasonló módon javíthatsz:
a, fia b, b-nek c a fia (miind bal):
+a +b 0c
a nak bal fia b, akinek c a jobb fia:
+a -b 0c
a-nak két fia van: b és c:
a 0b 0c
Erre már magadtól rájössz szerintem... :)
Kösz, erre nem is gondoltam!
De elvileg az is jó megoldás, ha a fa már eleve rendezve van, ha visszaolvasáskor ugyanazon szisztéma szerint rendezzük, elvileg, ugyanazt kell kapni.
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!