Problem s metodou vloz u binarneho stromu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problem s metodou vloz u binarneho stromu – Java – Fórum – Programujte.comProblem s metodou vloz u binarneho stromu – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Fil
~ Anonymní uživatel
38 příspěvků
5. 5. 2012   #1
-
0
-

Mam problem s metodou vloz. Tuto metodu volam z inej triedy a vlozenie prveho prvku (korena bin. stromu je ok), ale ked vkladam dalsi prvok tak sa nieak zahadne do korena stromu vlozi ten novy prvok a teda porovnavacie metody porovnavaju 2 rovnake prvky a teda vratia 0. Takze vlastne vysledkom vlozenia napr. 10 prvkov je, ze ten posledny bude v koreni a ziadny iny v strome nieje.

 public void vloz(Object o) {

      
        if (binStrom.getKoren() == null) {
            binStrom.vlozKoren(o);
        } else {
            if (comp.compare(o, binStrom.zpristupniKoren()) < 0) {
                binStrom.setAktualni(binStrom.getKoren());
                binStrom.vlozLevyy(o);
            } else {
                if (comp.compare(o, binStrom.zpristupniKoren()) > 0) {
                    binStrom.setAktualni(binStrom.getKoren());
                    binStrom.vlozPravy(o);
                }
            }
        }
       
        jeHalda = false;
        size++;
    }

Nahlásit jako SPAM
IP: 90.180.32.–
Reklama
Reklama
Michal
~ Anonymní uživatel
624 příspěvků
5. 5. 2012   #2
-
0
-

protože porovnáváš jen s kořenem ... s tím se porovnává jen na začátku a pokud je prvek větší jde doprava a pokud menší jde doleva, takto porovnáváš tak dlouho dokud nenarazíš na místo kde je volno a tam vložíš ten prvek

Nahlásit jako SPAM
IP: 77.104.225.–
Fil
~ Anonymní uživatel
38 příspěvků
5. 5. 2012   #3
-
0
-

#2 Michal
No jasne, metody vlozLevy a vlozPravy postupne idu dole az kym nenajdu volne miesto. Ale problem je, ze sa mi prepisuje furt koren. 

Na zaciatku vlozim napr. 10, kedze koren je prazdny tak sa donho vlozi 10.

Vkladam druhy prvok, napr. 14. Podmienka binStrom.koren == null nieje splnena takze sa skoci na 

if (comp.compare(o, binStrom.zpristupniKoren()) < 0) {

ale v tejto chvili uz mam v koreni ulozene cislo 14. Jak to? A tym padom sa porovna o (14) a koren (14).

Nahlásit jako SPAM
IP: 90.180.32.–
Michal
~ Anonymní uživatel
624 příspěvků
6. 5. 2012   #4
-
0
-

bohužel s kódem který jsi sem napsal ti moc nepomohu .... možná sem dej ještě to vlozLevy alespoň ať vím co to dělá .... jinak metoda zpristupniKoren ti nenastavuje referenci aktualni na koren? Možná by jsi mohl více popsat co ty jednotlivé metody dělají ... takhle se totiž těžko odhaduje kde máš chybu

Když jsem kdysi řešil binární strom tak jsem měl metody vlozLevy a vlozPravy jen čistě na vložení prvku na levou nebo pravou pozici a ne na projití až na konec. Mohu klidně přidat svůj kód jestli ho tedy ještě najdu.

Nahlásit jako SPAM
IP: 77.104.225.–
Fil
~ Anonymní uživatel
38 příspěvků
6. 5. 2012   #5
-
0
-

#4 Michal
Po stisku tlacitka sa vykona   seznam = Generovani.generuj(poc);

generuj mimo ine zavola seznam.vlozXX(xx);

vlozXX vola  halda.vloz(xx);

a toto zavola uvedenu metodu

public void vlozKoren(Object item) {
        if (koren == null) {
            Node novy = new Node();
            novy.setData(item);
            koren = novy;
            aktualni = koren;
        }
    }

public void vlozPravy(Object item) {
        if (aktualni.getRight() == null) {
            Node novy = new Node();
            novy.setData(item);
            aktualni.right = novy;
            novy.parent = aktualni;
        } else {
            aktualni = aktualni.right;
            if (comp.compare(item, aktualni) == 0) {
            } else {
                if (comp.compare(item, aktualni) < 0) {
                    vlozLevyy(item);
                } else {
                    if (comp.compare(item, aktualni) > 0) {
                        vlozPravy(item);
                    }
                }
            }
        }
    }

vlozLevy je podobne

zpristupni koren len vrati data :

public Object zpristupniKoren() {
        return koren.getData();
    }

Nikde mimo to vlozKoren s korenom nemanipuluje tak prave nechapem ako je mozne, ze sa prepise...

Nahlásit jako SPAM
IP: 90.180.32.–
Michal
~ Anonymní uživatel
624 příspěvků
6. 5. 2012   #6
-
0
-

takto to vypadá že by to mohlo fungovat ... osobně nemám moc rád rekurzi, ale proč ne. Co mohu doporučit a pomocí čeho jsem vyřešil velkou část chyb je debug .... hoď si tam breakpointy a sleduj jak se ti to tam vkládá a co se ti přepisuje. Jinak by mohla být chyba třeba i v porovnávání, což ale neřeší problém s přepisováním kořene, nebo i ve výpise, jestli procházíš strom přes vlastní iterator.... jinak mě trochu zaráží proč máš tedy zpřístupniKoren() a getKoren() když tyto metody by měli v podstatě dělat to samé :)

Nahlásit jako SPAM
IP: 77.104.225.–
Michal
~ Anonymní uživatel
624 příspěvků
6. 5. 2012   #7
-
0
-

co se týče zpřístupniKoren a getKoren tak už vidím ten rozdíl :) ...jsem si toho nevšiml hned

Nahlásit jako SPAM
IP: 77.104.225.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 31 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý