Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 19. 06. 2016 12:57

kreonek
Zelenáč
Příspěvky: 8
Škola: VŠ
Reputace:   
 

Binární strom Java

Zdravím
rád bych poprosil o pomoc radu ohledně Binárního stromu v Javě
mám hlavně problém s naprogramováním hloubky stromu, zrušení a vytvoření stromu. Maximum, minimum, výpis všech prvků jsem zvládl celkem bez problému. V Javě jsem začátečník. Rozepisoval jsem si to i na papír, vysloveně na nějakém příkladu - tíml jsem si vytvořil a napsali myšlenku, co bych chtěl tedy nějak zrealizovat, ale nějak to nezvládám.

přiložím sem celý můj kód, aby byla vidět i struktura stromu jak je co tvořený

Code:

class Vrchol  {
    private int klic;
    private Vrchol levy;
    private Vrchol pravy;
    int h = 0;
    int pKrok = 0;
    /**
     * konstruktor - vytvoří kořen stromu
     */
    public Vrchol (int klic) {
        this.klic = klic;
        this.levy = null;
        this.pravy = null;}
    /**
     * zapis levý < kořen (klíč vrcholu) < pravý 
     */
    public void zapis(int cislo){
        int key = klic;
        if (cislo == key) {return;}
        if (cislo > key){
            if (pravy == null){
                pravy = new Vrchol(cislo);}
            else {  
               pravy.zapis(cislo);}}
        if (cislo < key){
            if (levy == null){
                levy = new Vrchol(cislo);            }
            else {  
                levy.zapis(cislo); }  } }
    /**
     * výpis všech - zrealizován zároveň třídící algoritmus - seřazení vzestupně  
     */
    public void vypisVsech(){
        if (this == null) {
            return;        }
        else {          
            if (levy != null )levy.vypisVsech(); //nejdříve se vypíše levý strom
            tiskPrvnihoVrcholu();               //pak kořen, pak pravý... seřazeno
            if (pravy != null)pravy.vypisVsech();   }    }
    /**
     * obsahuje - metoda, která vrací true, pokud strom obsahuje dotazované číslo
     */
    public boolean obsahuje(int cislo){ //hledám zda číslo které zadám je ve stromě
        if (this == null){return false;} 
        else{
            int v = getV();
            if (v == cislo){return true;}
            else if ((cislo > v) && (pravy != null)){return (pravy.obsahuje(cislo));}
            else if ((cislo < v) && (levy != null)){return (levy.obsahuje(cislo));}}
        return false; }//když číslo není ve stromě
    /**
     * Minimum a maximum stromu
     */
    public int min(){ // nachází se v nejlevější části stromu
        if (levy == null){ //když je null tak minimum je hodnota kde se nacházím
            return getV();}
        else {return levy.min();} }//když není, tak je hodnota v levém podstromu
    public int max(){ //opak minima
        if (pravy == null){
            return getV();} 
        else {return pravy.max();} }
    /**
     * hloubka = h - nejdelší cesta stromu
     */ 
   [b] public int hloubka(){ [/b]
        //myšlenka:
        //když levý (l) má hodnotu, tak přejdeme do l a počitadlo zvětšíme o jednotku, když nemá levý hodnotu, ptáme se na pravý
        //když má hodnotu, přejdeme do pravého a zase se ptáme jako první na levý, ten nemá hodnotu, pravý taky ne, tak máme nějaký počet kroků 
        //jsou li počty kroků větší než uložená hloubka, uložíme do hloubky (přičtením? / nahrazením?)
        //vracíme se na začátek, nejprve byl dotaz na levý, ted se zeptá napravý a provede to samé - to je jasná rekurze s podmínkou že levý i pravý je null konči
        //respektive vrať se kde ses nezeptal na pravý
        if (levy !=null) {pKrok++; levy.hloubka();} else if (pravy != null) {pKrok++; pravy.hloubka();} //tady jsou oba už null
        h = Math.max(h, pKrok);
        return h;    }

    [b]public void zrusPodstrom (int cislo){[/b]
        if (obsahuje(cislo) == false) {System.out.println("Číslo není ve stromě");}
        if (levy != null) {if (levy.getV() == cislo) levy = null;}
        else if (pravy != null) {if (pravy.getV() == cislo) pravy = null;} 
        else if ((cislo > klic)&&(pravy != null)&&(levy != null)) {pravy.zrusPodstrom(cislo);} 
else {levy.zrusPodstrom(cislo);}

        //myšlenka:
        //když je levý roven číslu, nastaví se na null, pokud tomu tak není, otestuje se pravý, pokud ani to, zjistíme do jaké větve stromu máme přejít a zopakujeme 
        //metodu pro zvolenou větev - výsledek? má být že zruší hodnotu nastavením null, ale důsledek je, že zruší vše ve větvi této hodnoty - proto nápad:
        //najdeme hodnotu a (vypíšeme strom hodnot) uložíme si hodnoty podstromu a "nahrajeme" je zpátky do stromu pomocí zapisovací metody, 
        //prvek se zruší, hodnoty budou stále zachovány,změní se případně hloubka stromu protože čísla která si uložíme výpisem jsou uspořádána 
        //(leda zapisovat s náhodným výběrem ze seznamu)
    }
    /**
     * getter - vrátí hodnotu vrcholu 
     */
    public int getV(){
        return klic;}
    public void tiskPrvnihoVrcholu() {//tisk kořene/začátku
        System.out.print(klic+" ");}
}

Offline

 

#2 13. 07. 2016 23:06

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Binární strom Java

Pokud jsou levy i pravy null, je hloubka 1.
Pokud ani jeden není null, je hloubka Math.max(levy.hloubka(),pravy.hloubka())+1.
Zbývají dva případy, které by měly být snadné.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson