Vypočítat hloubku binárního vyhledávacího stromu?

hlasů
0

Mám potíže výpočtu součtu hloubek [součet jednotlivých hloubkách u všech dětí root] pro daný BST. Mám celkový počet uzlů na stromě, a já jsem se snaží vypočítat průměrnou hloubku pro stromu, vyžadující mám tuto hloubku částku.

Rekurze a nemyslím si spolu velmi dobře .. zjišťuji tento problém velmi obtížné. Já bych si přál, aby rekurzivní řešení, i když, pokud je to možné.

POZNÁMKA:

Vytvořil jsem přístupové Node.getLeft () a Node.getRight ()

Položena 09/12/2009 v 21:03
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Přemýšlet o tom, jak byste jít o to canonically ručně kdybych předložil obraz BST vás na jeden list papíru. Když jste v uzlu, jaké informace je třeba sledovat? Jak se dá zjistit výšku daného uzlu?

Odtud se snaží přeložit do pseudokódu nebo dokonce přímo do Javy. Máte-li potíže, neváhejte se vyjádřit, takže uživatelé vám může pomoci ven.

Odpovězeno 09/12/2009 v 21:08
zdroj uživatelem

hlasů
4

Je pouze potřeba, aby se počítadlo hloubky, jak jste procházet strom (vzhlížet strom traversals pokud máte) a přidá se hodnota čítače pokaždé, když se dostala do uzlu. Pak už stačí jen vydělit počtem uzlů.

Vypadá to jako domácí úkol, takže nebudu poskytovat podrobnější řešení.

Odpovězeno 09/12/2009 v 21:09
zdroj uživatelem

hlasů
0

Je to domácí úkol? Pokud tomu tak je označit otázku jako takové.

Dalo by se vytvořit metodu, která:

  • má referenční uzel a hloubku jako argumenty
  • přírůstek hloubky
  • pokud uzel není uzel volání dítě rekurzivně pro levou a pravou a aktualizace sumu odpovídajícím
  • jinak návrat součet + hloubka

Jakmile budete mít toto rozdělit podle počtu dětí ve stromu získat průměrnou hloubku.

Odpovězeno 09/12/2009 v 21:10
zdroj uživatelem

hlasů
0

Musíme navštívit všechny koncové uzly a zjistit, jak hluboké jsou. To naznačuje:

Dát vaše funkce uzlů návštěvě zvláštní argument. Je třeba vědět, ne právě tam, kde to jde, ale i to, jak je hluboká. Pokaždé, když se to jmenuje, je to jen o jít hlouběji, takže uzel návštěvník prostě musí zvýšit počet hloubku to dostal od volajícího.

Nyní jeden ze 2 věcí se může stát:

  • Buď uzel jste našli je koncový uzel, to znamená, že nemá žádné děti; V tomto případě si návštěvník potřebuje vrátit svou hloubku volajícímu. Jo, to prostě vrátí číslo, které dostal od volajícího, + 1.

  • nebo to není koncový uzel. V takovém případě se bude muset buď 1, nebo 2 děti. Musíme dostat ty hloubky zprávy z našich dětí zpět do volající, takže stačí vrátit součet hloubek vrácených dětí.

Kouzlem rekurze, počet vrátil ke kořeni se návštěvník bude součet hloubky všech dětí.

Chcete-li získat průměrnou hloubku, budete chtít, aby to rozdělit podle počtu listových uzlů; který bych odjet na druhý průchod pro výpočet. Mohlo by to být provedeno v jednom, ale to by bylo trochu složitější.

Odpovězeno 09/12/2009 v 21:26
zdroj uživatelem

hlasů
0

Protože se jedná o domácí, nechci jen dát odpověď. Místo toho, tady je rekurzivní způsob, jak vypočítat délku jednotlivě propojeného seznamu. Doufejme, že to bude demonstrovat rekurzi takovým způsobem, abyste porozuměli, a můžete extrapolovat odtamtud vyřešit váš problém BST.

public final class LL {
    public final int value;
    public LL next;

    public LL(final int value) {
        this.value = value;
    }

    public void add(final int value) {
        if (null == next) {
            next = new LL(value);
        } else {
            next.add(value);
        }
    }

    /**
     * Calculate the length of the linked list with this node as its head (includes this node in the count).
     *
     * @return the length.
     */
    public int length() {
        if (null == next) {
            return 1;
        }
        return 1 + next.length();
    }

    public static void main(final String... args) {
        final LL head = new LL(1);
        head.add(2);
        head.add(3);
        System.out.println(head.length());
        System.out.println(head.next.length());
    }
}
Odpovězeno 09/12/2009 v 21:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more