Kezdőoldal » Számítástechnika » Programozás » Bináris fa fájlbaírás rekurzív...

Bináris fa fájlbaírás rekurzívan hogy?

Figyelt kérdés

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?


2010. nov. 23. 21:20
 1/7 A kérdező kommentje:

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);

}

}

2010. nov. 23. 21:21
 2/7 A kérdező kommentje:
Most sajnos ugye minden rekurzióban megnyitja a fájlt. Ez így nem túl szép. :(
2010. nov. 23. 21:23
 3/7 anonim ***** válasza:
Ne a függvényben nyitsd meg a fájlt, hanem ahol először meghívod, a függvényhívás előtt.
2010. nov. 23. 21:28
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

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?

2010. nov. 24. 13:47
Hasznos számodra ez a válasz?
 5/7 A kérdező kommentje:
preorder, hogy visszanyerhessem az eredeti fát
2010. nov. 25. 16:31
 6/7 anonim ***** válasza:

É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... :)

2010. nov. 25. 22:18
Hasznos számodra ez a válasz?
 7/7 anonim válasza:

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.

2010. dec. 1. 13:59
Hasznos számodra ez a válasz?

További kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!