Binárny strom (Pascal)

Programovacie jazyky, rady, poradňa...
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Binárny strom (Pascal)

Príspevok od používateľa Sagittarius »

Potreboval by som vedieť ako spočítam mohutnosť binárneho stromu s explicitnými vzťahmi, mám na to rekurzívnu procedúru, skúšal som veľa možností, ale žiadna mi nefungovala.

Toto je základ:

Kód: Vybrať všetko

function cStrom.Mohutnost:integer;
  procedure zobraz(index:integer);
  var pocet:integer;
  begin
   if pole^[index]<>nil then
    begin
     pocet:=pocet+1;
     mohutnost:=pocet;
     zobraz(2*Index,pocet);
     zobraz(2*Index+1,pocet);
    end;
  end;
  begin
   zobraz(indexPola);
  end;
Ďakujem za pomoc. :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

v tých rekurentných volaniach máš parameter pocet, ktorý ale procedúra zobraz vôbec nevyužíva. Namiesto toho definuješ v každom volaní metody lokálnu premennú pocet. Takto sa ti ten pocet neprenáša medzi volaniami. Buď to budeš robiť globálnou premennou (ešte lepšie keď to bude property toho cStrom-u), alebo bude pocet parameter volaný adresou (niektorá literatúra to nazíva parameter volaný menom). Či použiješ prehladávanie preorderom, inorderom alebo postorderom je jedno
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

Jáj, sorry, som si nevšimol. Ja som tam skúšal veľa vecí a mal som niektoré príkazy v množinových zátvorkách. Ak som dobre pochopil, čo si napísal malo by to byť takto:

Kód: Vybrať všetko

function cStrom.Mohutnost:integer;
  procedure zobraz(index:integer;pPocet:integer);
  begin
   if pole^[index]<>nil then
    begin
     pPocet:=pPocet+1;
     mohutnost:=pPocet;
     zobraz(2*Index,pPocet);
     zobraz(2*Index+1,pPocet);
    end;
  end;
  begin
   zobraz(indexPola,pocet);
  end;
a ešte v inite mám pocet:=0
ale ukazuje mi číslo, aj keď v strome by nemal byť ani jeden vrchol.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

skús takto, ale je to iba z hlavy:

Kód: Vybrať všetko

function cStrom.Mohutnost:integer;
  function zobraz(index:integer):integer;
  begin
   if pole^[index]<>nil then
    begin
     result:=1+zobraz(2*Index)+zobraz(2*Index+1);
    end else result:=0;
  end;
  begin
   result:=zobraz(indexPola);
  end;
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

Ďakujem. Už píše nulu, aj keď nulu píše aj vtedy, keď nahrám koreň, ale to už je chyba inde a musím ju nájsť. :)
Napísať odpoveď