Kirjoittakaapa joku minulle binääripuu esimerkki koodi. Saisi sitten paremman otteen asiasta...
Tässä olisi pieni pätkä koodia. Kyseessä on luokka, joka tallentaa tietueita, joissa on nimi ja numero. Tietueet tallentuu numeron mukaan binääripuuhun, joka ei ole tasapainoitettu, eli jokaisen elementin haarat eivät ole yhtä suuret.
En ole testannut koodia, mutta periaate selvinnee koodista.
class Tietue { static Tietue *eka; Tietue *suurempi; Tietue *pienempi; string nimi; int nro; public: Tietue(int p_n, string p_nimi); static string Nimi(int p_nro); }; Tietue::Tietue(int p_nro, string p_nimi) : nro(p_nro), nimi(p_nimi) { // Jokainen uusi elementti joutuu puun latvaan, // eli suurempi- ja pienempi-jäsenet ovat NULL suurempi = NULL; pienempi = NULL; if (eka == NULL) { eka = this; return; } Tietue *faija = eka; // Etsi uudelle tietueelle sopiva isätietue, niin että // uuden tietueen nro on suurempi tai pienempi kuin isän nro // ja isän vastaava haara (suurempi tai pienempi) on tyhjä do { if (nro >= faija->nro) { if (faija->suurempi == NULL) { faija->suurempi = this; return; } else // haara ei ole tyhjä, ota haaran ensimmäinen // elementti uudeksi isäkandidaatiksi faija = faija->suurempi; } else // vastaavat rivit kun uusi nro on pienempi kuin isän nro { if (faija->pienempi == NULL) { faija->pienempi = this; return; } else faija = faija->pienempi; } while (true); } // Seuraava funktio palauttaa tietueen nimi-jäsenen // kun parametrina on tietueen nro-jäsen string Tietue::Nimi(int p_nro) { if (eka == NULL) return string("Puu on tyhjä"); Tietue *p = eka; do { if (p->nro == p_nro) return p->nimi; if (p->nro > p_nro) p = p->pienempi; else p = p->suurempi; } while (p != NULL); return string("Tietuetta ei ole!"); }
Luokkaa voisi käyttää esim. näin:
// Luodaan tietueita: new Tietue(34, "Ake"); new Tietue(76, "Make"); new Tietue(12, "Pera"); new Tietue(46, "Mä"); // Haetaan tietue numeron perusteella string joku = Tietue::Nimi(12);
Esimerkistä puuttuu paljon koodia, esim. hajotin (destructor) joka korjaa puun kun jokin tiedosto poistetaan.
Öh... pitää olla "kun jokin tietue poistetaan."
Olisiko mahdollista saada esimerkkiä myös C:llä kirjoitettuna? Tämä esimerkki oli ihan hyvä, mutta miten käsittelen käytännössä tietoa C:llä binääripuussa?
Kirjoitin tuon improvisoiden. Olen unohtanut miten C:tä kirjoitetaan. Tarkoitan sellaisia funktioita kuin malloc ja free. Jos osaat lukea C++-koodia, pystyt ehkä itse kääntämään sen C:ksi. Luokasta poimitaan vain muuttujat structiin ja funktiot erillisiksi funktioiksi. Niin ja new ja delete muuttuu malloc:ksi ja free:ksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.