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
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ý
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
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é.
Offline