vind de kleinste diepte leaf node in bst

stemmen
1

Noodzaak om het blad knooppunt dat minimale diepte heeft te krijgen. Ik kan niet denken aan een goede manier om het te doen zonder op te slaan aanvullende informatie in elk knooppunt, dan kunt u suggereren, hartelijk dank.

De vraag is gesteld op 04/11/2011 om 01:03
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

De brute force oplossing een breedte-eerst zoeken eindigt bij het eerste blad gevonden, zal deze eenvoudiger te implementeren dan iteratief recursief zijn.

Zie bijvoorbeeld de pseudo-code in mijn antwoord op "Breedte First Vs Depth First" voegt u een andere voorwaarde aan de while-loop.

Tussen haakjes - Dit krijg je een blad met de minimale diepte, omdat er meer dan één op die diepte kan zijn. Het verkrijgen van de volledige set van minimale diepte bladeren is een beetje harder. Ik denk dat gaan met een iteratieve verdieping strategie .


Uitzoeken wat niveau dat knooppunt is één.

Er zijn drie mogelijkheden:

Vind het knooppunt eerste en de zoektocht naar beneden de boom voor. Het klinkt verkwistend, maar dat tweede onderzoek vereist een bezoek aan slechts zoveel knooppunten als het niveau, dus het is echt snel.

Als alternatief kun je bijhouden als je gaat. U gebruikt drie tellers levelCounter, thisLevelCounteren nextLevelCounter. Elke keer als je meer om een nieuw knooppunt dat u te verlagen thisLevelCounter, en als het hits nul heb je een niveau omlaag verplaatst doen

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Elke keer als je een kind knooppunt toe te voegen aan de lijst met zoekresultaten, verhogen nextLevelCounter. Elke keer dat u op te slaan een nieuwe onderliggende node incrementnextLevelCounter

Ten slotte is de iteratieve verdieping strategie geeft u het succes niveau voor gratis (die iteratie vindt het ...) en heeft dezelfde orde van prestaties (hoewel een iets hogere multiplier) als de breedte eerste zoekopdracht.

antwoordde op 04/11/2011 om 01:06
bron van user

stemmen
0

Hier code versie (hoop dat ik een fout controle niet missen):

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);
}
antwoordde op 25/03/2013 om 09:31
bron van user

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