Forum » Programiranje » [C#] Iskalno Drevo
[C#] Iskalno Drevo
Ciklamen ::
Živjo, spet se javljam z nalogo za faks :)
Ni mi najbolj jasno kaj točno je treba naredit, upam da mi kdo lahko pomaga razumeti (nočem kode, samo razlago kako naj se zadeve lotim)
Torej zadeva je sledeča, imamo class IskalnoDrevo, v njem pa class Vozlisce
Implementirat moram(o) metode, ki imajo //TODO: implementation v njih.
Se pravi, ni mi najbolj jasno zakaj 2x postfixQueue, infix, prefix, najvecji, padajocaVrsta, narascajocaVrsta itd.
Upam, da mi kdo lahko pomaga z razlago (nisem na skripti od profesorja in na googlu našel nič koristnega, zato smetim tukaj) - še enkrat nočem kode, samo želim razlago ker trenutno sem malo v temi :)
Ni mi najbolj jasno kaj točno je treba naredit, upam da mi kdo lahko pomaga razumeti (nočem kode, samo razlago kako naj se zadeve lotim)
Torej zadeva je sledeča, imamo class IskalnoDrevo, v njem pa class Vozlisce
public class IskalnoDrevo
{
class Vozlisce
{
private float podatek;
private Vozlisce levo;
private Vozlisce desno;
public Vozlisce(float podatek)
{
this.podatek = podatek;
levo = null;
desno = null;
}
public Vozlisce(Vozlisce original)
{
this.podatek = original.podatek;
levo = null;
desno = null;
if (original.levo != null)
levo = new Vozlisce(original.levo);
if (original.desno != null)
desno = new Vozlisce(original.desno);
}
public void vstavi(float podatek)
{
if (podatek < this.podatek)
{
if (levo == null)
levo = new Vozlisce(podatek);
else
levo.vstavi(podatek);
}
else { //when (podatek >= this.podatek)
if (desno == null)
desno = new Vozlisce(podatek);
else
desno.vstavi(podatek);
}
}
public int size()
{
//TODO: implementation
return -1; //HACK: dummy return
}
public float najvecji()
{
//TODO: implementation
if (desno == null)
return float.NaN;
Vozlisce v = desno;
while (v != null)
v = desno.desno;
return v.podatek; //HACK: dummy return
}
public float najmanjsi()
{
//TODO: implementation
if (levo == null)
return float.NaN;
Vozlisce v = levo;
while (v != null)
v = levo.levo;
return v.podatek; //HACK: dummy return
}
public void narascajocaVrsta(Queue<float> vrsta)
{
//TODO: implementation
}
public void padajocaVrsta(Queue<float> vrsta)
{
//TODO: implementation
}
public void prefixQueue(Queue<float> vrsta)
{
//TODO: implementation
vrsta.Enqueue(podatek);
if (levo != null)
levo.prefixQueue(vrsta);
if (desno != null)
desno.prefixQueue(vrsta);
}
public void infixQueue(Queue<float> vrsta)
{
if (levo != null)
levo.infixQueue(vrsta);
vrsta.Enqueue(podatek);
if (desno != null)
desno.infixQueue(vrsta);
}
public void postfixQueue(Queue<float> vrsta)
{
//TODO: implementation
if (levo != null)
levo.postfixQueue(vrsta);
if (desno != null)
desno.postfixQueue(vrsta);
vrsta.Enqueue(podatek);
}
} //end class Vozlisce
//lastnosti
Vozlisce koren;
//privzeti konstruktor
public IskalnoDrevo()
{
this.koren = null;
}
//kopirni konstruktor
public IskalnoDrevo(IskalnoDrevo original)
{
koren = new Vozlisce(original.koren);
}
public void vstavi(float podatek)
{
if (empty())
koren = new Vozlisce(podatek);
else
koren.vstavi(podatek);
}
public bool empty()
{
return (koren == null);
}
public int size()
{
if (koren == null/*empty()*/)
return 0;
else
return koren.size();
}
//metode za dodatno funkcionalnost
public float najvecjiElement()
{
//TODO: implementation
Vozlisce v = koren;
return float.NaN; //HACK: dummy return
}
public float najmanjsiElement()
{
//TODO: implementation
return float.NaN; //HACK: dummy return
}
public Queue<float> narascajocaVrsta()
{
Queue<float> narascajoca = new Queue<float>();
if (koren != null)
koren.narascajocaVrsta(narascajoca);
return narascajoca;
}
public Queue<float> padajocaVrsta()
{
Queue<float> padajoca = new Queue<float>();
if (koren != null)
koren.padajocaVrsta(padajoca);
return padajoca; //HACK: dummy return
}
public Queue<float> prefixQueue()
{
//TODO: implementation
return new Queue<float>(); //HACK: dummy return
}
public Queue<float> infixQueue()
{
//TODO: implementation
return new Queue<float>(); //HACK: dummy return
}
public Queue<float> postfixQueue()
{
//TODO: implementation
return new Queue<float>(); //HACK: dummy return
}
} //end class IskalnoDrevo
Implementirat moram(o) metode, ki imajo //TODO: implementation v njih.
Se pravi, ni mi najbolj jasno zakaj 2x postfixQueue, infix, prefix, najvecji, padajocaVrsta, narascajocaVrsta itd.
Upam, da mi kdo lahko pomaga z razlago (nisem na skripti od profesorja in na googlu našel nič koristnega, zato smetim tukaj) - še enkrat nočem kode, samo želim razlago ker trenutno sem malo v temi :)
- End of the Post ->
amdsup5 ::
Predvidevam, da se gre za binarno iskalno drevo (BST).
Najmanjšega poiščeš preprosto tako, da slediš levim dokler ne naletiš na null potem se vrneš enega višje.
Analogno največjega poiščeš tako, da slediš desnim sinovom dokler ne naletiš na null in se vrneš enega višje.
Zanima me sledeče, a je to tvoja ideja uporabit vrsto ali imate tako v navodilih?
Najmanjšega poiščeš preprosto tako, da slediš levim dokler ne naletiš na null potem se vrneš enega višje.
Analogno največjega poiščeš tako, da slediš desnim sinovom dokler ne naletiš na null in se vrneš enega višje.
Zanima me sledeče, a je to tvoja ideja uporabit vrsto ali imate tako v navodilih?
Zgodovina sprememb…
- spremenilo: amdsup5 ()
Ciklamen ::
Gre za binarno iskalno drevo ja :)
Sem poizkusil, naredil tako za najmanjšega (in tudi največji ne more bit drugače)
Pa mi cikla v while zanki, ker najmanjša vrednost nima naslednjega vozlišča null
Vrsta je že podana, vbistvu vse metode ki so napisane so že podane, mi jih moramo samo dopolnit da bo delovalo :)
Sem poizkusil, naredil tako za najmanjšega (in tudi največji ne more bit drugače)
public float najmanjsi()
{
//TODO: implementation
if (levo == null)
return float.NaN;
Vozlisce v = levo;
while (v.levo != null)
v = levo;
return v.podatek; //HACK: dummy return
}
Pa mi cikla v while zanki, ker najmanjša vrednost nima naslednjega vozlišča null
Vrsta je že podana, vbistvu vse metode ki so napisane so že podane, mi jih moramo samo dopolnit da bo delovalo :)
- End of the Post ->
amdsup5 ::
Ja je en trik v tem in sicer tako.
Ti potrebuješ en kazalec na root , ki se pomika skupaj s trenutnim
Točno tako kot praviš najmanjši element nima levega.
Zato potrebuješ nek mehanizem, da vrneš to vozlišče
Vozlisce * root = root // nastaviš na null
najdemo recimo prvega levega npr. L1
L1.parent = root
L1.leftchild = L2
potem
L2.parent = root
L2.leftchild = L3
Glej da imaš tako relacijo, da lahko vedno dostopaš do očeta vozlišča preko kazalca root
Na tak način prideš recimo do L5 ki je npr. minimalen
potem pač vrneš ta to narediš tako
Vozlisce * min = (L5.parent).leftchild
Ti potrebuješ en kazalec na root , ki se pomika skupaj s trenutnim
Točno tako kot praviš najmanjši element nima levega.
Zato potrebuješ nek mehanizem, da vrneš to vozlišče
Vozlisce * root = root // nastaviš na null
najdemo recimo prvega levega npr. L1
L1.parent = root
L1.leftchild = L2
potem
L2.parent = root
L2.leftchild = L3
Glej da imaš tako relacijo, da lahko vedno dostopaš do očeta vozlišča preko kazalca root
Na tak način prideš recimo do L5 ki je npr. minimalen
potem pač vrneš ta to narediš tako
Vozlisce * min = (L5.parent).leftchild
Zgodovina sprememb…
- spremenilo: amdsup5 ()
Ciklamen ::
Sem rešil tega z rekurzijo, bolj elegantno kot pointerji v C# :)
Zanima me še za padajoca pa narascajoca vrsta, kako naj se tega lotim? Ima kdo idejo?
Zanima me še za padajoca pa narascajoca vrsta, kako naj se tega lotim? Ima kdo idejo?
- End of the Post ->
Ciklamen ::
Tudi to rešil, vbistvu čist simpl, zanima me še samo size()? Probal sem že marsikaj, pa ne dela. Gre preko null reference, trenutno imam tak
if (levo.levo == null && desno.levo == null)
return 1;
else
return levo.size() + desno.size();
- End of the Post ->
amdsup5 ::
ustvari števec, nastavi na 0
Vsako vozlišče ima lahko kvečjemu dva sinova.
recimo za levo poddrevo dokler ne prideš do listov, preveri ali trenutno vozlišče ima nastavljenega levega in desnega sina, če ima oba povečaj števec za 2 sicer za 1
isto ponovi za desno poddrevo dokler ne naletiš na list preglejuj leve in desne sinove in popravljaj števec.
Na koncu prištej še 1 (root).
Kako veš, da si dosegel list?
Oba sinova morata biti nastavljena na null, kar je ekvivalentno temu, da sinov ni.
Vsako vozlišče ima lahko kvečjemu dva sinova.
recimo za levo poddrevo dokler ne prideš do listov, preveri ali trenutno vozlišče ima nastavljenega levega in desnega sina, če ima oba povečaj števec za 2 sicer za 1
isto ponovi za desno poddrevo dokler ne naletiš na list preglejuj leve in desne sinove in popravljaj števec.
Na koncu prištej še 1 (root).
Kako veš, da si dosegel list?
Oba sinova morata biti nastavljena na null, kar je ekvivalentno temu, da sinov ni.
Zgodovina sprememb…
- spremenilo: amdsup5 ()
Spura ::
Ciklamen ::
Malo sem lenaril čez počitnice, pa mi še ni ratalo tega naredit.
Skratka, ko kličem metodo size() iz main-a, kjer imam polje float-ov takšno
mi vrača size 6. (ne glede ali spreminjam kar koli - dodajam, odvzemam elemente)
Kodo za size() znotraj razreda Vozlišče imam pa takšno, kot je vsepovsod na internetu za najti:
Ima kdo kak predlog kaj naj naredim? Ne uspem nikakor stvari razvozlat, imam pa še manj kot 2 dni za oddajo naloge :)
EDIT: Pisal sem še asistentu in mi je to odgovoril (glede tega kaj naj bi metoda size() počela)
metoda size() (, ki je že implementirana) znotraj razreda IskalnoDrevo vrne število vozlišč celotnega iskalnega drevesa (metoda deluje nad korenom).
Metoda size() (, ki jo je potrebno implementirati) znotraj razreda Vozlisce pa vrne število vozlišč (pod)drevesa, katerega >>koren<< je trenutno vozlišče.
Skratka, ko kličem metodo size() iz main-a, kjer imam polje float-ov takšno
float[] zaporedje = { 1.1f, -9.9f, 16.16f, -25.25f, -1.1f, 4.4f, 36.36f, -16.16f, -4.4f, .0f, 9.9f, 25.25f, 49.49f, -3.3f, -3.5f, 2.5f, 22.3f, 378.3f, -22.4f, 15.8f, 15.9f };mi vrača size 6. (ne glede ali spreminjam kar koli - dodajam, odvzemam elemente)
Kodo za size() znotraj razreda Vozlišče imam pa takšno, kot je vsepovsod na internetu za najti:
if (levo == null || desno == null)
return 0;
else
return 1 + levo.size() + desno.size();Ima kdo kak predlog kaj naj naredim? Ne uspem nikakor stvari razvozlat, imam pa še manj kot 2 dni za oddajo naloge :)
EDIT: Pisal sem še asistentu in mi je to odgovoril (glede tega kaj naj bi metoda size() počela)
metoda size() (, ki je že implementirana) znotraj razreda IskalnoDrevo vrne število vozlišč celotnega iskalnega drevesa (metoda deluje nad korenom).
Metoda size() (, ki jo je potrebno implementirati) znotraj razreda Vozlisce pa vrne število vozlišč (pod)drevesa, katerega >>koren<< je trenutno vozlišče.
- End of the Post ->
Zgodovina sprememb…
- spremenil: Ciklamen ()
c-lox ::
Si zrisal drevo za tisto zaporedje? Ni res globine 6?
Kaj pa za zaporedje { .1f, .2f, .3f, .4f }, vrača 4?
Kaj pa za zaporedje { .1f, .2f, .3f, .4f }, vrača 4?
!not my imagination.
Ciklamen ::
c-lox ne iščem globine, iščem število vseh vozlišč v drevesu, če prav razumem kaj je asistent hotel povedat
za tvoje podano zaporedje ne vrača 4 ampak 0.
za tvoje podano zaporedje ne vrača 4 ampak 0.
- End of the Post ->
c-lox ::
Šteje ti samo vozlišča, ki imajo obe vozlišči polni.
if(levo != null && desno != null) return 1 + levo.size() + desno.size(); else if(levo == null) return 1 + desno.size(); else if(desno == null) return 1 + levo.size(); else return 1;
!not my imagination.
Zgodovina sprememb…
- spremenilo: c-lox ()
Ciklamen ::
Malo si preveč posplošil c-lox, je bilo še treba nekaj dodati da zadeva deluje, vsekakor pa hvala ti! Imaš pivo v dobrem :)
- End of the Post ->
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | Predstavitev dvojiškega drevesa z seznamomOddelek: Programiranje | 2162 (1762) | ktka |
| » | [C++] Iskalno drevo implementacijaOddelek: Programiranje | 2488 (2046) | eXoo |
| » | Za programerske teoretikeOddelek: Programiranje | 9271 (6073) | Jerry000 |
| » | C# LinkedListOddelek: Programiranje | 1354 (1205) | PoPon2 |
| » | pomoc pri skladuOddelek: Programiranje | 1465 (1390) | NoUse4AName |