Se calculează adâncimea unui arbore binar de căutare?

voturi
0

Am dificultăți de calcul însumarea adâncimi [suma adâncimile individuale pentru toți copiii din rădăcină] pentru un anumit BST. Am numărul total de noduri de copac, și am încercat să calculeze adâncimea medie pentru copac, care necesită am această sumă adâncime.

Recursivitatea si eu nu inteleg foarte bine .. am constatat această problemă foarte dificilă. Aș dori să văd o soluție recursiv, deși, dacă este posibil.

NOTĂ:

Am creat Node.getLeft Conturi cu acces () și Node.getRight ()

Întrebat 09/12/2009 la 21:03
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
2

Gândiți-vă cum ar merge despre acest canonicește de mână dacă am prezentat o imagine a unui BST pentru a vă pe o foaie de hârtie. Când sunteți la un nod, ce informații aveți nevoie pentru a ține evidența? Cum se poate găsi înălțimea unui nod dat?

De aici, încearcă să traducă acest lucru în pseudocod sau chiar direct în Java. Dacă întâmpinați probleme, nu ezitați să comenteze astfel încât utilizatorii să vă poată ajuta.

Publicat 09/12/2009 la 21:08
sursa de către utilizator

voturi
4

Trebuie doar să păstrați un contor de adâncime în timp ce traversa copac (privi în sus traversări de copac, dacă aveți la) și se adaugă valoarea contorului de fiecare dată când ajunge la un nod. Apoi, împărțiți de numărul de noduri.

Acest lucru arata ca temele, așa că nu am oferi o soluție mai detaliată.

Publicat 09/12/2009 la 21:09
sursa de către utilizator

voturi
0

Este aceasta tema? În acest caz etichetați problema ca atare.

Ai putea crea o metodă care:

  • are o referință nod și o adâncime ca argumente
  • adâncime de creștere
  • în cazul în care nodul nu este un apel nod copil recursiv pentru suma stânga și dreapta și actualizarea în consecință
  • în caz contrar reveni suma + adancime

Odată ce aveți acest lucru de numărul împărți copiilor în copac pentru a obține adâncimea medie.

Publicat 09/12/2009 la 21:10
sursa de către utilizator

voturi
0

Avem nevoie pentru a vizita toate nodurile frunză și dau seama cât de adânc sunt. Aceasta sugerează:

Dă-funcția de a vizita nod un argument în plus. Ea trebuie să știe nu doar în cazul în care se întâmplă, dar, de asemenea, cât de adâncă este. De fiecare dată când este numit, este chemat să meargă mai adânc, astfel încât vizitatorul nod are doar pentru a incrementat numărul de adâncime luat-o de la apelant.

Acum, unul din 2 lucruri se poate intampla:

  • Fie nodul ați găsit este un nod frunză, adică nu are copii; în acest caz, vizitatorul trebuie să se întoarcă adâncimea sa apelantului. Da, returnează doar numărul luat-o de la apelant, + 1.

  • sau nu este un nod frunză. În acest caz, va avea 1 sau 2 copii. Avem nevoie pentru a obține aceste rapoarte adâncime de la copiii noștri înapoi până la apelantului, astfel încât doar să se întoarcă suma adâncimilor returnate de copii.

Prin magia recursivitatii, numărul vizitatorilor a revenit la rădăcina lui va fi suma adâncimilor tuturor copiilor.

Pentru a obține o adâncime medie, veți dori să împartă acest lucru prin numărul de noduri frunze; pe care l-ar părăsi la un al doilea traversal pentru a calcula. Ar putea fi realizat într-o singură, dar ar fi un pic mai complicat.

Publicat 09/12/2009 la 21:26
sursa de către utilizator

voturi
0

Din moment ce acest lucru este temele, nu vreau să vă dau doar un răspuns. În schimb, aici e un mod recursiv pentru a calcula lungimea unei liste individual legat. Să sperăm că acest lucru va demonstra recursie într-un mod puteți înțelege, și puteți extrapola de acolo pentru a rezolva problema 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());
    }
}
Publicat 09/12/2009 la 21:57
sursa de către utilizator

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