megtalálni a legkisebb mélység levél csomópont BST

szavazat
1

Kell, hogy a levél csomópont, amely minimális mélysége. Nem tudok egy jó módja annak, hogy csinálni anélkül, további információk, az egyes csomópontok, kérjük azt sugallják, köszönöm szépen.

A kérdést 04/11/2011 01:03
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
2

A brute force megoldás egy szélességi keresést végződő első levél találtam, ez könnyebb lesz végrehajtani iteratív mint rekurzív.

Lásd például az ál-kódot a válaszom „szélességi bejárás Vs Mélység” Először csak egy újabb feltételt a while-loop.

BTW - Ez lesz a levél a minimális mélység, mert előfordulhat, hogy egynél több ilyen mélységben. Ismerkedés a teljes készlet minimális mélysége levelek egy kicsit nehezebb. Azt hiszem, megy egy iteratív mélyülő stratégiát .


Kideríteni, hogy milyen szintet a csomópont egy.

Három lehetőség közül választhat:

Keresse meg a csomópont első és a keresési le a fát érte. Úgy hangzik, pazarló, de ez a második kereső igényel látogató csak annyi csomópont a szint, így igazán gyors.

Másik megoldás lehet nyomon követni, ahogy megy. Használja három számlálók levelCounter, thisLevelCounterés nextLevelCounter. Minden alkalommal, amikor több új csomópontot csökkentéséhez thisLevelCounter, és amikor eléri a nullát, ha elköltözött Egy szinttel lejjebb, így nem

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Minden alkalommal, amikor egy gyermek csomópont a keresési listán, megnöveljük nextLevelCounter. Minden alkalommal, amikor tárolja az új gyermek csomópont növekménynextLevelCounter

Végül az iteratív mélyítése stratégia adja a siker szintjét ingyen (ami iteráció találja ...), és ugyanabban a sorrendben a teljesítmény (bár kissé magasabb szorzó), mint a szélessége első keresést.

Válaszolt 04/11/2011 01:06
a forrás felhasználó

szavazat
0

Itt kódváltozaton (remélem nem marad ki semmilyen hiba ellenőrzés):

void min_leaf(node_t *t, int *min, int lev, node_t **n) {
    if (!t) {
            return;
    }   

    if (lev > *min) {
            printf("Back from %d at lev %d, min: %d already found\n",
                            t->key,
                            lev,
                            *min);
            return;
    }   

    if (!t->left && !t->right) {
            if (*min > lev) {
                    *min = lev;
                    *n = t;
            }   
    } else {
            min_leaf(t->left, min, lev+1, n); 
            min_leaf(t->right, min, lev+1, n); 
    }   
}

void bst_print_min_leaf(bst_t* bst) {
    int min = 10000; /* Replace it with some really large number */
    node_t *minn = NULL;

    min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
    if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}
Válaszolt 25/03/2013 09:31
a forrás felhasználó

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