Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Binääripuu?

dungeon86 [08.02.2005 13:43:59]

#

Kirjoittakaapa joku minulle binääripuu esimerkki koodi. Saisi sitten paremman otteen asiasta...

jutti [08.02.2005 15:20:09]

#

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.

jutti [08.02.2005 17:34:51]

#

Öh... pitää olla "kun jokin tietue poistetaan."

dungeon86 [09.02.2005 09:12:41]

#

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?

jutti [10.02.2005 11:19:07]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta